From b8341af8fc265b1f5aeb9210bea2cfbf0ffb8c9f Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:18:26 -0400 Subject: [PATCH 01/24] docs: design spec for O3DE, Unreal Engine 5.8, and Unigine (#73, #70, #67) --- ...-01-new-apps-o3de-unreal-unigine-design.md | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-01-new-apps-o3de-unreal-unigine-design.md diff --git a/docs/superpowers/specs/2026-07-01-new-apps-o3de-unreal-unigine-design.md b/docs/superpowers/specs/2026-07-01-new-apps-o3de-unreal-unigine-design.md new file mode 100644 index 0000000..86065ae --- /dev/null +++ b/docs/superpowers/specs/2026-07-01-new-apps-o3de-unreal-unigine-design.md @@ -0,0 +1,177 @@ +# Design: add O3DE, Unreal Engine 5.8, and Unigine + +Date: 2026-07-01 +Issues: #73 (Open 3D Engine), #70 (Unreal Engine 5.8), #67 (Unigine) +Branch: `feat/new-apps-o3de-unreal-unigine` (off `main`) + +## Goal + +Add three game engines to the installer catalog, following the bespoke +per-app install-type pattern already used by `resolve`, `3dcoat`, +`jangafx`, and `gaffer`. Introduce one new shared UI mechanism: a BETA +badge for pre-release or experimental apps. + +Decisions already made during brainstorming: + +- One combined branch for all three apps (like PR #65). +- Bespoke install types per app; no generic "copr" or "archive" type (YAGNI). +- BETA badge is a reusable flag; applied to O3DE and Unreal 5.8. +- O3DE auto-detects the latest versioned major from the COPR at install time. +- Unigine installs to `/opt/unigine` via the root helper, then chowns to the + invoking user. +- No per-app `arch` field. PR #71 (arch gating) was closed intentionally per + the maintainer's decision on issue #68; this design follows that decision. +- Unreal and Unigine run on EL9 and EL10: omit the `el` field (existing + convention). O3DE is EL10-only (hard constraint: the COPR only has a + `centos-stream-10-x86_64` chroot). + +## Surfaces touched + +Mirrors PR #65: + +- `src/almalinux-creative-installer` (APPS entries, BETA pill, detection, + guided flows, subtitles) +- `src/almalinux-creative-installer-helper` (install/remove functions, + dispatch table) +- `README.md` and `docs/index.html` (app list updates) +- `src/icons/apps/` (three new icon PNGs) +- `src/packaging/build-rpm.sh` if the icon file list is explicit + +## 1. BETA pill (shared mechanism) + +- New optional app field `"beta": True`. +- Rendered as a small pill next to the app name in the list row, built the + same way as the existing EL chip but amber-tinted, text `BETA`, tooltip + "Pre-release / experimental build". +- Applied to O3DE (experimental EL10 COPR) and Unreal 5.8 (preview-1 build). + +## 2. Open 3D Engine (`type: "o3de"`) + +App entry: category "Game Engines", `"el": [10]`, `"beta": True`. + +COPR facts (verified via the COPR API on 2026-07-01): + +- Project: `hellaenergy/o3de`, maintained by a Red Hat employee. +- Chroots: `fedora-rawhide-x86_64`, `fedora-44-x86_64`, + `centos-stream-10-x86_64`. No EL9, no epel-10 chroot. +- Packages use versioned-major naming: `o3deNNNN` where NNNN is YYMM + (currently `o3de2605`). Majors are co-installable under + `/opt/O3DE//`. There is no unversioned `o3de` package. +- An `o3de-dependencies` repo auto-enables alongside the main repo. + +Helper `install_o3de`: + +1. `dnf copr enable -y hellaenergy/o3de centos-stream-10-x86_64`. The + explicit chroot argument is required: a bare `copr enable` on + AlmaLinux 10 resolves to an epel-10 chroot that does not exist in this + project. +2. Auto-detect the latest major: `dnf repoquery` for package names matching + `o3de[0-9][0-9][0-9][0-9]`, sort, take the highest. +3. `dnf install -y` the detected package. + +Helper `remove_o3de`: remove all installed `o3de[0-9]*` packages, then +`dnf copr remove hellaenergy/o3de`. + +GUI detection: `rpm -qa` glob for `o3de[0-9]*` (no root needed). +Subtitle: "Installed via COPR (hellaenergy/o3de), latest release line". + +## 3. Unreal Engine 5.8 (`type: "unreal"`) + +App entry: category "Game Engines", no `el` field, `"beta": True`. + +Guided install, 3DCoat-style: + +1. Install opens https://www.unrealengine.com/linux (Epic account required + for the download; account creation is the user's step). +2. User downloads `Linux_Unreal_Engine_5.8.0_preview-1.zip` and picks it in + a file dialog (filter `*.zip`). +3. Helper `install_unreal `: + - Validate the path (same checks as `install_local_file`). + - Unzip to `/opt/unreal-engine/`. + - `chown -R` to the invoking user (the editor writes into its own tree: + DerivedDataCache, Intermediate; resolved via the existing PKEXEC_UID + logic). + - Write a desktop entry in `/usr/share/applications` pointing at + `Engine/Binaries/Linux/UnrealEditor`. + - Install the shipped icon into hicolor. + +GUI detection: `/opt/unreal-engine` exists. +Remove: delete the tree, the desktop file, and the icon. +Subtitle: "Guided install: log in to Epic → download Linux zip → pick it +(EL9 and EL10)". + +## 4. Unigine (`type: "unigine"`) + +App entry: category "Game Engines", no `el` field, no beta flag. + +Vendor installer quirks (from issue #67): + +- The `.run` filename changes with each version. +- It shows an EULA in the terminal that the user must read and agree to. +- It creates the Browser (launcher) folder next to the `.run` file itself. +- It writes a `.desktop` entry with no name and no icon. +- Account creation happens inside the Browser app after install, per vendor + policy. + +Guided install with an EULA gate: + +1. GUI shows an EULA consent dialog first: link to Unigine's EULA and an + explicit "I agree" button. This satisfies "the user should be able to + read and agree to it" because the root helper runs non-interactively + under pkexec. +2. GUI opens https://developer.unigine.com/en/downloads; user picks the + downloaded `.run` in a file dialog (filter `*.run`). +3. Helper `install_unigine `: + - Validate the path. + - Copy the `.run` into `/opt/unigine/` and execute it there with + auto-accept, so the Browser folder is created under `/opt/unigine`. + - `chown -R` to the invoking user so the Browser can self-update. + - Write our own desktop entry (with Name and our shipped icon) in + `/usr/share/applications`. The vendor entry lands nameless in root's + home under pkexec and is discarded. + - Log a post-install note: create the Unigine account inside the + Browser app. + +Implementation-time verification item: the exact auto-accept mechanism for +the `.run` (a flag vs piped input) must be tested against the real +installer before the PR is finalized. + +GUI detection: `/opt/unigine` exists and is non-empty. +Remove: delete the tree, the desktop file, and the icon. +Subtitle: "Guided install: agree to EULA → download .run → installs Browser +to /opt/unigine". + +## 5. Icons + +Ship three PNGs in `src/icons/apps/` following the existing naming +pattern, sourced from official project artwork: + +- O3DE (o3de.org press kit) +- Unreal Engine (Epic branding asset) +- Unigine (vendor logo) + +The list UI falls back to the colored-letter badge if a PNG is missing, so +icons are non-blocking. + +## 6. Error handling + +- O3DE: if `copr enable` or the repoquery finds no `o3deNNNN` package, + fail with a clear log line (repo unreachable or chroot missing) rather + than installing nothing silently. +- Unreal: reject non-zip picks; unzip failures leave no partial + `/opt/unreal-engine` (extract to a temp dir, move into place). +- Unigine: if the `.run` exits nonzero, remove the partial + `/opt/unigine` and report the exit code. + +## 7. Testing and review gates + +- O3DE: verify COPR enable + repoquery + install in an EL10 container. +- Unreal and Unigine: manual smoke test of the guided flows where + feasible; at minimum, dry-run the helper functions with a dummy archive. +- Before the PR: + 1. Code-review pass against current architecture (helper dispatch table, + badge rendering, EL gating, packaging file lists). + 2. `/security-review` on the branch. Sensitive spots are all in the root + helper: COPR enable, archive extraction to `/opt` (zip-slip, path + validation on user-picked files), `chown -R`, and executing a + user-supplied `.run` as root. From 5cac5e29537be96295b99b7fc4a8a7bebcd07dee Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:28:38 -0400 Subject: [PATCH 02/24] docs: implementation plan for O3DE, Unreal Engine 5.8, and Unigine --- ...2026-07-01-new-apps-o3de-unreal-unigine.md | 948 ++++++++++++++++++ 1 file changed, 948 insertions(+) create mode 100644 docs/superpowers/plans/2026-07-01-new-apps-o3de-unreal-unigine.md diff --git a/docs/superpowers/plans/2026-07-01-new-apps-o3de-unreal-unigine.md b/docs/superpowers/plans/2026-07-01-new-apps-o3de-unreal-unigine.md new file mode 100644 index 0000000..b5601a4 --- /dev/null +++ b/docs/superpowers/plans/2026-07-01-new-apps-o3de-unreal-unigine.md @@ -0,0 +1,948 @@ +# New Apps (O3DE, Unreal Engine 5.8, Unigine) Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add three game engines to the installer catalog (Open 3D Engine via COPR, Unreal Engine 5.8 and Unigine via guided installs) plus a reusable BETA badge. + +**Architecture:** Each app gets a bespoke install type in the single-file PyQt GUI (`src/almalinux-creative-installer`) and matching `install_` / `remove_` functions in the root helper (`src/almalinux-creative-installer-helper`), exactly like the existing `resolve` / `3dcoat` / `jangafx` / `gaffer` types. The BETA badge is a new optional `"beta": True` app field rendered as a chip next to the app name, same construction as the existing EL chip. + +**Tech Stack:** Python 3 + PyQt5/PyQt6 (via `src/qtcompat.py`), Bash root helper dispatched over pkexec, dnf/COPR. + +**Spec:** `docs/superpowers/specs/2026-07-01-new-apps-o3de-unreal-unigine-design.md` + +## Global Constraints + +- No em dashes in prose (README, docs, comments, commit messages). Use periods, commas, colons, or parentheses. The `→` arrow in UI subtitle strings is an existing convention and is fine. +- No `Co-Authored-By` trailers on commits. +- Branch: `feat/new-apps-o3de-unreal-unigine` (already created, spec committed). +- Commit with explicit paths only (`git add `); a stray modified `.gitignore` exists in the working tree and must NOT be committed. +- No test suite exists in this repo. Every task's test cycle is: `python3 -m py_compile src/almalinux-creative-installer` for the GUI and `bash -n src/almalinux-creative-installer-helper` for the helper, plus the behavior probes given per task. Run them exactly as written. +- Qt idioms in this codebase (both PyQt5 and PyQt6 compatible): `QMessageBox.StandardButton.Ok`, `QMessageBox.ButtonRole.ActionRole`, `msg.exec()`, `msg.clickedButton()` compared with `==`. +- Desktop entries go in the invoking user's `~/.local/share/applications` (JangaFX/Gaffer convention), NOT `/usr/share/applications`. This deviates from the spec text on purpose: follow the codebase convention. +- Helper style: `set -euo pipefail` is active; every function logs via `log "..."`; user resolution via `require_invoking_user` / `require_invoking_user_home`. + +--- + +### Task 1: BETA chip + app entries + maintainer guide + +**Files:** +- Modify: `src/almalinux-creative-installer` (constants ~line 33, maintainer guide comment ~lines 41-54, `APPS` ~line 99, `_make_app_row` ~line 1095) + +**Interfaces:** +- Produces: app dicts with ids `"o3de"`, `"unreal"`, `"unigine"` and types of the same names; optional `"beta": True` field rendered as a chip. Later tasks wire buttons, subtitles, state, flows, and helper actions to these ids/types. + +- [ ] **Step 1: Add URL constants** + +In `src/almalinux-creative-installer`, directly after the `GAFFER_URL` line (line 33), add: + +```python +UNREAL_URL = "https://www.unrealengine.com/linux" +UNIGINE_URL = "https://developer.unigine.com/en/downloads" +UNIGINE_EULA_URL = "https://developer.unigine.com/en/eula" +``` + +(The EULA URL was verified live on 2026-07-01: HTTP 200.) + +- [ ] **Step 2: Update the maintainer guide comment** + +In the "HOW TO ADD / EDIT APPS" comment block, change line 45 from: + +```python +# 2) Pick a supported "type": dnf, flatpak, resolve, 3dcoat +``` + +to: + +```python +# 2) Pick a supported "type": dnf, flatpak, resolve, 3dcoat, o3de, unreal, unigine +``` + +and after the `"el"` bullet (line 52 ends `...both.`), add a new bullet before bullet 6: + +```python +# 5b) Optional: add "beta": True for pre-release or experimental apps. +# The row shows an amber BETA chip next to the app name. +``` + +- [ ] **Step 3: Add the three APPS entries** + +Insert after the `godots` entry (line 99), before `appimagelauncher`: + +```python + {"id": "o3de", "name": "Open 3D Engine", "type": "o3de", "icon_appid": "org.o3de.O3DE", "category": "Game Engines", "el": [10], "beta": True}, + {"id": "unreal", "name": "Unreal Engine 5.8","type": "unreal", "icon_appid": "com.epicgames.UnrealEngine", "category": "Game Engines", "beta": True}, + {"id": "unigine", "name": "Unigine", "type": "unigine", "icon_appid": "com.unigine.Browser", "category": "Game Engines"}, +``` + +Notes: `"el": [10]` on O3DE only (the COPR has only a `centos-stream-10-x86_64` chroot). Unreal and Unigine omit `el` (works on EL9 and EL10, existing convention). The `icon_appid` values match the PNG filenames Task 6 ships; if the PNGs are absent the UI falls back to a colored letter badge, which is acceptable. + +- [ ] **Step 4: Render the BETA chip** + +In `_make_app_row`, the EL chip block ends with `name_row.addWidget(el_chip)` followed by `name_row.addStretch()` (line 1096). Insert between them, at the same indent level as the `el_versions = app.get("el")` statement: + +```python + if app.get("beta"): + beta_chip = QLabel("BETA") + beta_chip.setStyleSheet( + "background: rgba(230,160,50,0.20); color: #d29a3d;" + " border-radius: 4px; padding: 1px 5px;" + " font-size: 10px; font-weight: 600;" + ) + beta_chip.setToolTip("Pre-release / experimental build") + name_row.addWidget(beta_chip) +``` + +The fixed amber (#d29a3d) reads on both the dark and light themes, mirroring how the EL chip uses one fixed rgba background. + +- [ ] **Step 5: Verify syntax** + +Run: `python3 -m py_compile src/almalinux-creative-installer && echo OK` +Expected: `OK` + +- [ ] **Step 6: Commit** + +```bash +git add src/almalinux-creative-installer +git commit -m "feat(ui): add BETA chip and catalog entries for O3DE, Unreal Engine 5.8, Unigine" +``` + +--- + +### Task 2: Open 3D Engine (GUI wiring + helper) + +**Files:** +- Modify: `src/almalinux-creative-installer` (button wiring ~line 1159, `_subtitle_for_app` ~line 1213, `refresh_app_state` ~line 1443, new methods after `remove_gaffer_flow` ~line 2358) +- Modify: `src/almalinux-creative-installer-helper` (new functions after `remove_3dcoat` ~line 871, dispatcher ~line 922, usage text ~line 934) + +**Interfaces:** +- Consumes: app id `"o3de"` / type `"o3de"` from Task 1; existing `run_helper_with_callback(args, on_success, app_id, progress_segment)`, `set_app_busy`, `_set_app_progress_fraction`, `_finish_app_action`, `_set_status_badge`. +- Produces: GUI methods `_o3de_installed()`, `install_o3de_flow()`, `remove_o3de_flow()`; helper actions `install_o3de` (no args), `remove_o3de` (no args). + +- [ ] **Step 1: Wire the row buttons** + +In `_make_app_row`, after the `elif app["type"] == "gaffer":` block (line 1159), add: + +```python + elif app["type"] == "o3de": + install_btn.clicked.connect(lambda: self.install_o3de_flow()) + remove_btn.clicked.connect(lambda: self.remove_o3de_flow()) +``` + +- [ ] **Step 2: Add the subtitle** + +In `_subtitle_for_app`, after the `gaffer` case (line 1213), add: + +```python + if app["type"] == "o3de": + return "Installed via COPR (hellaenergy/o3de), latest release line" +``` + +- [ ] **Step 3: Add the state branch** + +In `refresh_app_state`, after the `gaffer` branch (ends line 1443), add: + +```python + if app["type"] == "o3de": + installed = self._o3de_installed() + self._set_status_badge(w["status"], "Installed" if installed else "Not installed", + "installed" if installed else "missing") + w["install"].setEnabled(not installed) + w["remove"].setEnabled(installed) + return +``` + +("Not installed"/"missing" rather than "Guided install"/"available": O3DE is a one-click dnf-style install, not a guided flow.) + +- [ ] **Step 4: Add detection and flows** + +After `remove_gaffer_flow` (line 2358), before the `_THEME_COLORS` module globals, add: + +```python + + def _o3de_installed(self): + out = subprocess.run( + ["rpm", "-qa", "--qf", "%{NAME}\n", "o3de*"], + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, + ).stdout + return any(re.fullmatch(r"o3de\d{4}", line.strip()) for line in out.splitlines()) + + def install_o3de_flow(self): + self.set_app_busy("o3de", True, "Installing…") + self._set_app_progress_fraction("o3de", 0.02) + self.run_helper_with_callback( + ["install_o3de"], + on_success=lambda: self._finish_app_action("o3de"), + app_id="o3de", + progress_segment=(0.02, 0.98), + ) + + def remove_o3de_flow(self): + if not self._o3de_installed(): + self.append_log("ℹ️ Open 3D Engine does not appear to be installed.\n") + self.refresh_app_state("o3de") + return + reply = QMessageBox.question( + self, "Uninstall Open 3D Engine?", + "This will remove all installed o3de packages and disable the hellaenergy/o3de COPR repo.", + QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel, + ) + if reply != QMessageBox.StandardButton.Ok: + return + self.set_app_busy("o3de", True, "Removing…") + self._set_app_progress_fraction("o3de", 0.02) + self.run_helper_with_callback( + ["remove_o3de"], + on_success=lambda: self._finish_app_action("o3de"), + app_id="o3de", + progress_segment=(0.02, 0.98), + ) +``` + +(`re` and `subprocess` are already imported at module top.) + +- [ ] **Step 5: Add the helper functions** + +In `src/almalinux-creative-installer-helper`, after `remove_3dcoat` (line 871), before the Dispatcher comment, add: + +```bash +# ------------------------------------------------- +# Open 3D Engine (COPR) +# ------------------------------------------------- +O3DE_COPR="hellaenergy/o3de" +# The COPR publishes EL builds only for the centos-stream-10 chroot; a bare +# "copr enable" on AlmaLinux 10 would look for epel-10, which does not exist +# in this project, so the chroot must be passed explicitly. +O3DE_COPR_CHROOT="centos-stream-10-x86_64" + +install_o3de() { + log "Ensuring dnf copr plugin..." + dnf -y install 'dnf-command(copr)' + + log "Enabling COPR ${O3DE_COPR} (chroot ${O3DE_COPR_CHROOT})..." + dnf -y copr enable "${O3DE_COPR}" "${O3DE_COPR_CHROOT}" + + # Packages use versioned-major naming (o3deNNNN, NNNN = YYMM). Majors are + # co-installable; install the newest release line. + log "Detecting the latest Open 3D Engine release line..." + local latest + latest="$(dnf -q repoquery --qf '%{name}\n' 'o3de[0-9][0-9][0-9][0-9]' 2>/dev/null \ + | grep -E '^o3de[0-9]{4}$' | sort -u -V | tail -1 || true)" + if [[ -z "${latest}" ]]; then + echo "ERROR: no o3deNNNN package found in ${O3DE_COPR} (repo unreachable or chroot missing)." >&2 + exit 4 + fi + + log "Installing ${latest}..." + dnf -y install "${latest}" + log "Open 3D Engine installed (${latest})." +} + +remove_o3de() { + log "Removing Open 3D Engine packages..." + local pkgs + mapfile -t pkgs < <(rpm -qa --qf '%{NAME}\n' 'o3de*' | grep -E '^o3de[0-9]{4}(-devel)?$' || true) + if (( ${#pkgs[@]} )); then + dnf -y remove "${pkgs[@]}" + else + log "No o3de packages installed." + fi + + log "Disabling COPR ${O3DE_COPR}..." + dnf -y copr remove "${O3DE_COPR}" || true + log "Open 3D Engine removed." +} +``` + +- [ ] **Step 6: Register in the dispatcher and usage text** + +In the dispatcher `case` block, after the Gaffer pair (line 922), add: + +```bash + # Open 3D Engine + install_o3de) install_o3de;; + remove_o3de) remove_o3de;; +``` + +In the usage heredoc at the bottom of the file, after the Gaffer action lines, add exactly: + +``` + install_o3de + remove_o3de +``` + +- [ ] **Step 7: Verify syntax** + +Run: `python3 -m py_compile src/almalinux-creative-installer && bash -n src/almalinux-creative-installer-helper && echo OK` +Expected: `OK` + +Also run shellcheck if available (non-blocking): +`shellcheck -x src/almalinux-creative-installer-helper || true` + +- [ ] **Step 8: Commit** + +```bash +git add src/almalinux-creative-installer src/almalinux-creative-installer-helper +git commit -m "feat(o3de): install Open 3D Engine from the hellaenergy COPR, latest release line (closes #73)" +``` + +--- + +### Task 3: Unreal Engine 5.8 (GUI wiring + helper) + +**Files:** +- Modify: `src/almalinux-creative-installer` (button wiring, subtitle, state branch, flows; same anchor points as Task 2) +- Modify: `src/almalinux-creative-installer-helper` (new functions + dispatcher + usage) + +**Interfaces:** +- Consumes: app id `"unreal"` / type `"unreal"`, `UNREAL_URL` from Task 1; same GUI helpers as Task 2. +- Produces: GUI methods `_unreal_installed()`, `install_unreal_flow()`, `pick_unreal_zip()`, `remove_unreal_flow()`; helper actions `install_unreal `, `remove_unreal`. + +- [ ] **Step 1: Wire the row buttons** + +After the `o3de` elif added in Task 2: + +```python + elif app["type"] == "unreal": + install_btn.clicked.connect(lambda: self.install_unreal_flow()) + remove_btn.clicked.connect(lambda: self.remove_unreal_flow()) +``` + +- [ ] **Step 2: Add the subtitle** + +After the `o3de` subtitle case: + +```python + if app["type"] == "unreal": + return "Guided install: log in to Epic → download Linux zip → extracts to /opt/unreal-engine (EL9 and EL10)" +``` + +- [ ] **Step 3: Add the state branch** + +After the `o3de` branch in `refresh_app_state`: + +```python + if app["type"] == "unreal": + installed = self._unreal_installed() + self._set_status_badge(w["status"], "Installed" if installed else "Guided install", + "installed" if installed else "available") + w["install"].setEnabled(not installed) + w["remove"].setEnabled(installed) + return +``` + +- [ ] **Step 4: Add detection and flows** + +After the `remove_o3de_flow` method added in Task 2: + +```python + + def _unreal_installed(self): + return Path("/opt/unreal-engine/Engine/Binaries/Linux/UnrealEditor").is_file() + + def install_unreal_flow(self): + self.set_app_busy("unreal", True, "Waiting for file…") + self._set_app_progress_fraction("unreal", 0.02) + if shutil.which("xdg-open"): + subprocess.Popen(["xdg-open", UNREAL_URL]) + self.append_log("Opened the Unreal Engine Linux page (Epic account required).\n") + self.append_log( + "Download the Linux zip (e.g. Linux_Unreal_Engine_5.8.0_preview-1.zip), then select it below.\n" + ) + self.pick_unreal_zip() + + def pick_unreal_zip(self): + path, _ = QFileDialog.getOpenFileName( + self, + "Select Unreal Engine Linux zip", + "", + "Zip archives (*.zip);;All files (*)", + ) + if not path: + self._finish_app_action("unreal") + return + self._set_app_progress_fraction("unreal", 0.05) + self.run_helper_with_callback( + ["install_unreal", path], + on_success=lambda: self._finish_app_action("unreal"), + app_id="unreal", + progress_segment=(0.05, 0.98), + ) + + def remove_unreal_flow(self): + if not self._unreal_installed(): + self.append_log("ℹ️ Unreal Engine does not appear to be installed.\n") + self.refresh_app_state("unreal") + return + reply = QMessageBox.question( + self, "Uninstall Unreal Engine?", + "This will remove /opt/unreal-engine and the desktop entry.", + QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel, + ) + if reply != QMessageBox.StandardButton.Ok: + return + self.set_app_busy("unreal", True, "Removing…") + self._set_app_progress_fraction("unreal", 0.02) + self.run_helper_with_callback( + ["remove_unreal"], + on_success=lambda: self._finish_app_action("unreal"), + app_id="unreal", + progress_segment=(0.02, 0.98), + ) +``` + +- [ ] **Step 5: Add the helper functions** + +After `remove_o3de` in the helper: + +```bash +# ------------------------------------------------- +# Unreal Engine (guided zip install) +# ------------------------------------------------- +install_unreal() { + local zip_path="${1:-}" + local install_dir="/opt/unreal-engine" + local tmp_dir + + [[ -n "${zip_path}" ]] || { echo "ERROR: missing zip path" >&2; exit 2; } + [[ -f "${zip_path}" ]] || { echo "ERROR: zip not found: ${zip_path}" >&2; exit 2; } + case "${zip_path}" in + *.zip) ;; + *) echo "ERROR: expected a .zip archive, got: ${zip_path}" >&2; exit 2;; + esac + + log "Ensuring unzip is available..." + command -v unzip >/dev/null 2>&1 || dnf -y install unzip + + local user home + user="$(require_invoking_user)" + home="$(require_invoking_user_home)" + + # Extract under /opt, not /tmp: the engine is tens of GB and /tmp is + # commonly a size-limited tmpfs. Same filesystem also makes mv instant. + tmp_dir="$(mktemp -d /opt/.unreal-tmp-XXXXXX)" + # shellcheck disable=SC2064 + trap "rm -rf '${tmp_dir}'" EXIT + + log "Extracting Unreal Engine archive (large, this can take several minutes)..." + unzip -q "${zip_path}" -d "${tmp_dir}" + + # The zip either contains Engine/ at the root or a single top-level + # versioned folder (e.g. Linux_Unreal_Engine_5.8.0_preview-1/). + local src_dir + if [[ -d "${tmp_dir}/Engine" ]]; then + src_dir="${tmp_dir}" + else + src_dir="$(find "${tmp_dir}" -maxdepth 1 -mindepth 1 -type d | head -1)" + fi + if [[ -z "${src_dir}" || ! -d "${src_dir}/Engine" ]]; then + echo "ERROR: no Engine/ directory found in the archive." >&2 + exit 2 + fi + + local editor="Engine/Binaries/Linux/UnrealEditor" + [[ -f "${src_dir}/${editor}" ]] || { echo "ERROR: ${editor} not found in the archive." >&2; exit 2; } + + log "Installing to ${install_dir}..." + rm -rf "${install_dir}" + mv "${src_dir}" "${install_dir}" + chmod +x "${install_dir}/${editor}" + + # The editor writes into its own tree (DerivedDataCache, Intermediate), + # so the invoking user must own it. + log "Setting ownership (large tree, this can take a moment)..." + chown -R "${user}:${user}" "${install_dir}" + + local desktop_dir="${home}/.local/share/applications" + mkdir -p "${desktop_dir}" + chown "${user}:${user}" "${desktop_dir}" + local icon_png="/usr/share/almalinux-creative-installer/icons/apps/com.epicgames.UnrealEngine.png" + cat > "${desktop_dir}/UnrealEngine.desktop" < + remove_unreal +``` + +- [ ] **Step 7: Verify syntax + a dry helper probe** + +Run: `python3 -m py_compile src/almalinux-creative-installer && bash -n src/almalinux-creative-installer-helper && echo OK` +Expected: `OK` + +Probe the validation path without root (must fail cleanly before any privileged work): + +Run: `bash src/almalinux-creative-installer-helper install_unreal /nonexistent.zip; echo "exit=$?"` +Expected: `ERROR: zip not found: /nonexistent.zip` and `exit=2` + +Run: `bash src/almalinux-creative-installer-helper install_unreal /etc/hostname; echo "exit=$?"` +Expected: `ERROR: expected a .zip archive...` and `exit=2` + +- [ ] **Step 8: Commit** + +```bash +git add src/almalinux-creative-installer src/almalinux-creative-installer-helper +git commit -m "feat(unreal): guided Unreal Engine 5.8 install from the Epic Linux zip (closes #70)" +``` + +--- + +### Task 4: Unigine (GUI wiring with EULA gate + helper) + +**Files:** +- Modify: `src/almalinux-creative-installer` (button wiring, subtitle, state branch, flows) +- Modify: `src/almalinux-creative-installer-helper` (new functions + dispatcher + usage) + +**Interfaces:** +- Consumes: app id `"unigine"` / type `"unigine"`, `UNIGINE_URL`, `UNIGINE_EULA_URL` from Task 1. +- Produces: GUI methods `_unigine_installed()`, `install_unigine_flow()`, `pick_unigine_run()`, `remove_unigine_flow()`; helper actions `install_unigine `, `remove_unigine`. + +- [ ] **Step 1: Wire the row buttons** + +After the `unreal` elif: + +```python + elif app["type"] == "unigine": + install_btn.clicked.connect(lambda: self.install_unigine_flow()) + remove_btn.clicked.connect(lambda: self.remove_unigine_flow()) +``` + +- [ ] **Step 2: Add the subtitle** + +After the `unreal` subtitle case: + +```python + if app["type"] == "unigine": + return "Guided install: agree to EULA → pick vendor .run → SDK Browser in /opt/unigine" +``` + +- [ ] **Step 3: Add the state branch** + +After the `unreal` branch in `refresh_app_state`: + +```python + if app["type"] == "unigine": + installed = self._unigine_installed() + self._set_status_badge(w["status"], "Installed" if installed else "Guided install", + "installed" if installed else "available") + w["install"].setEnabled(not installed) + w["remove"].setEnabled(installed) + return +``` + +- [ ] **Step 4: Add detection and flows (with the EULA gate)** + +After the `remove_unreal_flow` method: + +```python + + def _unigine_installed(self): + base = Path("/opt/unigine") + return base.is_dir() and any(base.iterdir()) + + def install_unigine_flow(self): + msg = QMessageBox(self) + msg.setWindowTitle("UNIGINE SDK License Agreement") + msg.setTextFormat(Qt.TextFormat.RichText) + msg.setText( + 'Installing Unigine runs the vendor installer, which is governed by the ' + 'UNIGINE SDK License Agreement.'.format(UNIGINE_EULA_URL) + ) + msg.setInformativeText( + "The vendor installer normally shows this EULA in a terminal. Because the " + "install runs unattended here, it will be accepted on your behalf.\n\n" + 'Click "I Agree" only if you have read and accept the EULA.' + ) + msg.setIcon(QMessageBox.Icon.Question) + btn_agree = msg.addButton("I Agree", QMessageBox.ButtonRole.AcceptRole) + msg.addButton(QMessageBox.StandardButton.Cancel) + msg.exec() + if msg.clickedButton() != btn_agree: + return + + self.set_app_busy("unigine", True, "Waiting for file…") + self._set_app_progress_fraction("unigine", 0.02) + if shutil.which("xdg-open"): + subprocess.Popen(["xdg-open", UNIGINE_URL]) + self.append_log("Opened the UNIGINE downloads page.\n") + self.append_log( + "Download the Linux .run installer (the filename changes with each version), then select it below.\n" + ) + self.pick_unigine_run() + + def pick_unigine_run(self): + path, _ = QFileDialog.getOpenFileName( + self, + "Select UNIGINE .run installer", + "", + "Run installers (*.run);;All files (*)", + ) + if not path: + self._finish_app_action("unigine") + return + self._set_app_progress_fraction("unigine", 0.05) + self.run_helper_with_callback( + ["install_unigine", path], + on_success=lambda: self._finish_app_action("unigine"), + app_id="unigine", + progress_segment=(0.05, 0.98), + ) + + def remove_unigine_flow(self): + if not self._unigine_installed(): + self.append_log("ℹ️ Unigine does not appear to be installed.\n") + self.refresh_app_state("unigine") + return + reply = QMessageBox.question( + self, "Uninstall Unigine?", + "This will remove /opt/unigine (including the SDK Browser and any SDKs " + "downloaded into it) and the desktop entry.", + QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel, + ) + if reply != QMessageBox.StandardButton.Ok: + return + self.set_app_busy("unigine", True, "Removing…") + self._set_app_progress_fraction("unigine", 0.02) + self.run_helper_with_callback( + ["remove_unigine"], + on_success=lambda: self._finish_app_action("unigine"), + app_id="unigine", + progress_segment=(0.02, 0.98), + ) +``` + +- [ ] **Step 5: Add the helper functions** + +After `remove_unreal` in the helper: + +```bash +# ------------------------------------------------- +# Unigine (guided .run install) +# ------------------------------------------------- +install_unigine() { + local run_path="${1:-}" + local install_dir="/opt/unigine" + + [[ -n "${run_path}" ]] || { echo "ERROR: missing .run path" >&2; exit 2; } + [[ -f "${run_path}" ]] || { echo "ERROR: file not found: ${run_path}" >&2; exit 2; } + case "${run_path}" in + *.run) ;; + *) echo "ERROR: expected a .run installer, got: ${run_path}" >&2; exit 2;; + esac + + local user home + user="$(require_invoking_user)" + home="$(require_invoking_user_home)" + + log "Preparing ${install_dir}..." + rm -rf "${install_dir}" + mkdir -p "${install_dir}" + + # The vendor installer creates the SDK Browser folder next to the .run + # file, so run it from inside the install dir. + local run_copy + run_copy="${install_dir}/$(basename "${run_path}")" + cp "${run_path}" "${run_copy}" + chmod +x "${run_copy}" + + # The installer shows its EULA on the terminal and asks for confirmation. + # The GUI already collected explicit agreement, so feed the acceptance + # here. "yes" dies with SIGPIPE when the installer stops reading, which + # pipefail would misreport as failure, so toggle it around the pipeline. + log "Running the UNIGINE installer (EULA accepted in the GUI)..." + local status=0 + set +o pipefail + ( cd "${install_dir}" && yes | "${run_copy}" ) || status=$? + set -o pipefail + rm -f "${run_copy}" + if (( status != 0 )); then + echo "ERROR: UNIGINE installer exited with status ${status}." >&2 + rm -rf "${install_dir}" + exit 1 + fi + + # Locate the Browser (launcher) executable the installer created. + local browser_exe + browser_exe="$(find "${install_dir}" -maxdepth 3 -type f -perm -u+x \ + \( -iname '*browser*' -o -iname '*launcher*' \) 2>/dev/null | sort | head -1)" + if [[ -z "${browser_exe}" ]]; then + browser_exe="$(find "${install_dir}" -maxdepth 3 -type f -perm -u+x \ + ! -name '*.so*' ! -name '*.run' 2>/dev/null | sort | head -1)" + fi + if [[ -z "${browser_exe}" ]]; then + echo "ERROR: UNIGINE Browser executable not found under ${install_dir}." >&2 + exit 2 + fi + log "Found Browser executable: ${browser_exe}" + + # The Browser self-updates and downloads SDKs into its own folder, so the + # invoking user must own the tree. + chown -R "${user}:${user}" "${install_dir}" + + # Under pkexec the vendor writes its nameless, iconless desktop entry into + # root's home. Discard it and write a proper one for the invoking user. + rm -f /root/.local/share/applications/*nigine*.desktop 2>/dev/null || true + + local desktop_dir="${home}/.local/share/applications" + mkdir -p "${desktop_dir}" + chown "${user}:${user}" "${desktop_dir}" + local icon_png="/usr/share/almalinux-creative-installer/icons/apps/com.unigine.Browser.png" + cat > "${desktop_dir}/UnigineBrowser.desktop" < + remove_unigine +``` + +- [ ] **Step 7: Verify syntax + validation probes** + +Run: `python3 -m py_compile src/almalinux-creative-installer && bash -n src/almalinux-creative-installer-helper && echo OK` +Expected: `OK` + +Run: `bash src/almalinux-creative-installer-helper install_unigine /etc/hostname; echo "exit=$?"` +Expected: `ERROR: expected a .run installer...` and `exit=2` + +- [ ] **Step 8: Commit** + +```bash +git add src/almalinux-creative-installer src/almalinux-creative-installer-helper +git commit -m "feat(unigine): guided Unigine install with GUI EULA gate (closes #67)" +``` + +**KNOWN VERIFICATION GAP (carry to the manual QA step, Task 7):** the auto-accept behavior of the real UNIGINE `.run` (whether `yes |` satisfies its EULA prompt, and the actual name of the Browser executable/folder) has not been tested against a real installer. This must be exercised manually before merge. + +--- + +### Task 5: README and website updates + +**Files:** +- Modify: `README.md` (EL availability table ~line 191, Game Engines bullets ~line 245) +- Modify: `docs/index.html` (Game Development card ~lines 1035-1048) + +**Interfaces:** +- Consumes: final app names and install methods from Tasks 2-4. + +- [ ] **Step 1: README EL table rows** + +After the `| Natron ... |` row (line 191), add: + +```markdown +| Open 3D Engine | ❌ | ✅ | Via COPR (hellaenergy/o3de), BETA | +| Unreal Engine 5.8 | ✅ | ✅ | Guided vendor install (Epic account), preview build | +| Unigine | ✅ | ✅ | Guided vendor install (.run) | +``` + +- [ ] **Step 2: README Game Engines bullets** + +Under `- **Game Engines**` (after the `Godots` bullet, line 245), add: + +```markdown + - Open 3D Engine *(via COPR, EL10 only, BETA)* + - Unreal Engine 5.8 *(guided vendor install, preview build)* + - Unigine *(guided vendor install)* +``` + +- [ ] **Step 3: Website Game Development card** + +In `docs/index.html`, change the count on line 1040 from `
3 apps
` to `
6 apps
`, and after `Asset Manager Studio` (line 1046) add: + +```html + Open 3D Engine + Unreal Engine 5.8 + Unigine +``` + +- [ ] **Step 4: Verify** + +Run: `grep -c "Open 3D Engine" README.md docs/index.html` +Expected: `README.md:2` and `docs/index.html:1` + +- [ ] **Step 5: Commit** + +```bash +git add README.md docs/index.html +git commit -m "docs: list O3DE, Unreal Engine 5.8, and Unigine in README and site" +``` + +--- + +### Task 6: App icons (best effort, non-blocking) + +**Files:** +- Create: `src/icons/apps/org.o3de.O3DE.png` +- Create: `src/icons/apps/com.epicgames.UnrealEngine.png` +- Create: `src/icons/apps/com.unigine.Browser.png` + +**Interfaces:** +- Consumes: `icon_appid` values from Task 1. The RPM packaging globs `src/icons/apps/*.png`, so no packaging changes are needed. + +- [ ] **Step 1: Source official logos** + +Try, in order, for each app; stop at the first that yields a valid PNG around 64x64 or larger: + +- O3DE: the o3de GitHub org avatar: `curl -fLo /tmp/o3de.png https://avatars.githubusercontent.com/u/84449732?s=128` +- Unreal: the EpicGames GitHub org avatar: `curl -fLo /tmp/unreal.png https://avatars.githubusercontent.com/u/3732406?s=128` +- Unigine: the Unigine GitHub org avatar: `curl -fLo /tmp/unigine.png https://avatars.githubusercontent.com/u/40636663?s=128` + +Verify each with: `file /tmp/.png` (expected: `PNG image data`). If a download fails or is not a PNG, skip that icon: the UI falls back to a colored letter badge and nothing breaks. + +- [ ] **Step 2: Install into the repo** + +```bash +cp /tmp/o3de.png src/icons/apps/org.o3de.O3DE.png +cp /tmp/unreal.png src/icons/apps/com.epicgames.UnrealEngine.png +cp /tmp/unigine.png src/icons/apps/com.unigine.Browser.png +``` + +(Only the ones that downloaded successfully.) + +- [ ] **Step 3: Commit whatever landed** + +```bash +git add src/icons/apps/org.o3de.O3DE.png src/icons/apps/com.epicgames.UnrealEngine.png src/icons/apps/com.unigine.Browser.png +git commit -m "feat(icons): bundle O3DE, Unreal Engine, and Unigine app icons" +``` + +If none landed, skip this commit entirely and note it in the final report. + +--- + +### Task 7: End-to-end verification + +**Files:** none modified; verification only. + +- [ ] **Step 1: Full syntax pass** + +Run: +```bash +python3 -m py_compile src/almalinux-creative-installer && \ +bash -n src/almalinux-creative-installer-helper && echo SYNTAX-OK +``` +Expected: `SYNTAX-OK` + +- [ ] **Step 2: O3DE COPR logic in an EL10 container (needs network)** + +```bash +podman run --rm quay.io/almalinuxorg/almalinux:10 bash -c " + dnf -y -q install 'dnf-command(copr)' && + dnf -y -q copr enable hellaenergy/o3de centos-stream-10-x86_64 && + dnf -q repoquery --qf '%{name}\n' 'o3de[0-9][0-9][0-9][0-9]' | grep -E '^o3de[0-9]{4}$' | sort -u -V | tail -1 +" +``` +Expected: prints the newest release line (currently `o3de2605`). If podman is unavailable, record that this check was skipped and why. + +- [ ] **Step 3: GUI smoke test (requires a desktop session)** + +Run `src/almalinux-creative-installer` locally and confirm: +- The three new rows appear under Game Engines. +- O3DE shows the EL10 chip plus the BETA chip; on an EL9 host it shows "Not compatible". +- Unreal shows the BETA chip and "Guided install"; Unigine shows "Guided install". +- Clicking Install on Unigine shows the EULA dialog first, and Cancel aborts cleanly. + +If no desktop session is available, record the gap; this becomes part of manual QA. + +- [ ] **Step 4: Manual QA items that need real artifacts (record, do not block)** + +- Unigine: run a real vendor `.run` through the helper; confirm `yes |` satisfies the EULA prompt and the Browser executable discovery finds the right binary. Adjust `install_unigine` if the vendor prompt differs. +- Unreal: confirm the 5.8 preview zip layout (top-level folder vs root `Engine/`) against the real download. + +--- + +### Task 8: Pre-PR review gates + +Not part of this plan's code. After all tasks above are complete and committed: + +1. Run a code-review pass over the branch diff (the repo's `/code-review` skill). +2. Run `/security-review` on the branch. Expected sensitive areas: root helper COPR enable, archive extraction under `/opt`, `chown -R`, executing a user-supplied `.run` as root behind the GUI EULA gate and pkexec authentication. +3. Fix findings, then open the PR referencing #73, #70, #67 (do not push without the user's go-ahead). From 1cc74e939c42e6ba8407b137507416df5893d083 Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:32:49 -0400 Subject: [PATCH 03/24] feat(ui): add BETA chip and catalog entries for O3DE, Unreal Engine 5.8, Unigine --- src/almalinux-creative-installer | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/almalinux-creative-installer b/src/almalinux-creative-installer index e258934..ab6f6b5 100755 --- a/src/almalinux-creative-installer +++ b/src/almalinux-creative-installer @@ -31,6 +31,9 @@ THREEDC_URL = "https://3dcoat.com/#auth" INSTAMATERIAL_URL = "https://instamaterial.com/" JANGAFX_URL = "https://jangafx.com/software/elemental-suite/try" GAFFER_URL = "https://github.com/GafferHQ/gaffer/releases" +UNREAL_URL = "https://www.unrealengine.com/linux" +UNIGINE_URL = "https://developer.unigine.com/en/downloads" +UNIGINE_EULA_URL = "https://developer.unigine.com/en/eula" APPIMAGELAUNCHER_VERSION = "3.0.0-beta-2-gha287.96cb937" APPIMAGELAUNCHER_RPM_URL = ( "https://github.com/TheAssassin/AppImageLauncher/releases/download/" @@ -42,7 +45,7 @@ APPIMAGELAUNCHER_RPM_URL = ( # HOW TO ADD / EDIT APPS (quick maintainer guide) # ----------------------------------------------------------------------------- # 1) Add or update an item inside APPS with a unique "id". -# 2) Pick a supported "type": dnf, flatpak, resolve, 3dcoat +# 2) Pick a supported "type": dnf, flatpak, resolve, 3dcoat, o3de, unreal, unigine # 3) Set metadata keys used by the UI for that type: # - dnf: pkg # - flatpak: appid @@ -50,6 +53,8 @@ APPIMAGELAUNCHER_RPM_URL = ( # 4) Optional: add the app id to VERSION_SELECTABLE_APPS. # 5) Optional: add "el": [9] or "el": [10] if the app only works on one EL # version. Omit (or use [9, 10]) for apps that work on both. +# 5b) Optional: add "beta": True for pre-release or experimental apps. +# The row shows an amber BETA chip next to the app name. # 6) If adding a truly new app type, update type handlers here and in the helper. # ----------------------------------------------------------------------------- @@ -97,6 +102,9 @@ APPS = [ {"id": "epicassetmanager", "name": "Epic Asset Manager","type": "flatpak", "appid": "io.github.achetagames.epic_asset_manager", "category": "Game Engines"}, {"id": "assetmanagerstudio","name": "Asset Manager Studio","type": "flatpak","appid": "studio.assetmanager.ams", "category": "Game Engines"}, {"id": "godots", "name": "Godots", "type": "flatpak", "appid": "io.github.MakovWait.Godots", "category": "Game Engines"}, + {"id": "o3de", "name": "Open 3D Engine", "type": "o3de", "icon_appid": "org.o3de.O3DE", "category": "Game Engines", "el": [10], "beta": True}, + {"id": "unreal", "name": "Unreal Engine 5.8","type": "unreal", "icon_appid": "com.epicgames.UnrealEngine", "category": "Game Engines", "beta": True}, + {"id": "unigine", "name": "Unigine", "type": "unigine", "icon_appid": "com.unigine.Browser", "category": "Game Engines"}, {"id": "appimagelauncher", "name": "AppImageLauncher", "type": "dnf", "pkg": "appimagelauncher", "install_target": APPIMAGELAUNCHER_RPM_URL, "category": "Productivity", "el": [10]}, {"id": "resolve", "name": "DaVinci Resolve", "type": "resolve", "category": "Animation & Video"}, @@ -1093,6 +1101,15 @@ class AlmaCreativeInstaller(QMainWindow): ) ) name_row.addWidget(el_chip) + if app.get("beta"): + beta_chip = QLabel("BETA") + beta_chip.setStyleSheet( + "background: rgba(230,160,50,0.20); color: #d29a3d;" + " border-radius: 4px; padding: 1px 5px;" + " font-size: 10px; font-weight: 600;" + ) + beta_chip.setToolTip("Pre-release / experimental build") + name_row.addWidget(beta_chip) name_row.addStretch() left.addLayout(name_row) From 1a09665e056aa21efdcac7b2b57f947656902d1f Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:44:14 -0400 Subject: [PATCH 04/24] feat(o3de): install Open 3D Engine from the hellaenergy COPR, latest release line (closes #73) --- src/almalinux-creative-installer | 51 +++++++++++++++++++++ src/almalinux-creative-installer-helper | 59 +++++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/src/almalinux-creative-installer b/src/almalinux-creative-installer index ab6f6b5..2800100 100755 --- a/src/almalinux-creative-installer +++ b/src/almalinux-creative-installer @@ -1174,6 +1174,9 @@ class AlmaCreativeInstaller(QMainWindow): elif app["type"] == "gaffer": install_btn.clicked.connect(lambda: self.install_gaffer_flow()) remove_btn.clicked.connect(lambda: self.remove_gaffer_flow()) + elif app["type"] == "o3de": + install_btn.clicked.connect(lambda: self.install_o3de_flow()) + remove_btn.clicked.connect(lambda: self.remove_o3de_flow()) pulse_timer = QTimer() pulse_timer.setInterval(120) @@ -1228,6 +1231,8 @@ class AlmaCreativeInstaller(QMainWindow): return "Guided install: download suite zip → extracts EmberGen, GeoGen, IlluGen, LiquiGen to /opt/jangafx" if app["type"] == "gaffer": return "Guided install: download Linux tarball from GitHub → extracts to /opt/gaffer (EL9 and EL10)" + if app["type"] == "o3de": + return "Installed via COPR (hellaenergy/o3de), latest release line" return "" # ------------------------------------------------------------------------- @@ -1459,6 +1464,14 @@ class AlmaCreativeInstaller(QMainWindow): w["remove"].setEnabled(installed) return + if app["type"] == "o3de": + installed = self._o3de_installed() + self._set_status_badge(w["status"], "Installed" if installed else "Not installed", + "installed" if installed else "missing") + w["install"].setEnabled(not installed) + w["remove"].setEnabled(installed) + return + if app["type"] == "dnf": installed = subprocess.run( ["rpm", "-q", app["pkg"]], @@ -2374,6 +2387,44 @@ class AlmaCreativeInstaller(QMainWindow): progress_segment=(0.02, 0.98), ) + def _o3de_installed(self): + out = subprocess.run( + ["rpm", "-qa", "--qf", "%{NAME}\n", "o3de*"], + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, + ).stdout + return any(re.fullmatch(r"o3de\d{4}", line.strip()) for line in out.splitlines()) + + def install_o3de_flow(self): + self.set_app_busy("o3de", True, "Installing…") + self._set_app_progress_fraction("o3de", 0.02) + self.run_helper_with_callback( + ["install_o3de"], + on_success=lambda: self._finish_app_action("o3de"), + app_id="o3de", + progress_segment=(0.02, 0.98), + ) + + def remove_o3de_flow(self): + if not self._o3de_installed(): + self.append_log("ℹ️ Open 3D Engine does not appear to be installed.\n") + self.refresh_app_state("o3de") + return + reply = QMessageBox.question( + self, "Uninstall Open 3D Engine?", + "This will remove all installed o3de packages and disable the hellaenergy/o3de COPR repo.", + QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel, + ) + if reply != QMessageBox.StandardButton.Ok: + return + self.set_app_busy("o3de", True, "Removing…") + self._set_app_progress_fraction("o3de", 0.02) + self.run_helper_with_callback( + ["remove_o3de"], + on_success=lambda: self._finish_app_action("o3de"), + app_id="o3de", + progress_segment=(0.02, 0.98), + ) + _THEME_COLORS = _DARK # set by main() before window creation _ICON_CACHE = {} # app["id"] → QPixmap | None, populated on first build diff --git a/src/almalinux-creative-installer-helper b/src/almalinux-creative-installer-helper index 822fc54..ffce460 100755 --- a/src/almalinux-creative-installer-helper +++ b/src/almalinux-creative-installer-helper @@ -870,6 +870,53 @@ remove_3dcoat() { log "3DCoat removed." } +# ------------------------------------------------- +# Open 3D Engine (COPR) +# ------------------------------------------------- +O3DE_COPR="hellaenergy/o3de" +# The COPR publishes EL builds only for the centos-stream-10 chroot; a bare +# "copr enable" on AlmaLinux 10 would look for epel-10, which does not exist +# in this project, so the chroot must be passed explicitly. +O3DE_COPR_CHROOT="centos-stream-10-x86_64" + +install_o3de() { + log "Ensuring dnf copr plugin..." + dnf -y install 'dnf-command(copr)' + + log "Enabling COPR ${O3DE_COPR} (chroot ${O3DE_COPR_CHROOT})..." + dnf -y copr enable "${O3DE_COPR}" "${O3DE_COPR_CHROOT}" + + # Packages use versioned-major naming (o3deNNNN, NNNN = YYMM). Majors are + # co-installable; install the newest release line. + log "Detecting the latest Open 3D Engine release line..." + local latest + latest="$(dnf -q repoquery --qf '%{name}\n' 'o3de[0-9][0-9][0-9][0-9]' 2>/dev/null \ + | grep -E '^o3de[0-9]{4}$' | sort -u -V | tail -1 || true)" + if [[ -z "${latest}" ]]; then + echo "ERROR: no o3deNNNN package found in ${O3DE_COPR} (repo unreachable or chroot missing)." >&2 + exit 4 + fi + + log "Installing ${latest}..." + dnf -y install "${latest}" + log "Open 3D Engine installed (${latest})." +} + +remove_o3de() { + log "Removing Open 3D Engine packages..." + local pkgs + mapfile -t pkgs < <(rpm -qa --qf '%{NAME}\n' 'o3de*' | grep -E '^o3de[0-9]{4}(-devel)?$' || true) + if (( ${#pkgs[@]} )); then + dnf -y remove "${pkgs[@]}" + else + log "No o3de packages installed." + fi + + log "Disabling COPR ${O3DE_COPR}..." + dnf -y copr remove "${O3DE_COPR}" || true + log "Open 3D Engine removed." +} + # ------------------------------------------------- # Dispatcher # ------------------------------------------------- @@ -921,6 +968,10 @@ case "${action}" in install_gaffer) install_gaffer "${2:-}";; remove_gaffer) remove_gaffer;; + # Open 3D Engine + install_o3de) install_o3de;; + remove_o3de) remove_o3de;; + *) cat >&2 <<'EOF' Usage: almalinux-creative-installer-helper @@ -967,6 +1018,14 @@ InstaMaterial: JangaFX Elemental Suite: install_jangafx remove_jangafx + +Gaffer: + install_gaffer + remove_gaffer + +Open 3D Engine: + install_o3de + remove_o3de EOF exit 1 ;; From 1ddca70deecb463d037bf593bd1a783fb385e622 Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Thu, 2 Jul 2026 07:44:19 -0400 Subject: [PATCH 05/24] feat(unreal): guided Unreal Engine 5.8 install from the Epic Linux zip (closes #70) --- src/almalinux-creative-installer | 66 +++++++++++++++ src/almalinux-creative-installer-helper | 106 ++++++++++++++++++++++++ 2 files changed, 172 insertions(+) diff --git a/src/almalinux-creative-installer b/src/almalinux-creative-installer index 2800100..d8c0e23 100755 --- a/src/almalinux-creative-installer +++ b/src/almalinux-creative-installer @@ -1177,6 +1177,9 @@ class AlmaCreativeInstaller(QMainWindow): elif app["type"] == "o3de": install_btn.clicked.connect(lambda: self.install_o3de_flow()) remove_btn.clicked.connect(lambda: self.remove_o3de_flow()) + elif app["type"] == "unreal": + install_btn.clicked.connect(lambda: self.install_unreal_flow()) + remove_btn.clicked.connect(lambda: self.remove_unreal_flow()) pulse_timer = QTimer() pulse_timer.setInterval(120) @@ -1233,6 +1236,8 @@ class AlmaCreativeInstaller(QMainWindow): return "Guided install: download Linux tarball from GitHub → extracts to /opt/gaffer (EL9 and EL10)" if app["type"] == "o3de": return "Installed via COPR (hellaenergy/o3de), latest release line" + if app["type"] == "unreal": + return "Guided install: log in to Epic → download Linux zip → extracts to /opt/unreal-engine (EL9 and EL10)" return "" # ------------------------------------------------------------------------- @@ -1472,6 +1477,14 @@ class AlmaCreativeInstaller(QMainWindow): w["remove"].setEnabled(installed) return + if app["type"] == "unreal": + installed = self._unreal_installed() + self._set_status_badge(w["status"], "Installed" if installed else "Guided install", + "installed" if installed else "available") + w["install"].setEnabled(not installed) + w["remove"].setEnabled(installed) + return + if app["type"] == "dnf": installed = subprocess.run( ["rpm", "-q", app["pkg"]], @@ -2425,6 +2438,59 @@ class AlmaCreativeInstaller(QMainWindow): progress_segment=(0.02, 0.98), ) + def _unreal_installed(self): + return Path("/opt/unreal-engine/Engine/Binaries/Linux/UnrealEditor").is_file() + + def install_unreal_flow(self): + self.set_app_busy("unreal", True, "Waiting for file…") + self._set_app_progress_fraction("unreal", 0.02) + if shutil.which("xdg-open"): + subprocess.Popen(["xdg-open", UNREAL_URL]) + self.append_log("Opened the Unreal Engine Linux page (Epic account required).\n") + self.append_log( + "Download the Linux zip (e.g. Linux_Unreal_Engine_5.8.0_preview-1.zip), then select it below.\n" + ) + self.pick_unreal_zip() + + def pick_unreal_zip(self): + path, _ = QFileDialog.getOpenFileName( + self, + "Select Unreal Engine Linux zip", + "", + "Zip archives (*.zip);;All files (*)", + ) + if not path: + self._finish_app_action("unreal") + return + self._set_app_progress_fraction("unreal", 0.05) + self.run_helper_with_callback( + ["install_unreal", path], + on_success=lambda: self._finish_app_action("unreal"), + app_id="unreal", + progress_segment=(0.05, 0.98), + ) + + def remove_unreal_flow(self): + if not self._unreal_installed(): + self.append_log("ℹ️ Unreal Engine does not appear to be installed.\n") + self.refresh_app_state("unreal") + return + reply = QMessageBox.question( + self, "Uninstall Unreal Engine?", + "This will remove /opt/unreal-engine and the desktop entry.", + QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel, + ) + if reply != QMessageBox.StandardButton.Ok: + return + self.set_app_busy("unreal", True, "Removing…") + self._set_app_progress_fraction("unreal", 0.02) + self.run_helper_with_callback( + ["remove_unreal"], + on_success=lambda: self._finish_app_action("unreal"), + app_id="unreal", + progress_segment=(0.02, 0.98), + ) + _THEME_COLORS = _DARK # set by main() before window creation _ICON_CACHE = {} # app["id"] → QPixmap | None, populated on first build diff --git a/src/almalinux-creative-installer-helper b/src/almalinux-creative-installer-helper index ffce460..9e4cb9a 100755 --- a/src/almalinux-creative-installer-helper +++ b/src/almalinux-creative-installer-helper @@ -917,6 +917,104 @@ remove_o3de() { log "Open 3D Engine removed." } +# ------------------------------------------------- +# Unreal Engine (guided zip install) +# ------------------------------------------------- +install_unreal() { + local zip_path="${1:-}" + local install_dir="/opt/unreal-engine" + local tmp_dir + + [[ -n "${zip_path}" ]] || { echo "ERROR: missing zip path" >&2; exit 2; } + [[ -f "${zip_path}" ]] || { echo "ERROR: zip not found: ${zip_path}" >&2; exit 2; } + case "${zip_path}" in + *.zip) ;; + *) echo "ERROR: expected a .zip archive, got: ${zip_path}" >&2; exit 2;; + esac + + log "Ensuring unzip is available..." + command -v unzip >/dev/null 2>&1 || dnf -y install unzip + + local user home + user="$(require_invoking_user)" + home="$(require_invoking_user_home)" + + # Extract under /opt, not /tmp: the engine is tens of GB and /tmp is + # commonly a size-limited tmpfs. Same filesystem also makes mv instant. + tmp_dir="$(mktemp -d /opt/.unreal-tmp-XXXXXX)" + # shellcheck disable=SC2064 + trap "rm -rf '${tmp_dir}'" EXIT + + log "Extracting Unreal Engine archive (large, this can take several minutes)..." + unzip -q "${zip_path}" -d "${tmp_dir}" + + # The zip either contains Engine/ at the root or a single top-level + # versioned folder (e.g. Linux_Unreal_Engine_5.8.0_preview-1/). + local src_dir + if [[ -d "${tmp_dir}/Engine" ]]; then + src_dir="${tmp_dir}" + else + src_dir="$(find "${tmp_dir}" -maxdepth 1 -mindepth 1 -type d | head -1)" + fi + if [[ -z "${src_dir}" || ! -d "${src_dir}/Engine" ]]; then + echo "ERROR: no Engine/ directory found in the archive." >&2 + exit 2 + fi + + local editor="Engine/Binaries/Linux/UnrealEditor" + [[ -f "${src_dir}/${editor}" ]] || { echo "ERROR: ${editor} not found in the archive." >&2; exit 2; } + + log "Installing to ${install_dir}..." + rm -rf "${install_dir}" + mv "${src_dir}" "${install_dir}" + chmod +x "${install_dir}/${editor}" + + # The editor writes into its own tree (DerivedDataCache, Intermediate), + # so the invoking user must own it. + log "Setting ownership (large tree, this can take a moment)..." + chown -R "${user}:${user}" "${install_dir}" + + local desktop_dir="${home}/.local/share/applications" + mkdir -p "${desktop_dir}" + chown "${user}:${user}" "${desktop_dir}" + local icon_png="/usr/share/almalinux-creative-installer/icons/apps/com.epicgames.UnrealEngine.png" + cat > "${desktop_dir}/UnrealEngine.desktop" <&2 <<'EOF' Usage: almalinux-creative-installer-helper @@ -1026,6 +1128,10 @@ Gaffer: Open 3D Engine: install_o3de remove_o3de + +Unreal Engine: + install_unreal + remove_unreal EOF exit 1 ;; From 3e43cdeab3b75a8c1877bec74c8b7e48d7f761dc Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Thu, 2 Jul 2026 07:49:25 -0400 Subject: [PATCH 06/24] feat(unigine): guided Unigine install with GUI EULA gate (closes #67) --- src/almalinux-creative-installer | 87 ++++++++++++++++++ src/almalinux-creative-installer-helper | 115 ++++++++++++++++++++++++ 2 files changed, 202 insertions(+) diff --git a/src/almalinux-creative-installer b/src/almalinux-creative-installer index d8c0e23..4451ddc 100755 --- a/src/almalinux-creative-installer +++ b/src/almalinux-creative-installer @@ -1180,6 +1180,9 @@ class AlmaCreativeInstaller(QMainWindow): elif app["type"] == "unreal": install_btn.clicked.connect(lambda: self.install_unreal_flow()) remove_btn.clicked.connect(lambda: self.remove_unreal_flow()) + elif app["type"] == "unigine": + install_btn.clicked.connect(lambda: self.install_unigine_flow()) + remove_btn.clicked.connect(lambda: self.remove_unigine_flow()) pulse_timer = QTimer() pulse_timer.setInterval(120) @@ -1238,6 +1241,8 @@ class AlmaCreativeInstaller(QMainWindow): return "Installed via COPR (hellaenergy/o3de), latest release line" if app["type"] == "unreal": return "Guided install: log in to Epic → download Linux zip → extracts to /opt/unreal-engine (EL9 and EL10)" + if app["type"] == "unigine": + return "Guided install: agree to EULA → pick vendor .run → SDK Browser in /opt/unigine" return "" # ------------------------------------------------------------------------- @@ -1485,6 +1490,14 @@ class AlmaCreativeInstaller(QMainWindow): w["remove"].setEnabled(installed) return + if app["type"] == "unigine": + installed = self._unigine_installed() + self._set_status_badge(w["status"], "Installed" if installed else "Guided install", + "installed" if installed else "available") + w["install"].setEnabled(not installed) + w["remove"].setEnabled(installed) + return + if app["type"] == "dnf": installed = subprocess.run( ["rpm", "-q", app["pkg"]], @@ -2491,6 +2504,80 @@ class AlmaCreativeInstaller(QMainWindow): progress_segment=(0.02, 0.98), ) + def _unigine_installed(self): + base = Path("/opt/unigine") + return base.is_dir() and any(base.iterdir()) + + def install_unigine_flow(self): + msg = QMessageBox(self) + msg.setWindowTitle("UNIGINE SDK License Agreement") + msg.setTextFormat(Qt.TextFormat.RichText) + msg.setText( + 'Installing Unigine runs the vendor installer, which is governed by the ' + 'UNIGINE SDK License Agreement.'.format(UNIGINE_EULA_URL) + ) + msg.setInformativeText( + "The vendor installer normally shows this EULA in a terminal. Because the " + "install runs unattended here, it will be accepted on your behalf.\n\n" + 'Click "I Agree" only if you have read and accept the EULA.' + ) + msg.setIcon(QMessageBox.Icon.Question) + btn_agree = msg.addButton("I Agree", QMessageBox.ButtonRole.AcceptRole) + msg.addButton(QMessageBox.StandardButton.Cancel) + msg.exec() + if msg.clickedButton() != btn_agree: + return + + self.set_app_busy("unigine", True, "Waiting for file…") + self._set_app_progress_fraction("unigine", 0.02) + if shutil.which("xdg-open"): + subprocess.Popen(["xdg-open", UNIGINE_URL]) + self.append_log("Opened the UNIGINE downloads page.\n") + self.append_log( + "Download the Linux .run installer (the filename changes with each version), then select it below.\n" + ) + self.pick_unigine_run() + + def pick_unigine_run(self): + path, _ = QFileDialog.getOpenFileName( + self, + "Select UNIGINE .run installer", + "", + "Run installers (*.run);;All files (*)", + ) + if not path: + self._finish_app_action("unigine") + return + self._set_app_progress_fraction("unigine", 0.05) + self.run_helper_with_callback( + ["install_unigine", path], + on_success=lambda: self._finish_app_action("unigine"), + app_id="unigine", + progress_segment=(0.05, 0.98), + ) + + def remove_unigine_flow(self): + if not self._unigine_installed(): + self.append_log("ℹ️ Unigine does not appear to be installed.\n") + self.refresh_app_state("unigine") + return + reply = QMessageBox.question( + self, "Uninstall Unigine?", + "This will remove /opt/unigine (including the SDK Browser and any SDKs " + "downloaded into it) and the desktop entry.", + QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel, + ) + if reply != QMessageBox.StandardButton.Ok: + return + self.set_app_busy("unigine", True, "Removing…") + self._set_app_progress_fraction("unigine", 0.02) + self.run_helper_with_callback( + ["remove_unigine"], + on_success=lambda: self._finish_app_action("unigine"), + app_id="unigine", + progress_segment=(0.02, 0.98), + ) + _THEME_COLORS = _DARK # set by main() before window creation _ICON_CACHE = {} # app["id"] → QPixmap | None, populated on first build diff --git a/src/almalinux-creative-installer-helper b/src/almalinux-creative-installer-helper index 9e4cb9a..b13c72d 100755 --- a/src/almalinux-creative-installer-helper +++ b/src/almalinux-creative-installer-helper @@ -1015,6 +1015,113 @@ remove_unreal() { log "Unreal Engine removed." } +# ------------------------------------------------- +# Unigine (guided .run install) +# ------------------------------------------------- +install_unigine() { + local run_path="${1:-}" + local install_dir="/opt/unigine" + + [[ -n "${run_path}" ]] || { echo "ERROR: missing .run path" >&2; exit 2; } + [[ -f "${run_path}" ]] || { echo "ERROR: file not found: ${run_path}" >&2; exit 2; } + case "${run_path}" in + *.run) ;; + *) echo "ERROR: expected a .run installer, got: ${run_path}" >&2; exit 2;; + esac + + local user home + user="$(require_invoking_user)" + home="$(require_invoking_user_home)" + + log "Preparing ${install_dir}..." + rm -rf "${install_dir}" + mkdir -p "${install_dir}" + + # The vendor installer creates the SDK Browser folder next to the .run + # file, so run it from inside the install dir. + local run_copy + run_copy="${install_dir}/$(basename "${run_path}")" + cp "${run_path}" "${run_copy}" + chmod +x "${run_copy}" + + # The installer shows its EULA on the terminal and asks for confirmation. + # The GUI already collected explicit agreement, so feed the acceptance + # here. "yes" dies with SIGPIPE when the installer stops reading, which + # pipefail would misreport as failure, so toggle it around the pipeline. + log "Running the UNIGINE installer (EULA accepted in the GUI)..." + local status=0 + set +o pipefail + ( cd "${install_dir}" && yes | "${run_copy}" ) || status=$? + set -o pipefail + rm -f "${run_copy}" + if (( status != 0 )); then + echo "ERROR: UNIGINE installer exited with status ${status}." >&2 + rm -rf "${install_dir}" + exit 1 + fi + + # Locate the Browser (launcher) executable the installer created. + local browser_exe + browser_exe="$(find "${install_dir}" -maxdepth 3 -type f -perm -u+x \ + \( -iname '*browser*' -o -iname '*launcher*' \) 2>/dev/null | sort | head -1)" + if [[ -z "${browser_exe}" ]]; then + browser_exe="$(find "${install_dir}" -maxdepth 3 -type f -perm -u+x \ + ! -name '*.so*' ! -name '*.run' 2>/dev/null | sort | head -1)" + fi + if [[ -z "${browser_exe}" ]]; then + echo "ERROR: UNIGINE Browser executable not found under ${install_dir}." >&2 + exit 2 + fi + log "Found Browser executable: ${browser_exe}" + + # The Browser self-updates and downloads SDKs into its own folder, so the + # invoking user must own the tree. + chown -R "${user}:${user}" "${install_dir}" + + # Under pkexec the vendor writes its nameless, iconless desktop entry into + # root's home. Discard it and write a proper one for the invoking user. + rm -f /root/.local/share/applications/*nigine*.desktop 2>/dev/null || true + + local desktop_dir="${home}/.local/share/applications" + mkdir -p "${desktop_dir}" + chown "${user}:${user}" "${desktop_dir}" + local icon_png="/usr/share/almalinux-creative-installer/icons/apps/com.unigine.Browser.png" + cat > "${desktop_dir}/UnigineBrowser.desktop" <&2 <<'EOF' Usage: almalinux-creative-installer-helper @@ -1132,6 +1243,10 @@ Open 3D Engine: Unreal Engine: install_unreal remove_unreal + +Unigine: + install_unigine + remove_unigine EOF exit 1 ;; From 96d887f3c0a71aaf35d13cd7ff1896126fe2d4b2 Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Thu, 2 Jul 2026 07:54:09 -0400 Subject: [PATCH 07/24] docs: list O3DE, Unreal Engine 5.8, and Unigine in README and site --- README.md | 6 ++++++ docs/index.html | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f966123..91c8c52 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,9 @@ Not every app is available on both EL versions. The installer shows a small **EL | FogPanther | ✅ | ✅ | Via Flathub | | Gaffer | ✅ | ✅ | Guided portable binary install (works on EL9 and EL10) | | Natron | ✅ | ✅ | Via Flathub | +| Open 3D Engine | ❌ | ✅ | Via COPR (hellaenergy/o3de), BETA | +| Unreal Engine 5.8 | ✅ | ✅ | Guided vendor install (Epic account), preview build | +| Unigine | ✅ | ✅ | Guided vendor install (.run) | > This table reflects current EPEL availability and will be updated as packages land in EL10. @@ -243,6 +246,9 @@ post-production, and content creation environments: - Epic Asset Manager - Asset Manager Studio - Godots + - Open 3D Engine *(via COPR, EL10 only, BETA)* + - Unreal Engine 5.8 *(guided vendor install, preview build)* + - Unigine *(guided vendor install)* - **Audio** - Ardour diff --git a/docs/index.html b/docs/index.html index 33de829..5006765 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1037,13 +1037,16 @@

Audio & Music

🎮

Game Development

-
3 apps
+
6 apps
Godot Engine Epic Asset Manager Asset Manager Studio + Open 3D Engine + Unreal Engine 5.8 + Unigine
From 834fd0b66225b14cc47852b883ab678186851470 Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Thu, 2 Jul 2026 07:56:47 -0400 Subject: [PATCH 08/24] feat(icons): bundle O3DE, Unreal Engine, and Unigine app icons --- src/icons/apps/com.epicgames.UnrealEngine.png | Bin 0 -> 1571 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/apps/com.epicgames.UnrealEngine.png diff --git a/src/icons/apps/com.epicgames.UnrealEngine.png b/src/icons/apps/com.epicgames.UnrealEngine.png new file mode 100644 index 0000000000000000000000000000000000000000..0d890085bfb2968b174c1b45cd741488254123ac GIT binary patch literal 1571 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&i985rwk9xc1g_hEs>YsoWK4`bl)W7Uq9zutS{coEOdm=L%>?W@l6BE#^J}= zc9r|i?ZUaM!ym}c5tNrp?zw7xXKKBmH#ijXP8y31W4{A^YdN{^^&Df49n=5*oMn(Y z+n`x`=I70`kEu`FZlcO4-Jn+>}5W%ot|0y9}5G+|NkCYx=PJWPyYc6e+ExiKbLh*2~7Z+xB*H4 literal 0 HcmV?d00001 From 3592301af4e766b8e139ad75465de5d0c4ed8d1e Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Thu, 2 Jul 2026 07:58:05 -0400 Subject: [PATCH 09/24] Revert "feat(icons): bundle O3DE, Unreal Engine, and Unigine app icons" This reverts commit 834fd0b66225b14cc47852b883ab678186851470. --- src/icons/apps/com.epicgames.UnrealEngine.png | Bin 1571 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/icons/apps/com.epicgames.UnrealEngine.png diff --git a/src/icons/apps/com.epicgames.UnrealEngine.png b/src/icons/apps/com.epicgames.UnrealEngine.png deleted file mode 100644 index 0d890085bfb2968b174c1b45cd741488254123ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&i985rwk9xc1g_hEs>YsoWK4`bl)W7Uq9zutS{coEOdm=L%>?W@l6BE#^J}= zc9r|i?ZUaM!ym}c5tNrp?zw7xXKKBmH#ijXP8y31W4{A^YdN{^^&Df49n=5*oMn(Y z+n`x`=I70`kEu`FZlcO4-Jn+>}5W%ot|0y9}5G+|NkCYx=PJWPyYc6e+ExiKbLh*2~7Z+xB*H4 From 09772d74aa10067640817d9c61590b40af119d02 Mon Sep 17 00:00:00 2001 From: KernelChief <70530866+KernelChief@users.noreply.github.com> Date: Thu, 2 Jul 2026 07:59:13 -0400 Subject: [PATCH 10/24] fix(icons): rely on theme/AppStream icons instead of bundled images for the new apps --- src/almalinux-creative-installer | 4 ++-- src/almalinux-creative-installer-helper | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/almalinux-creative-installer b/src/almalinux-creative-installer index 4451ddc..901006e 100755 --- a/src/almalinux-creative-installer +++ b/src/almalinux-creative-installer @@ -103,8 +103,8 @@ APPS = [ {"id": "assetmanagerstudio","name": "Asset Manager Studio","type": "flatpak","appid": "studio.assetmanager.ams", "category": "Game Engines"}, {"id": "godots", "name": "Godots", "type": "flatpak", "appid": "io.github.MakovWait.Godots", "category": "Game Engines"}, {"id": "o3de", "name": "Open 3D Engine", "type": "o3de", "icon_appid": "org.o3de.O3DE", "category": "Game Engines", "el": [10], "beta": True}, - {"id": "unreal", "name": "Unreal Engine 5.8","type": "unreal", "icon_appid": "com.epicgames.UnrealEngine", "category": "Game Engines", "beta": True}, - {"id": "unigine", "name": "Unigine", "type": "unigine", "icon_appid": "com.unigine.Browser", "category": "Game Engines"}, + {"id": "unreal", "name": "Unreal Engine 5.8","type": "unreal", "category": "Game Engines", "beta": True}, + {"id": "unigine", "name": "Unigine", "type": "unigine", "category": "Game Engines"}, {"id": "appimagelauncher", "name": "AppImageLauncher", "type": "dnf", "pkg": "appimagelauncher", "install_target": APPIMAGELAUNCHER_RPM_URL, "category": "Productivity", "el": [10]}, {"id": "resolve", "name": "DaVinci Resolve", "type": "resolve", "category": "Animation & Video"}, diff --git a/src/almalinux-creative-installer-helper b/src/almalinux-creative-installer-helper index b13c72d..801036c 100755 --- a/src/almalinux-creative-installer-helper +++ b/src/almalinux-creative-installer-helper @@ -977,13 +977,11 @@ install_unreal() { local desktop_dir="${home}/.local/share/applications" mkdir -p "${desktop_dir}" chown "${user}:${user}" "${desktop_dir}" - local icon_png="/usr/share/almalinux-creative-installer/icons/apps/com.epicgames.UnrealEngine.png" cat > "${desktop_dir}/UnrealEngine.desktop" < "${desktop_dir}/UnigineBrowser.desktop" < Date: Fri, 10 Jul 2026 13:27:00 -0400 Subject: [PATCH 11/24] fix(unreal,unigine): EL9 zip extraction fallback + polkit inactive auth - install_unreal: EL9's unzip 6.0 can fail silently on ZIP64 archives (Epic's Linux UE downloads). Drop -q so errors surface; add python3 zipfile module as an automatic fallback when unzip exits non-zero. - install_unigine: add chcon -t bin_t on the copied .run so SELinux enforcing on EL9 doesn't block execution from /opt (best-effort, no-op on permissive or when chcon is absent). - polkit policy: allow_inactive=auth_admin (was: no) so CLI and SSH sessions can also authenticate via pkexec without a desktop session. Co-Authored-By: Claude Sonnet 4.6 --- src/almalinux-creative-installer-helper | 12 +++++++++++- src/org.almalinux.creativeinstaller.policy | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/almalinux-creative-installer-helper b/src/almalinux-creative-installer-helper index 801036c..0e8fa0e 100755 --- a/src/almalinux-creative-installer-helper +++ b/src/almalinux-creative-installer-helper @@ -946,7 +946,15 @@ install_unreal() { trap "rm -rf '${tmp_dir}'" EXIT log "Extracting Unreal Engine archive (large, this can take several minutes)..." - unzip -q "${zip_path}" -d "${tmp_dir}" + # unzip 6.0 on EL9 can fail on ZIP64 large archives; fall back to python3 zipfile module. + if ! unzip -o "${zip_path}" -d "${tmp_dir}" 2>&1; then + log "unzip failed, retrying with python3 zipfile module..." + python3 -c " +import zipfile, sys +with zipfile.ZipFile(sys.argv[1]) as z: + z.extractall(sys.argv[2]) +" "${zip_path}" "${tmp_dir}" || { echo "ERROR: extraction failed with both unzip and python3 zipfile" >&2; exit 1; } + fi # The zip either contains Engine/ at the root or a single top-level # versioned folder (e.g. Linux_Unreal_Engine_5.8.0_preview-1/). @@ -1041,6 +1049,8 @@ install_unigine() { run_copy="${install_dir}/$(basename "${run_path}")" cp "${run_path}" "${run_copy}" chmod +x "${run_copy}" + # Allow execution in /opt under SELinux enforcing (best-effort). + chcon -t bin_t "${run_copy}" 2>/dev/null || true # The installer shows its EULA on the terminal and asks for confirmation. # The GUI already collected explicit agreement, so feed the acceptance diff --git a/src/org.almalinux.creativeinstaller.policy b/src/org.almalinux.creativeinstaller.policy index 69bab21..f1c96a1 100644 --- a/src/org.almalinux.creativeinstaller.policy +++ b/src/org.almalinux.creativeinstaller.policy @@ -9,7 +9,7 @@ Authentication is required to install or remove software no - no + auth_admin auth_admin_keep /usr/libexec/almalinux-creative-installer-helper From 71436cac9f3946a509dc0dfe7aa0e9ba6980420a Mon Sep 17 00:00:00 2001 From: ttheroux <70530866+KernelChief@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:22:47 -0400 Subject: [PATCH 12/24] feat(gnome-ui): add Windows-style GNOME UI setup to Setup tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add GDM/GNOME-gated "Windows-style UI" row in the Setup tab: installs Dash to Panel, ArcMenu, System Monitor, Blur My Shell, GNOME Tweaks, and Nautilus copy-path extension system-wide in one click - Bundle gnome-ui extensions and dconf profile in src/gnome-ui/ (packaged to /usr/share/almalinux-creative-installer/gnome-ui/ by the RPM) - Add install_gnome_ui / remove_gnome_ui actions to the helper; dev mode resolves data dir relative to the helper script path - Gate the Install/Remove buttons to GNOME Desktop sessions only (XDG_CURRENT_DESKTOP check); shows "GNOME only" badge on other DEs - Rename all SHED / SHED MTL file names and content references: 01-shed_gnome_defaults → 01-creative_gnome_defaults, SHED_UI_EL9.yaml → gnome-ui-setup.yaml, shed_launcher.desktop removed from dconf favorite-apps - Fix polkit policy: allow_inactive=auth_admin (was: no) so QA and SSH sessions can authenticate via pkexec without a desktop session - Update spec: install gnome-ui data tree; add %files entries; bump version notes in changelog Co-Authored-By: Claude Sonnet 4.6 --- UIDev/ansibleshed/01-creative_gnome_defaults | 96 + UIDev/ansibleshed/Packages.zip | Bin 0 -> 1539247 bytes .../Packages/01-creative_gnome_defaults | 96 + .../arcmenu@arcmenu.com/COPYING | 341 + .../arcmenu@arcmenu.com/README.md | 148 + .../arcmenu@arcmenu.com/constants.js | 460 + .../arcmenu@arcmenu.com/controller.js | 749 ++ .../arcmenu@arcmenu.com/extension.js | 307 + .../arcmenu@arcmenu.com/helper.js | 227 + .../locale/ar/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3183 bytes .../locale/be/LC_MESSAGES/arcmenu.mo | Bin 0 -> 33098 bytes .../locale/bg/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3558 bytes .../locale/ca/LC_MESSAGES/arcmenu.mo | Bin 0 -> 8686 bytes .../locale/cs/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22694 bytes .../locale/de/LC_MESSAGES/arcmenu.mo | Bin 0 -> 24301 bytes .../locale/el/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3839 bytes .../locale/es/LC_MESSAGES/arcmenu.mo | Bin 0 -> 10223 bytes .../locale/et/LC_MESSAGES/arcmenu.mo | Bin 0 -> 9736 bytes .../locale/fi/LC_MESSAGES/arcmenu.mo | Bin 0 -> 20844 bytes .../locale/fr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 25058 bytes .../locale/he/LC_MESSAGES/arcmenu.mo | Bin 0 -> 26175 bytes .../locale/hi_IN/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3965 bytes .../locale/hu/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27574 bytes .../locale/id/LC_MESSAGES/arcmenu.mo | Bin 0 -> 2833 bytes .../locale/it/LC_MESSAGES/arcmenu.mo | Bin 0 -> 21817 bytes .../locale/ja/LC_MESSAGES/arcmenu.mo | Bin 0 -> 24719 bytes .../locale/ko/LC_MESSAGES/arcmenu.mo | Bin 0 -> 19547 bytes .../locale/nb_NO/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27590 bytes .../locale/nl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 28553 bytes .../locale/oc/LC_MESSAGES/arcmenu.mo | Bin 0 -> 10147 bytes .../locale/pl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 6996 bytes .../locale/pt_BR/LC_MESSAGES/arcmenu.mo | Bin 0 -> 31167 bytes .../locale/ru/LC_MESSAGES/arcmenu.mo | Bin 0 -> 31187 bytes .../locale/si/LC_MESSAGES/arcmenu.mo | Bin 0 -> 18243 bytes .../locale/sk/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22565 bytes .../locale/sr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3628 bytes .../locale/sr@latin/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3009 bytes .../locale/sv/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22003 bytes .../locale/szl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 7140 bytes .../locale/tr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27502 bytes .../locale/uk/LC_MESSAGES/arcmenu.mo | Bin 0 -> 12578 bytes .../locale/zh_CN/LC_MESSAGES/arcmenu.mo | Bin 0 -> 9402 bytes .../locale/zh_TW/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27158 bytes .../arcmenu@arcmenu.com/media/.keep | 0 .../distro_icons/arch-logo-symbolic.svg | 30 + .../distro_icons/budgie-logo-symbolic.svg | 55 + .../distro_icons/debian-logo-symbolic.svg | 55 + .../distro_icons/endeavour-logo-symbolic.svg | 58 + .../distro_icons/fedora-logo-symbolic.svg | 56 + .../distro_icons/gentoo-logo-symbolic.svg | 35 + .../distro_icons/kali-linux-logo-symbolic.svg | 30 + .../distro_icons/manjaro-logo-symbolic.svg | 42 + .../distro_icons/mx-logo-symbolic.svg | 30 + .../distro_icons/opensuse-logo-symbolic.svg | 55 + .../distro_icons/pop-os-logo-symbolic.svg | 30 + .../distro_icons/pureos-logo-symbolic.svg | 30 + .../distro_icons/raspbian-logo-symbolic.svg | 30 + .../distro_icons/redhat-logo-symbolic.svg | 30 + .../distro_icons/solus-logo-symbolic.svg | 53 + .../distro_icons/ubuntu-logo-symbolic.svg | 31 + .../distro_icons/voyager-logo-symbolic.svg | 30 + .../distro_icons/zorin-logo-symbolic.svg | 62 + .../menu_button_icons/icons/3D-symbolic.svg | 55 + .../menu_button_icons/icons/3d-symbolic-1.svg | 63 + .../menu_button_icons/icons/a-symbolic.svg | 55 + .../icons/alien-symbolic.svg | 55 + .../icons/app-launcher-symbolic.svg | 55 + .../menu_button_icons/icons/apps-symbolic.svg | 71 + .../icons/arc-menu-alt-symbolic.svg | 66 + .../icons/arc-menu-old-symbolic.svg | 68 + .../icons/arc-menu-old2-symbolic.svg | 103 + .../icons/arcmenu-logo-alt-symbolic.svg | 62 + .../icons/arcmenu-logo-symbolic.svg | 92 + .../icons/arrow-symbolic.svg | 55 + .../menu_button_icons/icons/bat-symbolic.svg | 55 + .../menu_button_icons/icons/bug-symbolic.svg | 63 + .../menu_button_icons/icons/cita-symbolic.svg | 55 + .../icons/cloud-symbolic.svg | 63 + .../icons/curved-a-symbolic.svg | 55 + .../icons/diamond-square-symbolic.svg | 55 + .../icons/dimond-win-symbolic.svg | 55 + .../icons/dolphin-symbolic.svg | 55 + .../menu_button_icons/icons/dota-symbolic.svg | 55 + .../menu_button_icons/icons/dra-symbolic.svg | 55 + .../icons/dragon-symbolic.svg | 55 + .../icons/dragonheart-symbolic.svg | 63 + .../icons/eclipse-symbolic.svg | 55 + .../icons/equal-symbolic.svg | 68 + .../menu_button_icons/icons/fly-symbolic.svg | 70 + .../icons/focus-symbolic.svg | 118 + .../icons/football-symbolic.svg | 55 + .../icons/football2-symbolic.svg | 64 + .../icons/gnacs-symbolic.svg | 55 + .../icons/groove-symbolic.svg | 63 + .../icons/heddy-symbolic.svg | 55 + .../icons/helmet-symbolic.svg | 55 + .../icons/kaaet-symbolic.svg | 55 + .../icons/launcher-symbolic.svg | 66 + .../menu_button_icons/icons/lins-symbolic.svg | 55 + .../icons/loveheart-symbolic.svg | 55 + .../icons/octo-maze-symbolic.svg | 55 + .../menu_button_icons/icons/pac-symbolic.svg | 55 + .../icons/pacman-symbolic.svg | 55 + .../icons/palette-symbolic.svg | 55 + .../icons/peaks-symbolic.svg | 55 + .../icons/peeks-symbolic.svg | 55 + .../menu_button_icons/icons/pie-symbolic.svg | 55 + .../icons/pointer-symbolic.svg | 55 + .../icons/pyrimid-symbolic.svg | 67 + .../icons/record-symbolic.svg | 55 + .../icons/rewind-symbolic.svg | 55 + .../icons/robots-symbolic.svg | 64 + .../icons/round-symbolic.svg | 18 + .../icons/saucer-symbolic.svg | 64 + .../icons/search-symbolic.svg | 55 + .../icons/sheild-symbolic.svg | 63 + .../menu_button_icons/icons/snap-symbolic.svg | 55 + .../icons/somnia-symbolic.svg | 55 + .../icons/start-box-symbolic.svg | 138 + .../menu_button_icons/icons/step-symbolic.svg | 55 + .../menu_button_icons/icons/sums-symbolic.svg | 55 + .../icons/swirl-symbolic.svg | 3 + .../menu_button_icons/icons/time-symbolic.svg | 55 + .../icons/toxic-symbolic.svg | 63 + .../icons/transform-symbolic.svg | 55 + .../menu_button_icons/icons/tree-symbolic.svg | 55 + .../icons/triple-dash-symbolic.svg | 88 + .../icons/utool-symbolic.svg | 55 + .../icons/vancer-symbolic.svg | 55 + .../menu_button_icons/icons/vibe-symbolic.svg | 55 + .../icons/whirl-circle-symbolic.svg | 55 + .../icons/whirl-symbolic.svg | 55 + .../icons/zegon-symbolic.svg | 63 + .../icons/menu_icons/arc-menu-symbolic.svg | 93 + .../icons/menu_icons/hamburger-symbolic.svg | 1 + .../icons/menu_icons/homescreen-symbolic.svg | 3 + .../media/icons/menu_icons/sleep-symbolic.svg | 67 + .../media/icons/prefs_icons/arc-menu-logo.svg | 1412 ++++ .../media/icons/prefs_icons/donate-icon.svg | 158 + .../media/icons/prefs_icons/gitlab-icon.svg | 408 + .../hicolor/16x16/actions/3D-symbolic-1.svg | 55 + .../hicolor/16x16/actions/3d-symbolic.svg | 63 + .../hicolor/16x16/actions/a-symbolic.svg | 55 + .../hicolor/16x16/actions/alien-symbolic.svg | 55 + .../actions/alternative-category-symbolic.svg | 287 + .../16x16/actions/app-launcher-symbolic.svg | 55 + .../hicolor/16x16/actions/apps-symbolic.svg | 71 + .../16x16/actions/arc-menu-alt-symbolic.svg | 66 + .../16x16/actions/arc-menu-old-symbolic.svg | 68 + .../16x16/actions/arc-menu-old2-symbolic.svg | 103 + .../16x16/actions/arc-menu-symbolic.svg | 93 + .../16x16/actions/arch-logo-symbolic.svg | 30 + .../16x16/actions/arcmenu-layout-symbolic.svg | 330 + .../actions/arcmenu-logo-alt-symbolic.svg | 62 + .../16x16/actions/arcmenu-logo-symbolic.svg | 92 + .../hicolor/16x16/actions/arrow-symbolic.svg | 55 + .../16x16/actions/az-layout-symbolic.svg | 312 + .../hicolor/16x16/actions/bat-symbolic.svg | 55 + .../16x16/actions/brisk-layout-symbolic.svg | 328 + .../16x16/actions/browse-presets-symbolic.svg | 60 + .../16x16/actions/budgie-layout-symbolic.svg | 202 + .../16x16/actions/budgie-logo-symbolic.svg | 55 + .../hicolor/16x16/actions/bug-symbolic.svg | 63 + .../actions/button-appearance-symbolic.svg | 45 + .../16x16/actions/categories-symbolic.svg | 87 + .../actions/chromebook-layout-symbolic.svg | 227 + .../hicolor/16x16/actions/cita-symbolic.svg | 55 + .../hicolor/16x16/actions/cloud-symbolic.svg | 63 + .../16x16/actions/curved-a-symbolic.svg | 55 + .../16x16/actions/debian-logo-symbolic.svg | 55 + .../16x16/actions/diamond-square-symbolic.svg | 55 + .../16x16/actions/dimond-win-symbolic.svg | 55 + .../16x16/actions/dolphin-symbolic.svg | 55 + .../hicolor/16x16/actions/dota-symbolic.svg | 55 + .../hicolor/16x16/actions/dra-symbolic.svg | 55 + .../hicolor/16x16/actions/drag-symbolic.svg | 65 + .../hicolor/16x16/actions/dragon-symbolic.svg | 55 + .../16x16/actions/dragonheart-symbolic.svg | 63 + .../16x16/actions/eclipse-symbolic.svg | 55 + .../actions/elementary-layout-symbolic.svg | 285 + .../16x16/actions/eleven-layout-symbolic.svg | 219 + .../16x16/actions/endeavour-logo-symbolic.svg | 58 + .../hicolor/16x16/actions/equal-symbolic.svg | 68 + .../16x16/actions/fedora-logo-symbolic.svg | 56 + .../16x16/actions/fine-tune-symbolic.svg | 1 + .../hicolor/16x16/actions/fly-symbolic.svg | 70 + .../hicolor/16x16/actions/focus-symbolic.svg | 118 + .../16x16/actions/football-symbolic.svg | 55 + .../16x16/actions/football2-symbolic.svg | 64 + .../16x16/actions/gentoo-logo-symbolic.svg | 35 + .../hicolor/16x16/actions/gnacs-symbolic.svg | 55 + .../actions/gnomemenu-layout-symbolic.svg | 159 + .../actions/gnomeoverview-layout-symbolic.svg | 163 + .../hicolor/16x16/actions/groove-symbolic.svg | 63 + .../hicolor/16x16/actions/heddy-symbolic.svg | 55 + .../hicolor/16x16/actions/helmet-symbolic.svg | 55 + .../16x16/actions/homescreen-symbolic.svg | 3 + .../16x16/actions/icon-preview-symbolic.svg | 70 + .../16x16/actions/info-circle-symbolic.svg | 53 + .../16x16/actions/insider-layout-symbolic.svg | 322 + .../hicolor/16x16/actions/kaaet-symbolic.svg | 55 + .../actions/kali-linux-logo-symbolic.svg | 30 + .../actions/launcher-category-symbolic.svg | 297 + .../actions/launcher-layout-symbolic.svg | 290 + .../16x16/actions/launcher-symbolic.svg | 66 + .../hicolor/16x16/actions/lins-symbolic.svg | 55 + .../16x16/actions/loveheart-symbolic.svg | 55 + .../16x16/actions/manjaro-logo-symbolic.svg | 42 + .../16x16/actions/menu-layouts-symbolic.svg | 61 + .../menu-settings-general-symbolic.svg | 64 + .../16x16/actions/menu-settings-symbolic.svg | 76 + .../16x16/actions/menu-theme-symbolic.svg | 64 + .../16x16/actions/mint-layout-symbolic.svg | 384 + .../hicolor/16x16/actions/misc-symbolic.svg | 42 + .../actions/modern-category-symbolic.svg | 298 + .../16x16/actions/mx-logo-symbolic.svg | 30 + .../16x16/actions/octo-maze-symbolic.svg | 55 + .../16x16/actions/opensuse-logo-symbolic.svg | 55 + .../hicolor/16x16/actions/pac-symbolic.svg | 55 + .../hicolor/16x16/actions/pacman-symbolic.svg | 55 + .../16x16/actions/palette-symbolic.svg | 55 + .../hicolor/16x16/actions/peaks-symbolic.svg | 55 + .../hicolor/16x16/actions/peeks-symbolic.svg | 55 + .../hicolor/16x16/actions/pie-symbolic.svg | 55 + .../16x16/actions/pinned-apps-symbolic.svg | 37 + .../16x16/actions/plasma-layout-symbolic.svg | 438 + .../16x16/actions/pointer-symbolic.svg | 55 + .../16x16/actions/pop-os-logo-symbolic.svg | 30 + .../16x16/actions/pureos-logo-symbolic.svg | 30 + .../16x16/actions/pyrimid-symbolic.svg | 67 + .../16x16/actions/raspbian-logo-symbolic.svg | 30 + .../16x16/actions/raven-layout-symbolic.svg | 307 + .../hicolor/16x16/actions/record-symbolic.svg | 55 + .../16x16/actions/redhat-logo-symbolic.svg | 30 + .../16x16/actions/redmond-layout-symbolic.svg | 610 ++ .../hicolor/16x16/actions/rewind-symbolic.svg | 55 + .../hicolor/16x16/actions/robots-symbolic.svg | 64 + .../hicolor/16x16/actions/round-symbolic.svg | 18 + .../16x16/actions/runner-layout-symbolic.svg | 208 + .../hicolor/16x16/actions/saucer-symbolic.svg | 64 + .../hicolor/16x16/actions/search-symbolic.svg | 55 + .../hicolor/16x16/actions/sheild-symbolic.svg | 63 + .../16x16/actions/shortcuts-symbolic.svg | 64 + .../actions/simple-category-symbolic.svg | 295 + .../16x16/actions/simple-layout-symbolic.svg | 285 + .../16x16/actions/simple2-layout-symbolic.svg | 210 + .../hicolor/16x16/actions/snap-symbolic.svg | 55 + .../16x16/actions/solus-logo-symbolic.svg | 53 + .../hicolor/16x16/actions/somnia-symbolic.svg | 55 + .../16x16/actions/start-box-symbolic.svg | 138 + .../hicolor/16x16/actions/step-symbolic.svg | 55 + .../hicolor/16x16/actions/sums-symbolic.svg | 55 + .../hicolor/16x16/actions/swirl-symbolic.svg | 3 + .../hicolor/16x16/actions/time-symbolic.svg | 55 + .../16x16/actions/tognee-layout-symbolic.svg | 99 + .../16x16/actions/touch-category-symbolic.svg | 543 ++ .../hicolor/16x16/actions/toxic-symbolic.svg | 63 + .../actions/traditional-category-symbolic.svg | 793 ++ .../16x16/actions/transform-symbolic.svg | 55 + .../hicolor/16x16/actions/tree-symbolic.svg | 55 + .../16x16/actions/triple-dash-symbolic.svg | 88 + .../16x16/actions/ubuntu-logo-symbolic.svg | 31 + .../16x16/actions/unity-layout-symbolic.svg | 504 ++ .../hicolor/16x16/actions/utool-symbolic.svg | 55 + .../hicolor/16x16/actions/vancer-symbolic.svg | 55 + .../hicolor/16x16/actions/vibe-symbolic.svg | 55 + .../16x16/actions/voyager-logo-symbolic.svg | 30 + .../16x16/actions/warning-symbolic.svg | 31 + .../16x16/actions/whirl-circle-symbolic.svg | 55 + .../hicolor/16x16/actions/whirl-symbolic.svg | 55 + .../16x16/actions/whisker-layout-symbolic.svg | 392 + .../16x16/actions/windows-layout-symbolic.svg | 86 + .../hicolor/16x16/actions/zegon-symbolic.svg | 63 + .../16x16/actions/zorin-logo-symbolic.svg | 62 + .../icons/prefs_icons/keyboard-symbolic.svg | 52 + .../media/misc/ArcMenuDefaultPresets | 52 + .../arcmenu@arcmenu.com/menuButton.js | 875 ++ .../arcmenu@arcmenu.com/menuWidgets.js | 3693 ++++++++ .../menulayouts/arcmenu.js | 456 + .../arcmenu@arcmenu.com/menulayouts/az.js | 285 + .../menulayouts/baseMenuLayout.js | 1128 +++ .../arcmenu@arcmenu.com/menulayouts/brisk.js | 206 + .../arcmenu@arcmenu.com/menulayouts/budgie.js | 184 + .../menulayouts/chromebook.js | 118 + .../menulayouts/elementary.js | 118 + .../arcmenu@arcmenu.com/menulayouts/eleven.js | 376 + .../menulayouts/gnomemenu.js | 161 + .../menulayouts/insider.js | 337 + .../menulayouts/launcher.js | 465 + .../arcmenu@arcmenu.com/menulayouts/mint.js | 250 + .../arcmenu@arcmenu.com/menulayouts/plasma.js | 453 + .../arcmenu@arcmenu.com/menulayouts/raven.js | 395 + .../menulayouts/redmond.js | 229 + .../arcmenu@arcmenu.com/menulayouts/runner.js | 208 + .../arcmenu@arcmenu.com/menulayouts/simple.js | 159 + .../menulayouts/simple2.js | 179 + .../arcmenu@arcmenu.com/menulayouts/tognee.js | 290 + .../menulayouts/tweaks/tweaks.js | 1286 +++ .../arcmenu@arcmenu.com/menulayouts/unity.js | 445 + .../menulayouts/whisker.js | 187 + .../menulayouts/windows.js | 465 + .../arcmenu@arcmenu.com/metadata.json | 15 + .../arcmenu@arcmenu.com/placeDisplay.js | 764 ++ .../arcmenu@arcmenu.com/prefs.js | 6786 +++++++++++++++ .../arcmenu@arcmenu.com/prefsWidgets.js | 793 ++ .../arcmenu@arcmenu.com/recentFilesManager.js | 111 + .../schemas/gschemas.compiled | Bin 0 -> 12620 bytes ...gnome.shell.extensions.arcmenu.gschema.xml | 799 ++ .../arcmenu@arcmenu.com/search.js | 872 ++ .../searchProviders/openWindows.js | 93 + .../searchProviders/recentFiles.js | 100 + .../arcmenu@arcmenu.com/standaloneRunner.js | 376 + .../arcmenu@arcmenu.com/utils.js | 687 ++ .../blur-my-shell@aunetx/appfolders.js | 225 + .../blur-my-shell@aunetx/applications.js | 274 + .../blur-my-shell@aunetx/connections.js | 81 + .../blur-my-shell@aunetx/dash.js | 51 + .../blur-my-shell@aunetx/dash_to_dock.js | 235 + .../blur-my-shell@aunetx/extension.js | 224 + .../blur-my-shell@aunetx/lockscreen.js | 64 + .../blur-my-shell@aunetx/metadata.json | 12 + .../blur-my-shell@aunetx/overview.js | 161 + .../blur-my-shell@aunetx/paint_signals.js | 59 + .../blur-my-shell@aunetx/panel.js | 245 + .../blur-my-shell@aunetx/prefs.js | 187 + .../blur-my-shell@aunetx/prefs.ui | 410 + .../schemas/gschemas.compiled | Bin 0 -> 1064 bytes ...shell.extensions.blur-my-shell.gschema.xml | 95 + .../blur-my-shell@aunetx/settings.js | 274 + .../blur-my-shell@aunetx/stylesheet.css | 436 + .../blur-my-shell@aunetx/utilities.js | 39 + .../blur-my-shell@aunetx/window_list.js | 128 + .../dash-to-panel@jderose9.github.com/COPYING | 341 + .../README.md | 189 + .../Settings.ui | 7508 +++++++++++++++++ .../appIcons.js | 1964 +++++ .../convenience.js | 89 + .../extension.js | 149 + .../img/highlight_stacked_bg.svg | 7 + .../img/highlight_stacked_bg_2.svg | 7 + .../img/highlight_stacked_bg_3.svg | 7 + .../intellihide.js | 401 + .../locale/cs/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23608 bytes .../locale/de/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23744 bytes .../locale/es/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24908 bytes .../locale/fr/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 25001 bytes .../locale/gl/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 25609 bytes .../locale/hu/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 26323 bytes .../locale/it/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 28449 bytes .../locale/ja/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 27840 bytes .../locale/kk/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 15501 bytes .../locale/pl/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24761 bytes .../locale/pt_BR/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 8464 bytes .../locale/ru/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 30089 bytes .../locale/sv/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24167 bytes .../locale/tr/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24795 bytes .../locale/uk/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 10635 bytes .../locale/zh_CN/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23083 bytes .../locale/zh_TW/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 19323 bytes .../metadata.json | 13 + .../overview.js | 708 ++ .../panel.js | 1512 ++++ .../panelManager.js | 789 ++ .../panelPositions.js | 61 + .../panelSettings.js | 112 + .../panelStyle.js | 326 + .../prefs.js | 2468 ++++++ .../progress.js | 598 ++ .../proximity.js | 262 + .../schemas/gschemas.compiled | Bin 0 -> 17276 bytes ...shell.extensions.dash-to-panel.gschema.xml | 1278 +++ .../stylesheet.css | 151 + .../taskbar.js | 1557 ++++ .../transparency.js | 269 + .../utils.js | 1040 +++ .../windowPreview.js | 1145 +++ .../gnome-ui-tune@itstime.tech/LICENSE | 674 ++ .../gnome-ui-tune@itstime.tech/extension.js | 52 + .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 873 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 519 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 920 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 918 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 736 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 827 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 709 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 867 bytes .../gnome-ui-tune@itstime.tech/metadata.json | 14 + .../gnome-ui-tune@itstime.tech/prefs.js | 55 + .../schemas/gschemas.compiled | Bin 0 -> 564 bytes ...shell.extensions.gnome-ui-tune.gschema.xml | 30 + .../gnome-ui-tune@itstime.tech/src/mod.js | 8 + .../src/modAlwaysShowThumbnails.js | 21 + .../src/modFirefoxPipInOverview.js | 22 + .../src/modHideSearchInput.js | 30 + .../src/modRestoreThumbnailsBackground.js | 73 + .../src/modScaleThumbnails.js | 40 + .../src/modsList.js | 23 + .../README | 6 + .../compat.js | 51 + .../convenience.js | 94 + .../extension.js | 2592 ++++++ .../gpu_usage.sh | 49 + .../locale/ar/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4303 bytes .../locale/ca/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4243 bytes .../locale/cs/LC_MESSAGES/system-monitor.mo | Bin 0 -> 3909 bytes .../locale/de/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4208 bytes .../es_ES/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4264 bytes .../es_MX/LC_MESSAGES/system-monitor.mo | Bin 0 -> 1962 bytes .../locale/fa/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2536 bytes .../locale/fi/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4250 bytes .../locale/fr/LC_MESSAGES/system-monitor.mo | Bin 0 -> 6292 bytes .../locale/hu/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5927 bytes .../locale/it/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4330 bytes .../locale/ja/LC_MESSAGES/system-monitor.mo | Bin 0 -> 3639 bytes .../locale/ko/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5643 bytes .../nl_NL/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4335 bytes .../locale/pl/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2228 bytes .../locale/pt/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4246 bytes .../pt_BR/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4265 bytes .../locale/ro/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2186 bytes .../locale/ru/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4672 bytes .../locale/sk/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4331 bytes .../locale/tr/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4412 bytes .../locale/uk/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4835 bytes .../zh_CN/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5603 bytes .../metadata.json | 19 + .../prefs.js | 553 ++ .../schemas/gschemas.compiled | Bin 0 -> 6516 bytes ...hell.extensions.system-monitor.gschema.xml | 463 + .../stylesheet.css | 204 + .../nautilus-extensions/nautilus-copy-path.py | 4 + .../nautilus-copy-path/config.json | 11 + .../nautilus-copy-path/nautilus_copy_path.py | 73 + .../nautilus-copy-path/translation.py | 52 + .../nautilus-copy-path/translations/ar.json | 8 + .../nautilus-copy-path/translations/da.json | 8 + .../nautilus-copy-path/translations/de.json | 8 + .../nautilus-copy-path/translations/el.json | 8 + .../nautilus-copy-path/translations/en.json | 8 + .../nautilus-copy-path/translations/es.json | 6 + .../nautilus-copy-path/translations/fr.json | 6 + .../nautilus-copy-path/translations/it.json | 6 + .../nautilus-copy-path/translations/ja.json | 8 + .../nautilus-copy-path/translations/no.json | 8 + .../nautilus-copy-path/translations/pl.json | 8 + .../nautilus-copy-path/translations/pt.json | 8 + .../nautilus-copy-path/translations/ro.json | 6 + .../nautilus-copy-path/translations/ru.json | 8 + .../nautilus-copy-path/translations/se.json | 8 + .../nautilus-copy-path/translations/tr.json | 8 + .../nautilus-copy-path/translations/zh.json | 8 + .../arcmenu@arcmenu.com/COPYING | 341 + .../arcmenu@arcmenu.com/README.md | 148 + .../arcmenu@arcmenu.com/constants.js | 460 + .../arcmenu@arcmenu.com/controller.js | 749 ++ .../arcmenu@arcmenu.com/extension.js | 307 + .../arcmenu@arcmenu.com/helper.js | 227 + .../locale/ar/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3183 bytes .../locale/be/LC_MESSAGES/arcmenu.mo | Bin 0 -> 33098 bytes .../locale/bg/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3558 bytes .../locale/ca/LC_MESSAGES/arcmenu.mo | Bin 0 -> 8686 bytes .../locale/cs/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22694 bytes .../locale/de/LC_MESSAGES/arcmenu.mo | Bin 0 -> 24301 bytes .../locale/el/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3839 bytes .../locale/es/LC_MESSAGES/arcmenu.mo | Bin 0 -> 10223 bytes .../locale/et/LC_MESSAGES/arcmenu.mo | Bin 0 -> 9736 bytes .../locale/fi/LC_MESSAGES/arcmenu.mo | Bin 0 -> 20844 bytes .../locale/fr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 25058 bytes .../locale/he/LC_MESSAGES/arcmenu.mo | Bin 0 -> 26175 bytes .../locale/hi_IN/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3965 bytes .../locale/hu/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27574 bytes .../locale/id/LC_MESSAGES/arcmenu.mo | Bin 0 -> 2833 bytes .../locale/it/LC_MESSAGES/arcmenu.mo | Bin 0 -> 21817 bytes .../locale/ja/LC_MESSAGES/arcmenu.mo | Bin 0 -> 24719 bytes .../locale/ko/LC_MESSAGES/arcmenu.mo | Bin 0 -> 19547 bytes .../locale/nb_NO/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27590 bytes .../locale/nl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 28553 bytes .../locale/oc/LC_MESSAGES/arcmenu.mo | Bin 0 -> 10147 bytes .../locale/pl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 6996 bytes .../locale/pt_BR/LC_MESSAGES/arcmenu.mo | Bin 0 -> 31167 bytes .../locale/ru/LC_MESSAGES/arcmenu.mo | Bin 0 -> 31187 bytes .../locale/si/LC_MESSAGES/arcmenu.mo | Bin 0 -> 18243 bytes .../locale/sk/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22565 bytes .../locale/sr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3628 bytes .../locale/sr@latin/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3009 bytes .../locale/sv/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22003 bytes .../locale/szl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 7140 bytes .../locale/tr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27502 bytes .../locale/uk/LC_MESSAGES/arcmenu.mo | Bin 0 -> 12578 bytes .../locale/zh_CN/LC_MESSAGES/arcmenu.mo | Bin 0 -> 9402 bytes .../locale/zh_TW/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27158 bytes .../arcmenu@arcmenu.com/media/.keep | 0 .../distro_icons/arch-logo-symbolic.svg | 30 + .../distro_icons/budgie-logo-symbolic.svg | 55 + .../distro_icons/debian-logo-symbolic.svg | 55 + .../distro_icons/endeavour-logo-symbolic.svg | 58 + .../distro_icons/fedora-logo-symbolic.svg | 56 + .../distro_icons/gentoo-logo-symbolic.svg | 35 + .../distro_icons/kali-linux-logo-symbolic.svg | 30 + .../distro_icons/manjaro-logo-symbolic.svg | 42 + .../distro_icons/mx-logo-symbolic.svg | 30 + .../distro_icons/opensuse-logo-symbolic.svg | 55 + .../distro_icons/pop-os-logo-symbolic.svg | 30 + .../distro_icons/pureos-logo-symbolic.svg | 30 + .../distro_icons/raspbian-logo-symbolic.svg | 30 + .../distro_icons/redhat-logo-symbolic.svg | 30 + .../distro_icons/solus-logo-symbolic.svg | 53 + .../distro_icons/ubuntu-logo-symbolic.svg | 31 + .../distro_icons/voyager-logo-symbolic.svg | 30 + .../distro_icons/zorin-logo-symbolic.svg | 62 + .../menu_button_icons/icons/3d-symbolic.svg | 55 + .../menu_button_icons/icons/a-symbolic.svg | 55 + .../icons/alien-symbolic.svg | 55 + .../icons/app-launcher-symbolic.svg | 55 + .../menu_button_icons/icons/apps-symbolic.svg | 71 + .../icons/arc-menu-alt-symbolic.svg | 66 + .../icons/arc-menu-old-symbolic.svg | 68 + .../icons/arc-menu-old2-symbolic.svg | 103 + .../icons/arcmenu-logo-alt-symbolic.svg | 62 + .../icons/arcmenu-logo-symbolic.svg | 92 + .../icons/arrow-symbolic.svg | 55 + .../menu_button_icons/icons/bat-symbolic.svg | 55 + .../menu_button_icons/icons/bug-symbolic.svg | 63 + .../menu_button_icons/icons/cita-symbolic.svg | 55 + .../icons/cloud-symbolic.svg | 63 + .../icons/curved-a-symbolic.svg | 55 + .../icons/diamond-square-symbolic.svg | 55 + .../icons/dimond-win-symbolic.svg | 55 + .../icons/dolphin-symbolic.svg | 55 + .../menu_button_icons/icons/dota-symbolic.svg | 55 + .../menu_button_icons/icons/dra-symbolic.svg | 55 + .../icons/dragon-symbolic.svg | 55 + .../icons/dragonheart-symbolic.svg | 63 + .../icons/eclipse-symbolic.svg | 55 + .../icons/equal-symbolic.svg | 68 + .../menu_button_icons/icons/fly-symbolic.svg | 70 + .../icons/focus-symbolic.svg | 118 + .../icons/football-symbolic.svg | 55 + .../icons/football2-symbolic.svg | 64 + .../icons/gnacs-symbolic.svg | 55 + .../icons/groove-symbolic.svg | 63 + .../icons/heddy-symbolic.svg | 55 + .../icons/helmet-symbolic.svg | 55 + .../icons/kaaet-symbolic.svg | 55 + .../icons/launcher-symbolic.svg | 66 + .../menu_button_icons/icons/lins-symbolic.svg | 55 + .../icons/loveheart-symbolic.svg | 55 + .../icons/octo-maze-symbolic.svg | 55 + .../menu_button_icons/icons/pac-symbolic.svg | 55 + .../icons/pacman-symbolic.svg | 55 + .../icons/palette-symbolic.svg | 55 + .../icons/peaks-symbolic.svg | 55 + .../icons/peeks-symbolic.svg | 55 + .../menu_button_icons/icons/pie-symbolic.svg | 55 + .../icons/pointer-symbolic.svg | 55 + .../icons/pyrimid-symbolic.svg | 67 + .../icons/record-symbolic.svg | 55 + .../icons/rewind-symbolic.svg | 55 + .../icons/robots-symbolic.svg | 64 + .../icons/round-symbolic.svg | 18 + .../icons/saucer-symbolic.svg | 64 + .../icons/search-symbolic.svg | 55 + .../icons/sheild-symbolic.svg | 63 + .../menu_button_icons/icons/snap-symbolic.svg | 55 + .../icons/somnia-symbolic.svg | 55 + .../icons/start-box-symbolic.svg | 138 + .../menu_button_icons/icons/step-symbolic.svg | 55 + .../menu_button_icons/icons/sums-symbolic.svg | 55 + .../icons/swirl-symbolic.svg | 3 + .../menu_button_icons/icons/time-symbolic.svg | 55 + .../icons/toxic-symbolic.svg | 63 + .../icons/transform-symbolic.svg | 55 + .../menu_button_icons/icons/tree-symbolic.svg | 55 + .../icons/triple-dash-symbolic.svg | 88 + .../icons/utool-symbolic.svg | 55 + .../icons/vancer-symbolic.svg | 55 + .../menu_button_icons/icons/vibe-symbolic.svg | 55 + .../icons/whirl-circle-symbolic.svg | 55 + .../icons/whirl-symbolic.svg | 55 + .../icons/zegon-symbolic.svg | 63 + .../icons/menu_icons/arc-menu-symbolic.svg | 93 + .../icons/menu_icons/hamburger-symbolic.svg | 1 + .../icons/menu_icons/homescreen-symbolic.svg | 3 + .../media/icons/menu_icons/sleep-symbolic.svg | 67 + .../media/icons/prefs_icons/arc-menu-logo.svg | 1412 ++++ .../media/icons/prefs_icons/donate-icon.svg | 158 + .../media/icons/prefs_icons/gitlab-icon.svg | 408 + .../hicolor/16x16/actions/3D-symbolic.svg | 63 + .../hicolor/16x16/actions/a-symbolic.svg | 55 + .../hicolor/16x16/actions/alien-symbolic.svg | 55 + .../actions/alternative-category-symbolic.svg | 287 + .../16x16/actions/app-launcher-symbolic.svg | 55 + .../hicolor/16x16/actions/apps-symbolic.svg | 71 + .../16x16/actions/arc-menu-alt-symbolic.svg | 66 + .../16x16/actions/arc-menu-old-symbolic.svg | 68 + .../16x16/actions/arc-menu-old2-symbolic.svg | 103 + .../16x16/actions/arc-menu-symbolic.svg | 93 + .../16x16/actions/arch-logo-symbolic.svg | 30 + .../16x16/actions/arcmenu-layout-symbolic.svg | 330 + .../actions/arcmenu-logo-alt-symbolic.svg | 62 + .../16x16/actions/arcmenu-logo-symbolic.svg | 92 + .../hicolor/16x16/actions/arrow-symbolic.svg | 55 + .../16x16/actions/az-layout-symbolic.svg | 312 + .../hicolor/16x16/actions/bat-symbolic.svg | 55 + .../16x16/actions/brisk-layout-symbolic.svg | 328 + .../16x16/actions/browse-presets-symbolic.svg | 60 + .../16x16/actions/budgie-layout-symbolic.svg | 202 + .../16x16/actions/budgie-logo-symbolic.svg | 55 + .../hicolor/16x16/actions/bug-symbolic.svg | 63 + .../actions/button-appearance-symbolic.svg | 45 + .../16x16/actions/categories-symbolic.svg | 87 + .../actions/chromebook-layout-symbolic.svg | 227 + .../hicolor/16x16/actions/cita-symbolic.svg | 55 + .../hicolor/16x16/actions/cloud-symbolic.svg | 63 + .../16x16/actions/curved-a-symbolic.svg | 55 + .../16x16/actions/debian-logo-symbolic.svg | 55 + .../16x16/actions/diamond-square-symbolic.svg | 55 + .../16x16/actions/dimond-win-symbolic.svg | 55 + .../16x16/actions/dolphin-symbolic.svg | 55 + .../hicolor/16x16/actions/dota-symbolic.svg | 55 + .../hicolor/16x16/actions/dra-symbolic.svg | 55 + .../hicolor/16x16/actions/drag-symbolic.svg | 65 + .../hicolor/16x16/actions/dragon-symbolic.svg | 55 + .../16x16/actions/dragonheart-symbolic.svg | 63 + .../16x16/actions/eclipse-symbolic.svg | 55 + .../actions/elementary-layout-symbolic.svg | 285 + .../16x16/actions/eleven-layout-symbolic.svg | 219 + .../16x16/actions/endeavour-logo-symbolic.svg | 58 + .../hicolor/16x16/actions/equal-symbolic.svg | 68 + .../16x16/actions/fedora-logo-symbolic.svg | 56 + .../16x16/actions/fine-tune-symbolic.svg | 1 + .../hicolor/16x16/actions/fly-symbolic.svg | 70 + .../hicolor/16x16/actions/focus-symbolic.svg | 118 + .../16x16/actions/football-symbolic.svg | 55 + .../16x16/actions/football2-symbolic.svg | 64 + .../16x16/actions/gentoo-logo-symbolic.svg | 35 + .../hicolor/16x16/actions/gnacs-symbolic.svg | 55 + .../actions/gnomemenu-layout-symbolic.svg | 159 + .../actions/gnomeoverview-layout-symbolic.svg | 163 + .../hicolor/16x16/actions/groove-symbolic.svg | 63 + .../hicolor/16x16/actions/heddy-symbolic.svg | 55 + .../hicolor/16x16/actions/helmet-symbolic.svg | 55 + .../16x16/actions/homescreen-symbolic.svg | 3 + .../16x16/actions/icon-preview-symbolic.svg | 70 + .../16x16/actions/info-circle-symbolic.svg | 53 + .../16x16/actions/insider-layout-symbolic.svg | 322 + .../hicolor/16x16/actions/kaaet-symbolic.svg | 55 + .../actions/kali-linux-logo-symbolic.svg | 30 + .../actions/launcher-category-symbolic.svg | 297 + .../actions/launcher-layout-symbolic.svg | 290 + .../16x16/actions/launcher-symbolic.svg | 66 + .../hicolor/16x16/actions/lins-symbolic.svg | 55 + .../16x16/actions/loveheart-symbolic.svg | 55 + .../16x16/actions/manjaro-logo-symbolic.svg | 42 + .../16x16/actions/menu-layouts-symbolic.svg | 61 + .../menu-settings-general-symbolic.svg | 64 + .../16x16/actions/menu-settings-symbolic.svg | 76 + .../16x16/actions/menu-theme-symbolic.svg | 64 + .../16x16/actions/mint-layout-symbolic.svg | 384 + .../hicolor/16x16/actions/misc-symbolic.svg | 42 + .../actions/modern-category-symbolic.svg | 298 + .../16x16/actions/mx-logo-symbolic.svg | 30 + .../16x16/actions/octo-maze-symbolic.svg | 55 + .../16x16/actions/opensuse-logo-symbolic.svg | 55 + .../hicolor/16x16/actions/pac-symbolic.svg | 55 + .../hicolor/16x16/actions/pacman-symbolic.svg | 55 + .../16x16/actions/palette-symbolic.svg | 55 + .../hicolor/16x16/actions/peaks-symbolic.svg | 55 + .../hicolor/16x16/actions/peeks-symbolic.svg | 55 + .../hicolor/16x16/actions/pie-symbolic.svg | 55 + .../16x16/actions/pinned-apps-symbolic.svg | 37 + .../16x16/actions/plasma-layout-symbolic.svg | 438 + .../16x16/actions/pointer-symbolic.svg | 55 + .../16x16/actions/pop-os-logo-symbolic.svg | 30 + .../16x16/actions/pureos-logo-symbolic.svg | 30 + .../16x16/actions/pyrimid-symbolic.svg | 67 + .../16x16/actions/raspbian-logo-symbolic.svg | 30 + .../16x16/actions/raven-layout-symbolic.svg | 307 + .../hicolor/16x16/actions/record-symbolic.svg | 55 + .../16x16/actions/redhat-logo-symbolic.svg | 30 + .../16x16/actions/redmond-layout-symbolic.svg | 610 ++ .../hicolor/16x16/actions/rewind-symbolic.svg | 55 + .../hicolor/16x16/actions/robots-symbolic.svg | 64 + .../hicolor/16x16/actions/round-symbolic.svg | 18 + .../16x16/actions/runner-layout-symbolic.svg | 208 + .../hicolor/16x16/actions/saucer-symbolic.svg | 64 + .../hicolor/16x16/actions/search-symbolic.svg | 55 + .../hicolor/16x16/actions/sheild-symbolic.svg | 63 + .../16x16/actions/shortcuts-symbolic.svg | 64 + .../actions/simple-category-symbolic.svg | 295 + .../16x16/actions/simple-layout-symbolic.svg | 285 + .../16x16/actions/simple2-layout-symbolic.svg | 210 + .../hicolor/16x16/actions/snap-symbolic.svg | 55 + .../16x16/actions/solus-logo-symbolic.svg | 53 + .../hicolor/16x16/actions/somnia-symbolic.svg | 55 + .../16x16/actions/start-box-symbolic.svg | 138 + .../hicolor/16x16/actions/step-symbolic.svg | 55 + .../hicolor/16x16/actions/sums-symbolic.svg | 55 + .../hicolor/16x16/actions/swirl-symbolic.svg | 3 + .../hicolor/16x16/actions/time-symbolic.svg | 55 + .../16x16/actions/tognee-layout-symbolic.svg | 99 + .../16x16/actions/touch-category-symbolic.svg | 543 ++ .../hicolor/16x16/actions/toxic-symbolic.svg | 63 + .../actions/traditional-category-symbolic.svg | 793 ++ .../16x16/actions/transform-symbolic.svg | 55 + .../hicolor/16x16/actions/tree-symbolic.svg | 55 + .../16x16/actions/triple-dash-symbolic.svg | 88 + .../16x16/actions/ubuntu-logo-symbolic.svg | 31 + .../16x16/actions/unity-layout-symbolic.svg | 504 ++ .../hicolor/16x16/actions/utool-symbolic.svg | 55 + .../hicolor/16x16/actions/vancer-symbolic.svg | 55 + .../hicolor/16x16/actions/vibe-symbolic.svg | 55 + .../16x16/actions/voyager-logo-symbolic.svg | 30 + .../16x16/actions/warning-symbolic.svg | 31 + .../16x16/actions/whirl-circle-symbolic.svg | 55 + .../hicolor/16x16/actions/whirl-symbolic.svg | 55 + .../16x16/actions/whisker-layout-symbolic.svg | 392 + .../16x16/actions/windows-layout-symbolic.svg | 86 + .../hicolor/16x16/actions/zegon-symbolic.svg | 63 + .../16x16/actions/zorin-logo-symbolic.svg | 62 + .../icons/prefs_icons/keyboard-symbolic.svg | 52 + .../media/misc/ArcMenuDefaultPresets | 52 + .../arcmenu@arcmenu.com/menuButton.js | 875 ++ .../arcmenu@arcmenu.com/menuWidgets.js | 3693 ++++++++ .../menulayouts/arcmenu.js | 456 + .../arcmenu@arcmenu.com/menulayouts/az.js | 285 + .../menulayouts/baseMenuLayout.js | 1128 +++ .../arcmenu@arcmenu.com/menulayouts/brisk.js | 206 + .../arcmenu@arcmenu.com/menulayouts/budgie.js | 184 + .../menulayouts/chromebook.js | 118 + .../menulayouts/elementary.js | 118 + .../arcmenu@arcmenu.com/menulayouts/eleven.js | 376 + .../menulayouts/gnomemenu.js | 161 + .../menulayouts/insider.js | 337 + .../menulayouts/launcher.js | 465 + .../arcmenu@arcmenu.com/menulayouts/mint.js | 250 + .../arcmenu@arcmenu.com/menulayouts/plasma.js | 453 + .../arcmenu@arcmenu.com/menulayouts/raven.js | 395 + .../menulayouts/redmond.js | 229 + .../arcmenu@arcmenu.com/menulayouts/runner.js | 208 + .../arcmenu@arcmenu.com/menulayouts/simple.js | 159 + .../menulayouts/simple2.js | 179 + .../arcmenu@arcmenu.com/menulayouts/tognee.js | 290 + .../menulayouts/tweaks/tweaks.js | 1286 +++ .../arcmenu@arcmenu.com/menulayouts/unity.js | 445 + .../menulayouts/whisker.js | 187 + .../menulayouts/windows.js | 465 + .../arcmenu@arcmenu.com/metadata.json | 15 + .../arcmenu@arcmenu.com/placeDisplay.js | 764 ++ .../arcmenu@arcmenu.com/prefs.js | 6786 +++++++++++++++ .../arcmenu@arcmenu.com/prefsWidgets.js | 793 ++ .../arcmenu@arcmenu.com/recentFilesManager.js | 111 + .../schemas/gschemas.compiled | Bin 0 -> 12620 bytes ...gnome.shell.extensions.arcmenu.gschema.xml | 799 ++ .../arcmenu@arcmenu.com/search.js | 872 ++ .../searchProviders/openWindows.js | 93 + .../searchProviders/recentFiles.js | 100 + .../arcmenu@arcmenu.com/standaloneRunner.js | 376 + .../arcmenu@arcmenu.com/utils.js | 687 ++ .../blur-my-shell@aunetx/appfolders.js | 225 + .../blur-my-shell@aunetx/applications.js | 274 + .../blur-my-shell@aunetx/connections.js | 81 + .../blur-my-shell@aunetx/dash.js | 51 + .../blur-my-shell@aunetx/dash_to_dock.js | 235 + .../blur-my-shell@aunetx/extension.js | 224 + .../blur-my-shell@aunetx/lockscreen.js | 64 + .../blur-my-shell@aunetx/metadata.json | 12 + .../blur-my-shell@aunetx/overview.js | 161 + .../blur-my-shell@aunetx/paint_signals.js | 59 + .../blur-my-shell@aunetx/panel.js | 245 + .../blur-my-shell@aunetx/prefs.js | 187 + .../blur-my-shell@aunetx/prefs.ui | 410 + .../schemas/gschemas.compiled | Bin 0 -> 1064 bytes ...shell.extensions.blur-my-shell.gschema.xml | 95 + .../blur-my-shell@aunetx/settings.js | 274 + .../blur-my-shell@aunetx/stylesheet.css | 436 + .../blur-my-shell@aunetx/utilities.js | 39 + .../blur-my-shell@aunetx/window_list.js | 128 + .../dash-to-panel@jderose9.github.com/COPYING | 341 + .../README.md | 189 + .../Settings.ui | 7508 +++++++++++++++++ .../appIcons.js | 1964 +++++ .../convenience.js | 89 + .../extension.js | 149 + .../img/highlight_stacked_bg.svg | 7 + .../img/highlight_stacked_bg_2.svg | 7 + .../img/highlight_stacked_bg_3.svg | 7 + .../intellihide.js | 401 + .../locale/cs/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23608 bytes .../locale/de/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23744 bytes .../locale/es/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24908 bytes .../locale/fr/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 25001 bytes .../locale/gl/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 25609 bytes .../locale/hu/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 26323 bytes .../locale/it/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 28449 bytes .../locale/ja/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 27840 bytes .../locale/kk/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 15501 bytes .../locale/pl/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24761 bytes .../locale/pt_BR/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 8464 bytes .../locale/ru/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 30089 bytes .../locale/sv/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24167 bytes .../locale/tr/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24795 bytes .../locale/uk/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 10635 bytes .../locale/zh_CN/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23083 bytes .../locale/zh_TW/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 19323 bytes .../metadata.json | 13 + .../overview.js | 708 ++ .../panel.js | 1512 ++++ .../panelManager.js | 789 ++ .../panelPositions.js | 61 + .../panelSettings.js | 112 + .../panelStyle.js | 326 + .../prefs.js | 2468 ++++++ .../progress.js | 598 ++ .../proximity.js | 262 + .../schemas/gschemas.compiled | Bin 0 -> 17276 bytes ...shell.extensions.dash-to-panel.gschema.xml | 1278 +++ .../stylesheet.css | 151 + .../taskbar.js | 1557 ++++ .../transparency.js | 269 + .../utils.js | 1040 +++ .../windowPreview.js | 1145 +++ .../gnome-ui-tune@itstime.tech/LICENSE | 674 ++ .../gnome-ui-tune@itstime.tech/extension.js | 52 + .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 873 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 519 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 920 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 918 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 736 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 827 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 709 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 867 bytes .../gnome-ui-tune@itstime.tech/metadata.json | 14 + .../gnome-ui-tune@itstime.tech/prefs.js | 55 + .../schemas/gschemas.compiled | Bin 0 -> 564 bytes ...shell.extensions.gnome-ui-tune.gschema.xml | 30 + .../gnome-ui-tune@itstime.tech/src/mod.js | 8 + .../src/modAlwaysShowThumbnails.js | 21 + .../src/modFirefoxPipInOverview.js | 22 + .../src/modHideSearchInput.js | 30 + .../src/modRestoreThumbnailsBackground.js | 73 + .../src/modScaleThumbnails.js | 40 + .../src/modsList.js | 23 + .../README | 6 + .../compat.js | 51 + .../convenience.js | 94 + .../extension.js | 2592 ++++++ .../gpu_usage.sh | 49 + .../locale/ar/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4303 bytes .../locale/ca/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4243 bytes .../locale/cs/LC_MESSAGES/system-monitor.mo | Bin 0 -> 3909 bytes .../locale/de/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4208 bytes .../es_ES/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4264 bytes .../es_MX/LC_MESSAGES/system-monitor.mo | Bin 0 -> 1962 bytes .../locale/fa/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2536 bytes .../locale/fi/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4250 bytes .../locale/fr/LC_MESSAGES/system-monitor.mo | Bin 0 -> 6292 bytes .../locale/hu/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5927 bytes .../locale/it/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4330 bytes .../locale/ja/LC_MESSAGES/system-monitor.mo | Bin 0 -> 3639 bytes .../locale/ko/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5643 bytes .../nl_NL/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4335 bytes .../locale/pl/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2228 bytes .../locale/pt/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4246 bytes .../pt_BR/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4265 bytes .../locale/ro/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2186 bytes .../locale/ru/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4672 bytes .../locale/sk/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4331 bytes .../locale/tr/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4412 bytes .../locale/uk/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4835 bytes .../zh_CN/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5603 bytes .../metadata.json | 19 + .../prefs.js | 553 ++ .../schemas/gschemas.compiled | Bin 0 -> 6516 bytes ...hell.extensions.system-monitor.gschema.xml | 463 + .../stylesheet.css | 204 + UIDev/ansibleshed/gnome-ui-setup.yaml | 83 + .../nautilus-extensions/nautilus-copy-path.py | 4 + .../nautilus-copy-path/config.json | 11 + .../nautilus-copy-path/nautilus_copy_path.py | 73 + .../nautilus-copy-path/translation.py | 52 + .../nautilus-copy-path/translations/ar.json | 8 + .../nautilus-copy-path/translations/da.json | 8 + .../nautilus-copy-path/translations/de.json | 8 + .../nautilus-copy-path/translations/el.json | 8 + .../nautilus-copy-path/translations/en.json | 8 + .../nautilus-copy-path/translations/es.json | 6 + .../nautilus-copy-path/translations/fr.json | 6 + .../nautilus-copy-path/translations/it.json | 6 + .../nautilus-copy-path/translations/ja.json | 8 + .../nautilus-copy-path/translations/no.json | 8 + .../nautilus-copy-path/translations/pl.json | 8 + .../nautilus-copy-path/translations/pt.json | 8 + .../nautilus-copy-path/translations/ro.json | 6 + .../nautilus-copy-path/translations/ru.json | 8 + .../nautilus-copy-path/translations/se.json | 8 + .../nautilus-copy-path/translations/tr.json | 8 + .../nautilus-copy-path/translations/zh.json | 8 + UIDev/ansibleshed/script_to_convert.sh | 44 + src/almalinux-creative-installer | 115 + src/almalinux-creative-installer-helper | 88 + src/gnome-ui/01-creative_gnome_defaults | 96 + .../arcmenu@arcmenu.com/COPYING | 341 + .../arcmenu@arcmenu.com/README.md | 148 + .../arcmenu@arcmenu.com/constants.js | 460 + .../arcmenu@arcmenu.com/controller.js | 749 ++ .../arcmenu@arcmenu.com/extension.js | 307 + .../arcmenu@arcmenu.com/helper.js | 227 + .../locale/ar/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3183 bytes .../locale/be/LC_MESSAGES/arcmenu.mo | Bin 0 -> 33098 bytes .../locale/bg/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3558 bytes .../locale/ca/LC_MESSAGES/arcmenu.mo | Bin 0 -> 8686 bytes .../locale/cs/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22694 bytes .../locale/de/LC_MESSAGES/arcmenu.mo | Bin 0 -> 24301 bytes .../locale/el/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3839 bytes .../locale/es/LC_MESSAGES/arcmenu.mo | Bin 0 -> 10223 bytes .../locale/et/LC_MESSAGES/arcmenu.mo | Bin 0 -> 9736 bytes .../locale/fi/LC_MESSAGES/arcmenu.mo | Bin 0 -> 20844 bytes .../locale/fr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 25058 bytes .../locale/he/LC_MESSAGES/arcmenu.mo | Bin 0 -> 26175 bytes .../locale/hi_IN/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3965 bytes .../locale/hu/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27574 bytes .../locale/id/LC_MESSAGES/arcmenu.mo | Bin 0 -> 2833 bytes .../locale/it/LC_MESSAGES/arcmenu.mo | Bin 0 -> 21817 bytes .../locale/ja/LC_MESSAGES/arcmenu.mo | Bin 0 -> 24719 bytes .../locale/ko/LC_MESSAGES/arcmenu.mo | Bin 0 -> 19547 bytes .../locale/nb_NO/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27590 bytes .../locale/nl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 28553 bytes .../locale/oc/LC_MESSAGES/arcmenu.mo | Bin 0 -> 10147 bytes .../locale/pl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 6996 bytes .../locale/pt_BR/LC_MESSAGES/arcmenu.mo | Bin 0 -> 31167 bytes .../locale/ru/LC_MESSAGES/arcmenu.mo | Bin 0 -> 31187 bytes .../locale/si/LC_MESSAGES/arcmenu.mo | Bin 0 -> 18243 bytes .../locale/sk/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22565 bytes .../locale/sr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3628 bytes .../locale/sr@latin/LC_MESSAGES/arcmenu.mo | Bin 0 -> 3009 bytes .../locale/sv/LC_MESSAGES/arcmenu.mo | Bin 0 -> 22003 bytes .../locale/szl/LC_MESSAGES/arcmenu.mo | Bin 0 -> 7140 bytes .../locale/tr/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27502 bytes .../locale/uk/LC_MESSAGES/arcmenu.mo | Bin 0 -> 12578 bytes .../locale/zh_CN/LC_MESSAGES/arcmenu.mo | Bin 0 -> 9402 bytes .../locale/zh_TW/LC_MESSAGES/arcmenu.mo | Bin 0 -> 27158 bytes .../arcmenu@arcmenu.com/media/.keep | 0 .../distro_icons/arch-logo-symbolic.svg | 30 + .../distro_icons/budgie-logo-symbolic.svg | 55 + .../distro_icons/debian-logo-symbolic.svg | 55 + .../distro_icons/endeavour-logo-symbolic.svg | 58 + .../distro_icons/fedora-logo-symbolic.svg | 56 + .../distro_icons/gentoo-logo-symbolic.svg | 35 + .../distro_icons/kali-linux-logo-symbolic.svg | 30 + .../distro_icons/manjaro-logo-symbolic.svg | 42 + .../distro_icons/mx-logo-symbolic.svg | 30 + .../distro_icons/opensuse-logo-symbolic.svg | 55 + .../distro_icons/pop-os-logo-symbolic.svg | 30 + .../distro_icons/pureos-logo-symbolic.svg | 30 + .../distro_icons/raspbian-logo-symbolic.svg | 30 + .../distro_icons/redhat-logo-symbolic.svg | 30 + .../distro_icons/solus-logo-symbolic.svg | 53 + .../distro_icons/ubuntu-logo-symbolic.svg | 31 + .../distro_icons/voyager-logo-symbolic.svg | 30 + .../distro_icons/zorin-logo-symbolic.svg | 62 + .../menu_button_icons/icons/3D-symbolic.svg | 55 + .../menu_button_icons/icons/3d-symbolic-1.svg | 63 + .../menu_button_icons/icons/a-symbolic.svg | 55 + .../icons/alien-symbolic.svg | 55 + .../icons/app-launcher-symbolic.svg | 55 + .../menu_button_icons/icons/apps-symbolic.svg | 71 + .../icons/arc-menu-alt-symbolic.svg | 66 + .../icons/arc-menu-old-symbolic.svg | 68 + .../icons/arc-menu-old2-symbolic.svg | 103 + .../icons/arcmenu-logo-alt-symbolic.svg | 62 + .../icons/arcmenu-logo-symbolic.svg | 92 + .../icons/arrow-symbolic.svg | 55 + .../menu_button_icons/icons/bat-symbolic.svg | 55 + .../menu_button_icons/icons/bug-symbolic.svg | 63 + .../menu_button_icons/icons/cita-symbolic.svg | 55 + .../icons/cloud-symbolic.svg | 63 + .../icons/curved-a-symbolic.svg | 55 + .../icons/diamond-square-symbolic.svg | 55 + .../icons/dimond-win-symbolic.svg | 55 + .../icons/dolphin-symbolic.svg | 55 + .../menu_button_icons/icons/dota-symbolic.svg | 55 + .../menu_button_icons/icons/dra-symbolic.svg | 55 + .../icons/dragon-symbolic.svg | 55 + .../icons/dragonheart-symbolic.svg | 63 + .../icons/eclipse-symbolic.svg | 55 + .../icons/equal-symbolic.svg | 68 + .../menu_button_icons/icons/fly-symbolic.svg | 70 + .../icons/focus-symbolic.svg | 118 + .../icons/football-symbolic.svg | 55 + .../icons/football2-symbolic.svg | 64 + .../icons/gnacs-symbolic.svg | 55 + .../icons/groove-symbolic.svg | 63 + .../icons/heddy-symbolic.svg | 55 + .../icons/helmet-symbolic.svg | 55 + .../icons/kaaet-symbolic.svg | 55 + .../icons/launcher-symbolic.svg | 66 + .../menu_button_icons/icons/lins-symbolic.svg | 55 + .../icons/loveheart-symbolic.svg | 55 + .../icons/octo-maze-symbolic.svg | 55 + .../menu_button_icons/icons/pac-symbolic.svg | 55 + .../icons/pacman-symbolic.svg | 55 + .../icons/palette-symbolic.svg | 55 + .../icons/peaks-symbolic.svg | 55 + .../icons/peeks-symbolic.svg | 55 + .../menu_button_icons/icons/pie-symbolic.svg | 55 + .../icons/pointer-symbolic.svg | 55 + .../icons/pyrimid-symbolic.svg | 67 + .../icons/record-symbolic.svg | 55 + .../icons/rewind-symbolic.svg | 55 + .../icons/robots-symbolic.svg | 64 + .../icons/round-symbolic.svg | 18 + .../icons/saucer-symbolic.svg | 64 + .../icons/search-symbolic.svg | 55 + .../icons/sheild-symbolic.svg | 63 + .../menu_button_icons/icons/snap-symbolic.svg | 55 + .../icons/somnia-symbolic.svg | 55 + .../icons/start-box-symbolic.svg | 138 + .../menu_button_icons/icons/step-symbolic.svg | 55 + .../menu_button_icons/icons/sums-symbolic.svg | 55 + .../icons/swirl-symbolic.svg | 3 + .../menu_button_icons/icons/time-symbolic.svg | 55 + .../icons/toxic-symbolic.svg | 63 + .../icons/transform-symbolic.svg | 55 + .../menu_button_icons/icons/tree-symbolic.svg | 55 + .../icons/triple-dash-symbolic.svg | 88 + .../icons/utool-symbolic.svg | 55 + .../icons/vancer-symbolic.svg | 55 + .../menu_button_icons/icons/vibe-symbolic.svg | 55 + .../icons/whirl-circle-symbolic.svg | 55 + .../icons/whirl-symbolic.svg | 55 + .../icons/zegon-symbolic.svg | 63 + .../icons/menu_icons/arc-menu-symbolic.svg | 93 + .../icons/menu_icons/hamburger-symbolic.svg | 1 + .../icons/menu_icons/homescreen-symbolic.svg | 3 + .../media/icons/menu_icons/sleep-symbolic.svg | 67 + .../media/icons/prefs_icons/arc-menu-logo.svg | 1412 ++++ .../media/icons/prefs_icons/donate-icon.svg | 158 + .../media/icons/prefs_icons/gitlab-icon.svg | 408 + .../hicolor/16x16/actions/3D-symbolic-1.svg | 55 + .../hicolor/16x16/actions/3d-symbolic.svg | 63 + .../hicolor/16x16/actions/a-symbolic.svg | 55 + .../hicolor/16x16/actions/alien-symbolic.svg | 55 + .../actions/alternative-category-symbolic.svg | 287 + .../16x16/actions/app-launcher-symbolic.svg | 55 + .../hicolor/16x16/actions/apps-symbolic.svg | 71 + .../16x16/actions/arc-menu-alt-symbolic.svg | 66 + .../16x16/actions/arc-menu-old-symbolic.svg | 68 + .../16x16/actions/arc-menu-old2-symbolic.svg | 103 + .../16x16/actions/arc-menu-symbolic.svg | 93 + .../16x16/actions/arch-logo-symbolic.svg | 30 + .../16x16/actions/arcmenu-layout-symbolic.svg | 330 + .../actions/arcmenu-logo-alt-symbolic.svg | 62 + .../16x16/actions/arcmenu-logo-symbolic.svg | 92 + .../hicolor/16x16/actions/arrow-symbolic.svg | 55 + .../16x16/actions/az-layout-symbolic.svg | 312 + .../hicolor/16x16/actions/bat-symbolic.svg | 55 + .../16x16/actions/brisk-layout-symbolic.svg | 328 + .../16x16/actions/browse-presets-symbolic.svg | 60 + .../16x16/actions/budgie-layout-symbolic.svg | 202 + .../16x16/actions/budgie-logo-symbolic.svg | 55 + .../hicolor/16x16/actions/bug-symbolic.svg | 63 + .../actions/button-appearance-symbolic.svg | 45 + .../16x16/actions/categories-symbolic.svg | 87 + .../actions/chromebook-layout-symbolic.svg | 227 + .../hicolor/16x16/actions/cita-symbolic.svg | 55 + .../hicolor/16x16/actions/cloud-symbolic.svg | 63 + .../16x16/actions/curved-a-symbolic.svg | 55 + .../16x16/actions/debian-logo-symbolic.svg | 55 + .../16x16/actions/diamond-square-symbolic.svg | 55 + .../16x16/actions/dimond-win-symbolic.svg | 55 + .../16x16/actions/dolphin-symbolic.svg | 55 + .../hicolor/16x16/actions/dota-symbolic.svg | 55 + .../hicolor/16x16/actions/dra-symbolic.svg | 55 + .../hicolor/16x16/actions/drag-symbolic.svg | 65 + .../hicolor/16x16/actions/dragon-symbolic.svg | 55 + .../16x16/actions/dragonheart-symbolic.svg | 63 + .../16x16/actions/eclipse-symbolic.svg | 55 + .../actions/elementary-layout-symbolic.svg | 285 + .../16x16/actions/eleven-layout-symbolic.svg | 219 + .../16x16/actions/endeavour-logo-symbolic.svg | 58 + .../hicolor/16x16/actions/equal-symbolic.svg | 68 + .../16x16/actions/fedora-logo-symbolic.svg | 56 + .../16x16/actions/fine-tune-symbolic.svg | 1 + .../hicolor/16x16/actions/fly-symbolic.svg | 70 + .../hicolor/16x16/actions/focus-symbolic.svg | 118 + .../16x16/actions/football-symbolic.svg | 55 + .../16x16/actions/football2-symbolic.svg | 64 + .../16x16/actions/gentoo-logo-symbolic.svg | 35 + .../hicolor/16x16/actions/gnacs-symbolic.svg | 55 + .../actions/gnomemenu-layout-symbolic.svg | 159 + .../actions/gnomeoverview-layout-symbolic.svg | 163 + .../hicolor/16x16/actions/groove-symbolic.svg | 63 + .../hicolor/16x16/actions/heddy-symbolic.svg | 55 + .../hicolor/16x16/actions/helmet-symbolic.svg | 55 + .../16x16/actions/homescreen-symbolic.svg | 3 + .../16x16/actions/icon-preview-symbolic.svg | 70 + .../16x16/actions/info-circle-symbolic.svg | 53 + .../16x16/actions/insider-layout-symbolic.svg | 322 + .../hicolor/16x16/actions/kaaet-symbolic.svg | 55 + .../actions/kali-linux-logo-symbolic.svg | 30 + .../actions/launcher-category-symbolic.svg | 297 + .../actions/launcher-layout-symbolic.svg | 290 + .../16x16/actions/launcher-symbolic.svg | 66 + .../hicolor/16x16/actions/lins-symbolic.svg | 55 + .../16x16/actions/loveheart-symbolic.svg | 55 + .../16x16/actions/manjaro-logo-symbolic.svg | 42 + .../16x16/actions/menu-layouts-symbolic.svg | 61 + .../menu-settings-general-symbolic.svg | 64 + .../16x16/actions/menu-settings-symbolic.svg | 76 + .../16x16/actions/menu-theme-symbolic.svg | 64 + .../16x16/actions/mint-layout-symbolic.svg | 384 + .../hicolor/16x16/actions/misc-symbolic.svg | 42 + .../actions/modern-category-symbolic.svg | 298 + .../16x16/actions/mx-logo-symbolic.svg | 30 + .../16x16/actions/octo-maze-symbolic.svg | 55 + .../16x16/actions/opensuse-logo-symbolic.svg | 55 + .../hicolor/16x16/actions/pac-symbolic.svg | 55 + .../hicolor/16x16/actions/pacman-symbolic.svg | 55 + .../16x16/actions/palette-symbolic.svg | 55 + .../hicolor/16x16/actions/peaks-symbolic.svg | 55 + .../hicolor/16x16/actions/peeks-symbolic.svg | 55 + .../hicolor/16x16/actions/pie-symbolic.svg | 55 + .../16x16/actions/pinned-apps-symbolic.svg | 37 + .../16x16/actions/plasma-layout-symbolic.svg | 438 + .../16x16/actions/pointer-symbolic.svg | 55 + .../16x16/actions/pop-os-logo-symbolic.svg | 30 + .../16x16/actions/pureos-logo-symbolic.svg | 30 + .../16x16/actions/pyrimid-symbolic.svg | 67 + .../16x16/actions/raspbian-logo-symbolic.svg | 30 + .../16x16/actions/raven-layout-symbolic.svg | 307 + .../hicolor/16x16/actions/record-symbolic.svg | 55 + .../16x16/actions/redhat-logo-symbolic.svg | 30 + .../16x16/actions/redmond-layout-symbolic.svg | 610 ++ .../hicolor/16x16/actions/rewind-symbolic.svg | 55 + .../hicolor/16x16/actions/robots-symbolic.svg | 64 + .../hicolor/16x16/actions/round-symbolic.svg | 18 + .../16x16/actions/runner-layout-symbolic.svg | 208 + .../hicolor/16x16/actions/saucer-symbolic.svg | 64 + .../hicolor/16x16/actions/search-symbolic.svg | 55 + .../hicolor/16x16/actions/sheild-symbolic.svg | 63 + .../16x16/actions/shortcuts-symbolic.svg | 64 + .../actions/simple-category-symbolic.svg | 295 + .../16x16/actions/simple-layout-symbolic.svg | 285 + .../16x16/actions/simple2-layout-symbolic.svg | 210 + .../hicolor/16x16/actions/snap-symbolic.svg | 55 + .../16x16/actions/solus-logo-symbolic.svg | 53 + .../hicolor/16x16/actions/somnia-symbolic.svg | 55 + .../16x16/actions/start-box-symbolic.svg | 138 + .../hicolor/16x16/actions/step-symbolic.svg | 55 + .../hicolor/16x16/actions/sums-symbolic.svg | 55 + .../hicolor/16x16/actions/swirl-symbolic.svg | 3 + .../hicolor/16x16/actions/time-symbolic.svg | 55 + .../16x16/actions/tognee-layout-symbolic.svg | 99 + .../16x16/actions/touch-category-symbolic.svg | 543 ++ .../hicolor/16x16/actions/toxic-symbolic.svg | 63 + .../actions/traditional-category-symbolic.svg | 793 ++ .../16x16/actions/transform-symbolic.svg | 55 + .../hicolor/16x16/actions/tree-symbolic.svg | 55 + .../16x16/actions/triple-dash-symbolic.svg | 88 + .../16x16/actions/ubuntu-logo-symbolic.svg | 31 + .../16x16/actions/unity-layout-symbolic.svg | 504 ++ .../hicolor/16x16/actions/utool-symbolic.svg | 55 + .../hicolor/16x16/actions/vancer-symbolic.svg | 55 + .../hicolor/16x16/actions/vibe-symbolic.svg | 55 + .../16x16/actions/voyager-logo-symbolic.svg | 30 + .../16x16/actions/warning-symbolic.svg | 31 + .../16x16/actions/whirl-circle-symbolic.svg | 55 + .../hicolor/16x16/actions/whirl-symbolic.svg | 55 + .../16x16/actions/whisker-layout-symbolic.svg | 392 + .../16x16/actions/windows-layout-symbolic.svg | 86 + .../hicolor/16x16/actions/zegon-symbolic.svg | 63 + .../16x16/actions/zorin-logo-symbolic.svg | 62 + .../icons/prefs_icons/keyboard-symbolic.svg | 52 + .../media/misc/ArcMenuDefaultPresets | 52 + .../arcmenu@arcmenu.com/menuButton.js | 875 ++ .../arcmenu@arcmenu.com/menuWidgets.js | 3693 ++++++++ .../menulayouts/arcmenu.js | 456 + .../arcmenu@arcmenu.com/menulayouts/az.js | 285 + .../menulayouts/baseMenuLayout.js | 1128 +++ .../arcmenu@arcmenu.com/menulayouts/brisk.js | 206 + .../arcmenu@arcmenu.com/menulayouts/budgie.js | 184 + .../menulayouts/chromebook.js | 118 + .../menulayouts/elementary.js | 118 + .../arcmenu@arcmenu.com/menulayouts/eleven.js | 376 + .../menulayouts/gnomemenu.js | 161 + .../menulayouts/insider.js | 337 + .../menulayouts/launcher.js | 465 + .../arcmenu@arcmenu.com/menulayouts/mint.js | 250 + .../arcmenu@arcmenu.com/menulayouts/plasma.js | 453 + .../arcmenu@arcmenu.com/menulayouts/raven.js | 395 + .../menulayouts/redmond.js | 229 + .../arcmenu@arcmenu.com/menulayouts/runner.js | 208 + .../arcmenu@arcmenu.com/menulayouts/simple.js | 159 + .../menulayouts/simple2.js | 179 + .../arcmenu@arcmenu.com/menulayouts/tognee.js | 290 + .../menulayouts/tweaks/tweaks.js | 1286 +++ .../arcmenu@arcmenu.com/menulayouts/unity.js | 445 + .../menulayouts/whisker.js | 187 + .../menulayouts/windows.js | 465 + .../arcmenu@arcmenu.com/metadata.json | 15 + .../arcmenu@arcmenu.com/placeDisplay.js | 764 ++ .../arcmenu@arcmenu.com/prefs.js | 6786 +++++++++++++++ .../arcmenu@arcmenu.com/prefsWidgets.js | 793 ++ .../arcmenu@arcmenu.com/recentFilesManager.js | 111 + .../schemas/gschemas.compiled | Bin 0 -> 12620 bytes ...gnome.shell.extensions.arcmenu.gschema.xml | 799 ++ .../arcmenu@arcmenu.com/search.js | 872 ++ .../searchProviders/openWindows.js | 93 + .../searchProviders/recentFiles.js | 100 + .../arcmenu@arcmenu.com/standaloneRunner.js | 376 + .../arcmenu@arcmenu.com/utils.js | 687 ++ .../blur-my-shell@aunetx/appfolders.js | 225 + .../blur-my-shell@aunetx/applications.js | 274 + .../blur-my-shell@aunetx/connections.js | 81 + .../blur-my-shell@aunetx/dash.js | 51 + .../blur-my-shell@aunetx/dash_to_dock.js | 235 + .../blur-my-shell@aunetx/extension.js | 224 + .../blur-my-shell@aunetx/lockscreen.js | 64 + .../blur-my-shell@aunetx/metadata.json | 12 + .../blur-my-shell@aunetx/overview.js | 161 + .../blur-my-shell@aunetx/paint_signals.js | 59 + .../blur-my-shell@aunetx/panel.js | 245 + .../blur-my-shell@aunetx/prefs.js | 187 + .../blur-my-shell@aunetx/prefs.ui | 410 + .../schemas/gschemas.compiled | Bin 0 -> 1064 bytes ...shell.extensions.blur-my-shell.gschema.xml | 95 + .../blur-my-shell@aunetx/settings.js | 274 + .../blur-my-shell@aunetx/stylesheet.css | 436 + .../blur-my-shell@aunetx/utilities.js | 39 + .../blur-my-shell@aunetx/window_list.js | 128 + .../dash-to-panel@jderose9.github.com/COPYING | 341 + .../README.md | 189 + .../Settings.ui | 7508 +++++++++++++++++ .../appIcons.js | 1964 +++++ .../convenience.js | 89 + .../extension.js | 149 + .../img/highlight_stacked_bg.svg | 7 + .../img/highlight_stacked_bg_2.svg | 7 + .../img/highlight_stacked_bg_3.svg | 7 + .../intellihide.js | 401 + .../locale/cs/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23608 bytes .../locale/de/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23744 bytes .../locale/es/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24908 bytes .../locale/fr/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 25001 bytes .../locale/gl/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 25609 bytes .../locale/hu/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 26323 bytes .../locale/it/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 28449 bytes .../locale/ja/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 27840 bytes .../locale/kk/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 15501 bytes .../locale/pl/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24761 bytes .../locale/pt_BR/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 8464 bytes .../locale/ru/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 30089 bytes .../locale/sv/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24167 bytes .../locale/tr/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 24795 bytes .../locale/uk/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 10635 bytes .../locale/zh_CN/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 23083 bytes .../locale/zh_TW/LC_MESSAGES/dash-to-panel.mo | Bin 0 -> 19323 bytes .../metadata.json | 13 + .../overview.js | 708 ++ .../panel.js | 1512 ++++ .../panelManager.js | 789 ++ .../panelPositions.js | 61 + .../panelSettings.js | 112 + .../panelStyle.js | 326 + .../prefs.js | 2468 ++++++ .../progress.js | 598 ++ .../proximity.js | 262 + .../schemas/gschemas.compiled | Bin 0 -> 17276 bytes ...shell.extensions.dash-to-panel.gschema.xml | 1278 +++ .../stylesheet.css | 151 + .../taskbar.js | 1557 ++++ .../transparency.js | 269 + .../utils.js | 1040 +++ .../windowPreview.js | 1145 +++ .../gnome-ui-tune@itstime.tech/LICENSE | 674 ++ .../gnome-ui-tune@itstime.tech/extension.js | 52 + .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 873 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 519 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 920 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 918 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 736 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 827 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 709 bytes .../LC_MESSAGES/gnome-ui-tune@itstime.tech.mo | Bin 0 -> 867 bytes .../gnome-ui-tune@itstime.tech/metadata.json | 14 + .../gnome-ui-tune@itstime.tech/prefs.js | 55 + .../schemas/gschemas.compiled | Bin 0 -> 564 bytes ...shell.extensions.gnome-ui-tune.gschema.xml | 30 + .../gnome-ui-tune@itstime.tech/src/mod.js | 8 + .../src/modAlwaysShowThumbnails.js | 21 + .../src/modFirefoxPipInOverview.js | 22 + .../src/modHideSearchInput.js | 30 + .../src/modRestoreThumbnailsBackground.js | 73 + .../src/modScaleThumbnails.js | 40 + .../src/modsList.js | 23 + .../README | 6 + .../compat.js | 51 + .../convenience.js | 94 + .../extension.js | 2592 ++++++ .../gpu_usage.sh | 49 + .../locale/ar/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4303 bytes .../locale/ca/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4243 bytes .../locale/cs/LC_MESSAGES/system-monitor.mo | Bin 0 -> 3909 bytes .../locale/de/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4208 bytes .../es_ES/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4264 bytes .../es_MX/LC_MESSAGES/system-monitor.mo | Bin 0 -> 1962 bytes .../locale/fa/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2536 bytes .../locale/fi/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4250 bytes .../locale/fr/LC_MESSAGES/system-monitor.mo | Bin 0 -> 6292 bytes .../locale/hu/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5927 bytes .../locale/it/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4330 bytes .../locale/ja/LC_MESSAGES/system-monitor.mo | Bin 0 -> 3639 bytes .../locale/ko/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5643 bytes .../nl_NL/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4335 bytes .../locale/pl/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2228 bytes .../locale/pt/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4246 bytes .../pt_BR/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4265 bytes .../locale/ro/LC_MESSAGES/system-monitor.mo | Bin 0 -> 2186 bytes .../locale/ru/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4672 bytes .../locale/sk/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4331 bytes .../locale/tr/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4412 bytes .../locale/uk/LC_MESSAGES/system-monitor.mo | Bin 0 -> 4835 bytes .../zh_CN/LC_MESSAGES/system-monitor.mo | Bin 0 -> 5603 bytes .../metadata.json | 19 + .../prefs.js | 553 ++ .../schemas/gschemas.compiled | Bin 0 -> 6516 bytes ...hell.extensions.system-monitor.gschema.xml | 463 + .../stylesheet.css | 204 + .../nautilus-extensions/nautilus-copy-path.py | 4 + .../nautilus-copy-path/config.json | 11 + .../nautilus-copy-path/nautilus_copy_path.py | 73 + .../nautilus-copy-path/translation.py | 52 + .../nautilus-copy-path/translations/ar.json | 8 + .../nautilus-copy-path/translations/da.json | 8 + .../nautilus-copy-path/translations/de.json | 8 + .../nautilus-copy-path/translations/el.json | 8 + .../nautilus-copy-path/translations/en.json | 8 + .../nautilus-copy-path/translations/es.json | 6 + .../nautilus-copy-path/translations/fr.json | 6 + .../nautilus-copy-path/translations/it.json | 6 + .../nautilus-copy-path/translations/ja.json | 8 + .../nautilus-copy-path/translations/no.json | 8 + .../nautilus-copy-path/translations/pl.json | 8 + .../nautilus-copy-path/translations/pt.json | 8 + .../nautilus-copy-path/translations/ro.json | 6 + .../nautilus-copy-path/translations/ru.json | 8 + .../nautilus-copy-path/translations/se.json | 8 + .../nautilus-copy-path/translations/tr.json | 8 + .../nautilus-copy-path/translations/zh.json | 8 + .../almalinux-creative-installer.spec | 12 + 1351 files changed, 240887 insertions(+) create mode 100644 UIDev/ansibleshed/01-creative_gnome_defaults create mode 100644 UIDev/ansibleshed/Packages.zip create mode 100644 UIDev/ansibleshed/Packages/01-creative_gnome_defaults create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/COPYING create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/README.md create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/constants.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/controller.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/extension.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/helper.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ca/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/de/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/el/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/es/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/fi/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/fr/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/it/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ja/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/pl/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sk/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/szl/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/uk/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/zh_TW/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/.keep create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuButton.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/metadata.json create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefs.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/search.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/utils.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/appfolders.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/applications.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/connections.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/extension.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/lockscreen.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/metadata.json create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/overview.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/paint_signals.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/panel.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.ui create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/settings.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/stylesheet.css create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/utilities.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/window_list.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/README.md create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/kk/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/pl/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/pt_BR/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ru/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_CN/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/metadata.json create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/fr/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ko/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ru/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/metadata.json create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/prefs.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/schemas/org.gnome.shell.extensions.gnome-ui-tune.gschema.xml create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/src/mod.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/src/modAlwaysShowThumbnails.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/src/modFirefoxPipInOverview.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/src/modHideSearchInput.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/src/modRestoreThumbnailsBackground.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/src/modScaleThumbnails.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/src/modsList.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/README create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/compat.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/convenience.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/extension.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/gpu_usage.sh create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ar/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ca/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/cs/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/de/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/es_ES/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/es_MX/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fa/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fi/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fr/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/hu/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/it/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ja/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ko/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/nl_NL/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pl/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pt/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pt_BR/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ro/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ru/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/sk/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/tr/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/uk/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/zh_CN/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/metadata.json create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/prefs.js create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml create mode 100644 UIDev/ansibleshed/Packages/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/stylesheet.css create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path.py create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/config.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/nautilus_copy_path.py create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translation.py create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/ar.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/da.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/de.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/el.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/en.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/es.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/fr.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/it.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/ja.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/no.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/pl.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/pt.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/ro.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/ru.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/se.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/tr.json create mode 100644 UIDev/ansibleshed/Packages/nautilus-extensions/nautilus-copy-path/translations/zh.json create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/COPYING create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/README.md create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/constants.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/controller.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/extension.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/helper.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ca/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/de/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/el/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/es/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/fi/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/fr/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/it/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ja/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/pl/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sk/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/szl/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/uk/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/zh_TW/LC_MESSAGES/arcmenu.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/.keep create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuButton.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/metadata.json create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefs.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/search.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js create mode 100644 UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/utils.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/appfolders.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/applications.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/connections.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/extension.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/lockscreen.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/metadata.json create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/overview.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/paint_signals.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/panel.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.ui create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/settings.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/stylesheet.css create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/utilities.js create mode 100644 UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/window_list.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/README.md create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/kk/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/pl/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/pt_BR/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ru/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_CN/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/metadata.json create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js create mode 100644 UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/fr/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ko/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ru/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/metadata.json create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/prefs.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/schemas/org.gnome.shell.extensions.gnome-ui-tune.gschema.xml create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/src/mod.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/src/modAlwaysShowThumbnails.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/src/modFirefoxPipInOverview.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/src/modHideSearchInput.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/src/modRestoreThumbnailsBackground.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/src/modScaleThumbnails.js create mode 100644 UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/src/modsList.js create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/README create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/compat.js create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/convenience.js create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/extension.js create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/gpu_usage.sh create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ar/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ca/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/cs/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/de/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/es_ES/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/es_MX/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fa/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fi/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fr/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/hu/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/it/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ja/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ko/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/nl_NL/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pl/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pt/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pt_BR/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ro/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ru/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/sk/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/tr/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/uk/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/zh_CN/LC_MESSAGES/system-monitor.mo create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/metadata.json create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/prefs.js create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/schemas/gschemas.compiled create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml create mode 100644 UIDev/ansibleshed/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/stylesheet.css create mode 100644 UIDev/ansibleshed/gnome-ui-setup.yaml create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path.py create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/config.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/nautilus_copy_path.py create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translation.py create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/ar.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/da.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/de.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/el.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/en.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/es.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/fr.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/it.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/ja.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/no.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/pl.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/pt.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/ro.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/ru.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/se.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/tr.json create mode 100644 UIDev/ansibleshed/nautilus-extensions/nautilus-copy-path/translations/zh.json create mode 100644 UIDev/ansibleshed/script_to_convert.sh create mode 100644 src/gnome-ui/01-creative_gnome_defaults create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/COPYING create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/README.md create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/constants.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/controller.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/extension.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/helper.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ca/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/de/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/el/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/es/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/fi/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/fr/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/it/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ja/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/pl/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sk/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/szl/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/uk/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/zh_TW/LC_MESSAGES/arcmenu.mo create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/.keep create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuButton.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/metadata.json create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefs.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/search.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js create mode 100644 src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/utils.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/appfolders.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/applications.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/connections.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/extension.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/lockscreen.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/metadata.json create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/overview.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/paint_signals.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/panel.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.ui create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/settings.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/stylesheet.css create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/utilities.js create mode 100644 src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/window_list.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/README.md create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/kk/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/pl/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/pt_BR/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ru/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_CN/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/metadata.json create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js create mode 100644 src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/fr/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ko/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ru/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/metadata.json create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/prefs.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/schemas/gschemas.compiled create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/schemas/org.gnome.shell.extensions.gnome-ui-tune.gschema.xml create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/src/mod.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/src/modAlwaysShowThumbnails.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/src/modFirefoxPipInOverview.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/src/modHideSearchInput.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/src/modRestoreThumbnailsBackground.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/src/modScaleThumbnails.js create mode 100644 src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/src/modsList.js create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/README create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/compat.js create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/convenience.js create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/extension.js create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/gpu_usage.sh create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ar/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ca/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/cs/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/de/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/es_ES/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/es_MX/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fa/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fi/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/fr/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/hu/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/it/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ja/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ko/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/nl_NL/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pl/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pt/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/pt_BR/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ro/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/ru/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/sk/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/tr/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/uk/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/locale/zh_CN/LC_MESSAGES/system-monitor.mo create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/metadata.json create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/prefs.js create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/schemas/gschemas.compiled create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml create mode 100644 src/gnome-ui/gnome-extensions/system-monitor@paradoxxx.zero.gmail.com/stylesheet.css create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path.py create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/config.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/nautilus_copy_path.py create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translation.py create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/ar.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/da.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/de.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/el.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/en.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/es.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/fr.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/it.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/ja.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/no.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/pl.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/pt.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/ro.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/ru.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/se.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/tr.json create mode 100644 src/gnome-ui/nautilus-extensions/nautilus-copy-path/translations/zh.json diff --git a/UIDev/ansibleshed/01-creative_gnome_defaults b/UIDev/ansibleshed/01-creative_gnome_defaults new file mode 100644 index 0000000..fbd1a8f --- /dev/null +++ b/UIDev/ansibleshed/01-creative_gnome_defaults @@ -0,0 +1,96 @@ +########################### +### Window Management + +[org/gnome/desktop/wm/preferences] + +button-layout='appmenu:minimize,maximize,close' +resize-with-right-button=true + +########################### +### Interface + +[org/gnome/desktop/interface] + +gtk-theme='Adwaita-dark' +enable-hot-corners=false + +########################### +### File Browser (Nautilus) + +[org/gnome/nautilus/preferences] + +always-use-location-entry=true +default-folder-viewer='list-view' + +[org/gnome/nautilus/list-view] + +default-zoom-level='small' +use-tree-view=true +default-visible-columns=['name', 'size', 'date_modified', 'type', 'starred'] + +########################### +### Workspace + +[org/gnome/mutter] + +workspaces-only-on-primary=false + +########################## +### Favorite Apps +[org/gnome/shell] +favorite-apps=['google-chrome.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Terminal.desktop', 'com.slack.Slack.desktop', 'almalinux-creative-installer.desktop'] + +########################## +### Gnome Extensions +[org/gnome/shell] + +# Set default Enabled Extensions +enabled-extensions=['top-icons@gnome-shell-extensions.gcampax.github.com', 'background-logo@fedorahosted.org', 'dash-to-panel@jderose9.github.com', 'system-monitor@paradoxxx.zero.gmail.com', 'arcmenu@arcmenu.com', 'gnome-ui-tune@itstime.tech', 'blur-my-shell@aunetx'] + +# Dash to Panel +[org/gnome/shell/extensions/dash-to-panel] + +multi-monitors=true +isolate-monitors=false +isolate-workspaces=true +scroll-panel-action='NOTHING' +dot-style-focused='SEGMENTED' +dot-style-unfocused='DASHES' +dot-color-override=true +dot-color-1='#5294e2' +dot-color-2='#5294e2' +dot-color-3='#5294e2' +dot-color-4='#5294e2' +dot-color-unfocused-different=true +dot-color-unfocused-1='#c0bfbc' +dot-color-unfocused-2='#c0bfbc' +dot-color-unfocused-3='#c0bfbc' +dot-color-unfocused-4='#c0bfbc' +click-action='TOGGLE-SHOWPREVIEW' +hide-overview-on-startup=true +appicon-padding=4 +appicon-margin=1 +panel-sizes='{"0":40,"1":40}' +panel-element-positions='{"0":[{"element":"showAppsButton","visible":false,"position":"stackedTL"},{"element":"activitiesButton","visible":false,"position":"stackedTL"},{"element":"leftBox","visible":true,"position":"stackedTL"},{"element":"taskbar","visible":true,"position":"stackedTL"},{"element":"centerBox","visible":true,"position":"stackedBR"},{"element":"rightBox","visible":true,"position":"stackedBR"},{"element":"dateMenu","visible":true,"position":"stackedBR"},{"element":"systemMenu","visible":true,"position":"stackedBR"},{"element":"desktopButton","visible":true,"position":"stackedBR"}],"1":[{"element":"showAppsButton","visible":false,"position":"stackedTL"},{"element":"activitiesButton","visible":false,"position":"stackedTL"},{"element":"leftBox","visible":true,"position":"stackedTL"},{"element":"taskbar","visible":true,"position":"stackedTL"},{"element":"centerBox","visible":true,"position":"stackedBR"},{"element":"rightBox","visible":true,"position":"stackedBR"},{"element":"dateMenu","visible":true,"position":"stackedBR"},{"element":"systemMenu","visible":true,"position":"stackedBR"},{"element":"desktopButton","visible":true,"position":"stackedBR"}]}' + +# System Monitor +[org/gnome/shell/extensions/system-monitor] + +compact-display=true +center-display=true +net-display=false +swap-display=true +icon-display=false + +# Arc Menu +[org/gnome/shell/extensions/arcmenu] + +multi-monitor=true +menu-button-icon='Distro_Icon' +menu-layout='Redmond' +enable-horizontal-flip=true + +# Gnome 4x UI Improvement +[org/gnome/shell/extensions/gnome-ui-tune] + +hide-search=false diff --git a/UIDev/ansibleshed/Packages.zip b/UIDev/ansibleshed/Packages.zip new file mode 100644 index 0000000000000000000000000000000000000000..1319c120694d109cbc8ab739210d0c9e28b25b68 GIT binary patch literal 1539247 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 z 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 z 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
    g)CSt2v>$ zy=|!p-ukaKGGDL!K;_AoZu4W_jTs2t)|A4(O9*^>Ad!v?k~{)Xc6|nQKZ(u0093T_WxN1 zoDl#3r2l`&fRc%`vxTkM|BVV%s~OmBh$DQ@)TVtd@Xs(<+&WhXDut60=M(z%DWGJ_ zmJUZ5c#c?I*9e_8|9+cx|1+0@gvG!^u5sDzdVZS1JRd^g2+97^AcZCJO3{OPEu@jtB83G7T?$Vj_!NF15hfcFu21C&BOxY*J!MI72L_M*G5(j) zb}A;pH_2dK>`QRSt}`{9Dh%$=x6)t~O}DF6m`OTx-0lvvl9q44_*f@DA#ipV4?@7O zv8gGeh%rbyOpBlzG*GwqqY~(oM)rn}Tl9vEC3oV$-@*gU0~f@Kqg)JW2Z_(v)M0mOY3L)3V4$lDA0(_ z&1_zu1Jw~3Yo7l`9nC?INIQGCODa^6`BumpGm7s0dFBM&;M~ZHX#b zo>+2_W}uxxLcID5Q!QUl^i>x70eJ~MJt^%hrBk7rCE}t-UfCzIM@U@eKt5Ws z*vAV7cqv_)KdQ%|Ov05?0TGXkAnMKXQMR8blF97?Dv1<)l(a@Kw7bR*Lren+OZ|`J zV8KNtAt&5`lRnE^E6~$|qe2%GorT4b`%*j9q#)6QUE+Z8LCvywA;pJ8ciEr?suh)Z zeVTHtrs9GC_8%f*myFpx2p`ZVvoe&-yuk9Wsp_`Wtd4a_nlEzV0JNAMi@=19498}v zcC-3cZ2j3QY}AGPV^;NPX1R)%Duo)FS2gSvcaEW)AM&KE;jhkkm8IURIY~`&z%QD&><$-;x9;}=J+@-ICw~-;i7^n8KuYZ`{t6gY3U@rm=%SY zLt;I5W&4`dav=*&#K?LH77c-P8oByCTPuC)Gx+8*8=uxOxX7%O-T^X02X4cCK2d;q zO=wCvXP4k;A|q&v0Byse26d(NTm0*4!gr2XJ~f#)XrC|j-AGr-d}}H2<6l+EmsJd<3mCm(KMOm zM+~iFS_2N0p6904bvIi#YP2ixQ;j0cLh&xlOWG#}Qe>>_PD44Sz9TGINX7seX(4@uVWIZgJ+h-vqmh{H;t9lWu{ z#b*8-yachz<2d1-?Tzam+!QJBbB-p)OcVO;M;kHb)>wnrVEx*pWVr?JDRT5$vgv5% z*84|9P42lI|E>g8poiY4fIPQOv<=74)KW_cgIMz0I}58c8^PIGn$f&fHtcG>rXjXk zH%&Ex^vUSXz?Wwkd-02G%+HgbU-p|+xV^eBI)iSK15@}q;;e;3PBa2fCn{#AsBWx& z+tyUN;RRg49veMfS4}HGS}6G3j@pYgqOw6hAAOsU8O5!xoeNz&BoV61x<5VJH`k-V3T+GER>( zHJ(ty1CQ_3)17%HVIleD)JBvVJTz22WU{O--C}&vM@;F0?bS>5&Qk5p{~<$56s3?B z3$zczb?!fhxEuL1D?K&!Y{PF0Y80iumYdMXK!~GsjTiSusvWSL$2qL+*8>k4GHk7ZK=;i;SEEb5eb$RP3j3n!>$R1CO?0p0u{ofT~;HFI6x_>bV7 zOkbVpco&;ORLfL8D9Lav#EiKN89l$wl}fpmp(_InJqcOdi;G=aKrFsf)|WMqQVP1K zWL}^MWmv$^L9?ZYfjk+Et(qV36BZU?=S$s3EiA>b&z%%`Ww>X8r4T5b4R(U`=w6`} z2<83(c6hGSOf>`(ngn|W z(986f+@K*!>f=z_^o|uGl`8hzQ|;t+Eh{O#mo!49H%%{QgwM*Tlr|Z77zx2QYNVLC zoO~gWM+z_ZBS({@`w@}-xU`R@$m^jE!}8GUDY>5y^*Y35*_=>id&DPJse+l7o|SSQ z;x^9CNeKnHXNP?CNu4~!HW3jif!0-h?U}P&XGUxU-Jd-OnDNKx?~KX!AeV$lz_d6q2KD!3Lc)JQ#nYJZKzgD!eK$I8AR+!aVR}Y5Rc{3K4&Q^<4 z#m`$}G@KAaOtrwB&tfbE!AJ}Nb!`<>tkQ0NG5`jSm_=(r1`%g9y# zXJHvbUqH*|o@IxuOYADAU#^Q-ls6}1rO*~iZ3RWp<%y2N=B`aNld#j@+5rBSrV+HZ z*UzoWcoe0ti}Md-f$P>5!jCFioo=^j`Y_cxX! z{B1GJlm}j*jr~u*BL{DClhA!e9;8q{E^+mzV@Hkf=1Blp3dx+V+;{9?&o02|lQSpA zuAH;4b9F7A=<4A4odNSa8@$oS{rz9|kF>MPePd2MUEY1fUiV*no-Rz?=X+@SU!mCe zMS`-UrTAbOE(DxMRaLz#GXTaSqejYLa|BN|fQ71B`G}S4stKI_;Sw!yo7EtGiHqu8 z^)k{S{P_IQ@z8w{xgnni@~>@^77_< z_EMPF&e~h^$aWzg-2i$ zE??mheI6PBwse05vS>yDTnja(5fyGJG9IXM6R?@F`D+6jksj3bZA~F^8xIS-@%G-T zN_nCC<^{$p!0fS`s8#PB$gCX|u);x3c>o#CUuKD`@G3bNZ>^(@?7JA+z^rGWTH;tl z{6qXOF!9^}E*|KC&RaM9RbpjLT^>KJqa)ic-nG_0L(w-!jzYvqyw|E|WUwjXU4iXU&VVu_R9gVba{rziEIAhH&$X z9tcQhKA!MSwaduqvW%JT+!?gB*=|uGSSdj|w7+tY;mA@=OKK#Zs~gSeNRbqk>cL^Np#S`f#wR& zWjH*txS*6_&UkglC1|Gq5;))ZfYq&L0dxHtu$y@KPhU5yXp*q2fegy1uc|h?K&fBzx5PCVbcsd)@%vTbix=Lu>Om8F7MO`f}`Wak`#hn{W=Ojr&9$Wz- zetd_DqImx$lOT$gktz)kD)}4(@t#nxwXe@fz9&LA{1fOo>Y=1yGj#d1y{q4Yaxx)I ze6B+#nV1wD>jb1o(wu^iIGGATkp~@2q~FE;DWU*axW+z)V05{rd{Olt4Lbwz4I}$I zRHz_7BoxhuGKz`N4yXt}deAyKC!QSslRE{neJ^{?XBN<+;!lD*2-?%2hW{NRFS`{q znzoKnWUPL-c~>ecKDyEx3kJHVOwQ*UsAERrwqmd8iOnb(V=~%)HeAmPY-eRIqCOWv zXA7y`M@AtZ@Ikc1pA`pj_>4aTsgwfqh<^!Xs}B9YY+n!ud^4&NkfP+b2v)d=j&3eV zziu=mptKX6=84a!YS%Ns$qFff(eh3yiv2gR)Z7gK39^smKwxlLrh^WVEa92%;x`)p zSZYszGFM;_w6p=!X$h@>^9%y5?02(_zoGtBhm{Jmk(Wga3zcCOz>Tz8zUGyJvhnw3 zEyfKUdX8DTp^h$aQVNA%idk59#+3-}F-!P zJV=7y_>)U2kcZ(&_Q@*4OfbecCDE;>{fG2(Bctg+R3=lEp5HLEP6p?X8$<;^mlV`o zF!K`zMmt>UECRx}^l^O)vUXK1q?kcGkJ4JQJ4&G&e5n&0%oj1hZ#xq^t?&A{uLIbl z(MB>Vg1>tNxtWRA1rQT{+|W-p?@~MsaH0J(^>lcu;8%JeLyZm9u|G*FJoFz0cS*_3 zmkHdSD8IbWTVP*?l@FuC<8Ls(46te;OfFBBU*=#~Qaj4?-)giEvFotd9@T(C4|nynaZ5`#}{1Z&7kJdK-!cZyew8F?8BT!!HP_9L>)ho$i;vfXrk4xk9n%OoGNW zNtlmfLI`%^w4yP{{>en_%V5r!KQF&R!0{zuVQuF}hGz3QaV;YkRY_>tsIG?WaEOPD zY3=kimLy&-(cc>24lPa!ye@B)r)73478CGk4@D!q@KcWm&C@!(Fs?cq$|bz$YQi4V zch2fiWwsg=J>kJv{-|Z%<7_vzZx_;+`{dp-rJoo&6BuOQtq`hfI3$@b0^qgPRgJfs z)gIN3$hw3jk(rm55H>E=Mu7y@0j~aS9fp}BqyUj<4|(9DEr9lkR*(XhBA-__uYKSJJ`=by_EAoC;X2c13J}T4LK)*Tb@scs zh8zR@X(<-QMG=GT@@6IXLGIGR3YX^veev5LbLn1YFzT1}KqT_Aa;B5<5N-S_Oe!)I z*4aE%)_?m>cxkGqT$pVW!z}a-5$q&~DFUX}uFZ=2TFD7aMhk8gd2#D3&YJDy0_XRf zAzXierY7e?GcHpGAz3h$^5YxhWJxpEoJ8n0^|>}a_Or4$SPbGyTN)Q0G6N6*U~>Iy zi$x>sLm0F{7GlsJj@GgwQ``{a;W^m|O&GW2N>iHkKsyi>*+b026}t_oZ5@ZQek zXkeOe|FNw^kCWM!p;_p{q|qfYF&)bSO#(R3a4d2#xq4O2VUsjtg~>TZ+b5RSDc|=N z0kFH<5U-wR^<_6#TJrlmkP_{k1wM)OS&ZmKx8YV>bShQ!^(8j`8z~OCX9`b;@kPUDj_9Wy&DA`Gq(z#^SPqWRIM%2^ugF-F#1~w^>+OhJ~>%00~usSh0 zbm(#}e#o;nJs92HsyL!fsO4SG%D6kLxX!gUUdVmkVcm%}RUD;Z3B_xJMAM0zo? zc>)SPZ-w;LsLoc$BMeKQWGM{Q_C`L&1X>ILa_H7)7DXz&OLMBYFrvYl(v zN_Xq+)O2c?Rd0e-qCSFs*(lmMaA+aQl*Y(ZeW}muL%&Zn8#ZTLW-Z* zcYOo4p6J;^Z;Z#z7T|f{@xEa!jd7z;UryxQ(PY2uxPvWqert^Sx$-obqdkY{85X1A zC#L6sds@?*0z(L(f_#jxPJZ|wxF&HMSD||b6l!3jrYK{;^T*5whZ;Le{QrzNo??M% z;FW(B9D@=a(wSs5x-?#^)aqV?pv6sE7-yyS*hK<-QTYy*I@yVmCtoriUA4UvHNrwW z($hu-$>|Q|9&NrGwPY+zGQV5M?Fgx8u2+4csjaoLA<98+jc(Pb$;lz5F>OLcG=6 zfql~XWs-2Z`&{00sNma$6TJXD;)4&*9dC+-4zX z?{)NEU+_~+*wbAO2mWl|-r42Vc{;E!RoLK(o`hq5CT#W`IC7--vK*O7SZ^DCgt&LU z$(N%Gdm$kWrw3D3tO;Zm{WbWpvb2-e=D_0XjUF@42N)3v5$VmH{k`-?E(!U{PVSpO ztVoLa=ChEBw=6qw$o2Vg5V-*C`tt^hj{Fx0gk^3uFtdNz`7Jyqb*IRLRPGg+>~=f} z)Y+|6ERgD;mCt7-vHxxH4$4vfu;0j6{9rWd$sL9gp6H$i--DfdA)%k_tZ(rQt`isD z$FtxYXAWfU%$L|EkiO7KEjP4@UDo{d4*4etuPO9b+VUyy_H&jo?fYsea1ADLQ>Xe* zv3YZ&?>hjdHWHtZX(Wa}zrFD4_vg=OKe2)Uq`L*1bk5oM;htsKZ{BHp6Qp%UM1b2hC}XJ*pH0qnPcwsh|JdRQ?pa;Q%eE4-N6Zl3zAXBl7jSLU5X2F-VWVTgn( zt9|~i1eqD66+oV@{Nfth?ep`PW!_6I&WK6C?v>sj=AhGf7nJn@<1^!jJ#u!A2BX8t z(k4Ei-#!37)8G4v>L`h44(w#8%cMiT?*~jcH(~uz5e{fr*LVj3e-=76lq_5<%Tw~g zPa9jwS6L*yVqtgzDRq0ko)fg z$<{&sAHHHmRs2uE~rWWKj#V1$5OM0Fu>$#FRfH}y*>4@#J% zk{ZzNlwWEk%iYr7(4>ey#i(f@1-yYddL}wEQiagM*^fOCt=L?p)Mu^TIHbr)&-)Iu zLTu5S)P8NKmkV{MB_5V!X7C+j zRcGwTnCSUIBj9fA1o(S&1F$fwlt&M?GsuBHMTvf_;{R|LNH@61p}akMBzC2 zsJjOuIVRgH3hJ@X9k@kjQ{gydS0h9Ptfo|x&_|6$m%9OdU*9*`KS#Yiv$ZI+B#z;K zau5YDWw_~M(Z*P$@=O91nk%Tyg>Y`uI3{s8c)4%(M%cax&as&+L+m;*3y9Jsz(j z*_DPDW1sN2$f(pPIRk5q1xBKkys04!dZC(LKfYIU6L6hESgf|2kGp42lcd_Pi@qnv z2XPHzJ5Mp#^y*~UUFM!sP`>oM+@7y>YFQ$6eCI~+;J`>nIT5a6JoTY&NL9-4-h-|P zb!~rWO^e6^sVc9*Eb!dgH`489@gEU-Tt6;vw_R^ioEydpTW9f7w$vTE<6L=cakQ4$ zTgmP64oANACl=az5Olmb$1*y{iCsKee$y2$6U2LRk-_!as_I!qgn*c=K7V+)IZ78= z#*1pPZNECXh;19WGeRfFzM!a!w-(Gwe|9`EL|yf2Wn4;*N!^O6k>0d9af7EC3zws; zoNX*>y8WCMc9iblh_otz(2uLPR=ZrBE+|UK$IR)BLn3ctE zwhRD%htH;3VN-U1WB*L}&ly)5>LnG3XeFP?4{qM+Q6ow+PsoKneoMD`hpTLPp~ym* z-&w1587ix_8c>RG9P|Vc%kEFZhkr#q0g+%G3PIXl@SnHm3}&pBJ`?P*v5 z0RM5x{(Jw-(+L1T>VN5<+5cy4Nyfm|z|6#v&eG}s<)h8;SSf9eH|{=ChdvU9$IudV zd0ptLH;RZ0ddotf#2Y(NPLfI)X$hn%Cr01@J?`7R@vzWslxb|cP;BYSKmV_@HhuH+ z6#XS!TV^3MY9R{w)fQbDiej`VP3eKWvh?G!&=>BQiTE);-z^)J9UT>!eKHcAm{-sz zsGvGh9BCSEqOBl#VYo$87>O5e!bt9roD@lBv8{Y=zSFM{8}VR_Za))Af=iDG@11oD zS+jlzTVvW%eEf7s?kMS`DT3LN9@ofBhQEjbQAiS4a4*GE0*T4Uy?%(hXisWRa0|tc z!@}=T6HqS}36%h%5R|M|Owq6l7vDvqvD~aP6noy*BrTr#XKSf2 z7*ht2blM@o6cbZ{sqWl8_Za~cAc;Qc^7S;YcH(}l?r7@%`1pS8vMvl@OB&j|_wpTny$P0bg!MDD7}92>xFoCILOQu>-(`6(wn)m~ zW4}l!)z2@eE(XJTXo5O(zR5$2fssz*E(<`#O<}kCVwltC=5&$1#D58Vls~Pz>nQfK zEYhAp(;0Dt?djK!v$-wP-;YK?2z+lk5nf*4vcPjJW+slLbDVcf(i7MrEq2zxM7ydaq%c{L^J-&`<7T6|~R zqV)tVfK}PU6J;@zk|!Jn;CZu=IcJ|dfskW;y+`-YjhTay^|La)b?W;F_ME!jVgh5A zdTijt-*d-dw}wF8#`3w-l*>R19pBk?GzsMk|HOXooDHq3^v#^XEDwn&l!arho&00G znvtE=hXP+!0}%0_5)!RcFH2LqjY9xH2~_mP99Y=P#p+r-wf3N?DC3R!GquAf2*&i= z60C<3s9>EHy?ra(MV>5B6k#<{X)cMLs*7T`3afBNRUQLaSAy3HSr$~<^Y%ZGt$RUrHiV+1@$bd+ z&@>(;v#Ko_0z#|xfo&_hvt}n!x9$&Z0Js(B>rk;0lj&^;dIUrR#$$TH)dZqH;2b=S z*^9C!`#^s|FF2_>E2Ch>Jm_P`UccEYzTQ&Me#$7kU{-8$y}(5@M#uPP9gGT1+d$v$ z#uB2B_McbEG2tfVCoTWwwo;_@Wr;VxE=Fxc3-kb&fEL5E7U)NMq{fEhBSavyke_ z{wKDev;YZ_s1V949vF`I0b7}_6BZqwbazUVD{-3wRsAC3Ebps8iEf6q-PS5}askqT zm)+LY07mmk&f>E-D=3D#eBfiTQXfwjFIj(dr(^iv+6O(l-uQ*F4b{cfRFd#gUP3%-}pUhVXg_h-HSqSQCX+d~vENUX#?<;IvEEJOnXJZ~1_f^& zvFu0GXG1qIIAbKk2G?#27Mea*?#IXb!}aa``gmpUi`YY?)xhr?>&9-gn2PvV#sM^G zn%sNNkw{DFk2kC@=T`(-S?fS(#P*c-@GXD8$Dw?aAcp^&Tn%@3Y$a6*?rH%YJ5aqy zH)c1dkE?37bv7Qip-1+yo8ypg2dIrLerM^=vS*eV1;a>=3B*AfDBXU3qYKOT+p@&R zwL0(5XCVh=Wwz?GBwm|-*1vS)2)h7#;NvvcpONs^x!I-AyJS#T2~#%K?m_9qvtkAMQMZ!V6L$yhpHf`u2vi^xs@&9;b%$WAIj_5b~sQi{T} z#7Ti64~^Tf!r!aJdza=Ser>iy84$j4)+V_edRw$5Fi`g@Ba#87(*f2c2i~qfzHFQT zj`50Iiy@<$JqS6el-W3DXO_ynong&@9e`vjji%jo|RHDJz1~dmp6sFG)=iP3*bxL>kq!s0Y6x1xlO=e@kW1`SyTIYThsU{2jtOh{%OKB zqs)52YVS8{fA{TF+cn)yP4j!16O~@`!{gGj>!IbsuGwEoE%UN)k9P;HYkMq|7@G*%QPg}PV!Ye;$t4-;oF~G zo9RB<-lnO+X74Qq?Rsc;Oxrz#m8ej?mx%eq!=0 zg~_yzz+3cQoM8(!<8*ylz$JKe19(WZXc7qu3Z(Q^Lno)L>?N2CuBqB6Q)X@weexSD z`()inlT!)_>Pi=ol?3U|2P4SW!x;ir8fem(F4Yt#BYFfFG-mz(H%bk)TNnON+PBi(Y?6!$EsZT4We&*-UY?c#A;_rIzyrDHQ2+cioHKC!xWIR zMT!lhSplhvctJt*F%!&BE_C!3hTjNc(iv~iup)Vg!9o&-JZs@uV6o-$Tig&e2!L!d ze|~9na~$Nk@F+!%#vsOEsaBy*lfkVTWR{}7w70IQ51q!$MO$SAC@HL1hFCXGZ#^~L zZibo@cw$+os{W|eJ-KtfQ`a{&m1=cJv4o0m0*P6=h=ZrcfYZLH@GTY{)I89wy_P(0 zWCG<08WzU$${-^+)WT=QKXf!vk{oK3yt*|1S}-UJ);qdWPlB zvLf)G0C%>z#!L~pH?yHC{i=lz4A;GjTd9E`n~4>Cf{9CM$eKpFiZTg-Pb=$N&U$(RW|vI=|0Owlo?+ zwt5z3m3*g1bBygCIj|sONk6f@+tY6*b9b0(M}MSG6G?F~nkifwpv*x4xzLU+{iw~X*MGzS#8L4O!V`eYVWV-SOGHDNU2)}beHiWCGwhM z{E$S~10=}TMNjPGLiI83Q(~bWx3~ZN%j}3|nN!rmn`z5IMTIa*wkGhWT0+Ts>eq8q zQkv)3u{H8T*YzzgL|Xz&1uMwN?tW!SCw39CL4FTipfe?Q#h>o1pF!e^J;Jaw=cUSH zKT*vXx!y;Gdq~yho70ynH0c~(GrRi8bXgAD3er;Oo&<4-Fp4Y2pl>X%;CY-Rl7QkH zFA}>1t&KJ(AWDvI190Jt2sRCgCtS&02*Ly@Q`EM6!l&h|j{mU+HY;nTP$6!dB&dSv zT}sBXZ&>@J(u^CAfph8Fn7vn{fcDttWD;+zOj1!(4WaosL#o|mb;sBh`<1Q%rjzKyvCG6ce)9rZm<2rajay zXY+FS^$V^qPIl~6tuOh23ZmHUpc{+>9Gp4BoD_yVa z;vpU8F~Yrf!Bjh-qXp~uI<++q%ULAT29+|$Z82J_w7ORG>!%LO2wsy+_8;iOu-?hm zRJaF*4MxkC1BtR=x@&j8(c8`WQ?Jd-ABA=fuXE35Br&E|F z)()*eQfm`aBj=5YVWTvL?`@>yl_WiF?v&xf`oSia0%*?K-rm_kr?`Uaa)WSq1}}rz z;kc6r*sbjZ@k8WqPoLPwWcrb!TX-&^H#j(Xr6?uN_R8Y6ieb8%{gXS$!XMXP@%U9* zffvZu2_FI}*iWYP%Ew091&dv3=q=+Kl&57}fJ5@c;nRe|J#l3X`*+B&@LI;PD ztuJj$mnPUYwqH(T0aDzYwfcwtcP1}Yer4y8s(9>Z{UDbTI1{Ax-6_^D=bQ~2J(MCl zJTv6pz|P@Q4TeZC?mv9R9TueadjQh)Y zV%F38k9yg|RE2d`5L*tNR+P=<#5@lRj#O1@*Xv;H$rxNf!ce^0!&Q=#iY0F?WbQ(W zeOcz5qGJsHLMuGi@%t*>6&9OHnh6UW7weud9vI0{DJ!Y~qaC({^jJN9fINWr?GoTgeK+}+> zEJcSn0kucG^oVHC>5l)F^9GbKv{F)cB$`$@;btAb41~&7go0N5d)c4&(;g_Iwl*t$ za(8ODj;ynV(}dvA7Sy(J3Vb_-cGYNZ%qzG55p#9>gZ%XPQ^%JhGQ(W0#Lg;mC`a$N zk53QARWtcQu!=NUGap<%aTRoH09wv;_g&P3CoxB)j0z+%E)@%3@XWRf(%0j@uM}1| zBoo=y6?h(&l8%i4km>b?AE7eqp|njd`&Xp_#HJ#v(3$EMW+2Z@vs!5eFDULShBL|J zMR}xCtRiiIE&Rll80-&9R#O|U+6$sGsU=-I)c2<~5F32F3UciBIb>L@!weZt6R^5Rxxvfu9el85iWY z0{5~ri=4Mjk&VfQ3Zpx*so)59WHa`;&5Wk?3k?5+r>~Bl#!D{O_~*hbnhFeef=Ts% z0!mzIFgvJffFful2uC}_ss6sQg6Kaa(Zg|FAKpeyVRfX@3&B;5SC#)U1&t)nh&o`W z1W$BfptlL4XURKc-${_ZWNr-`=+gsEPQ&0ODlMF&P0_{Xg7ItRMnlUH9%oW(73m5k zJY60;j6?waBN{BCokVjKqsq4OFn<)8swxFy21&2xMc3rEdp!4db%5}dLOjLbV5L5Y z_Rc#*@=^9OY0Q!XR+S-weT?vrEO!absZii0Xv_^j{&>G-2c6^tmiDF^2r%4hznXo{ z3Uqxxg=66ipp=3=Pj;Zpi+_uIwHps4r79cA<9baBAlnUkp)pN88O{OE0wMI))tzJ5 zqeK0*$B$81cc4bkkQy16;- zbbe31c?V*|cis6e-ahsBLA+dIvJ=*GBZeu4M)hrIqi6idlPaw22;%`@j{;vam6PI{ zey=;ikIEDzx|(PpUKF~M$+jXTjrmXo*L%pjmj&zfbkMqjLwKFnaqc+=XMbTMY9Ibj zTAM~v1C||$I1*556{$NJM}`UpDjS%58Yg5R zzS*M_XMHeo4C|2rgVn2d_m~yHx{47SKaXz%v0P@>NC9!7VSj2t4~^PH4_n@SsMvVF z5JMEW{`;&lOv%&m)%qk=8xU^?McXu9)01xsd+6|)y+DS@A9(~nXMS_`H~AlcDYjaq zK9|a2yPtI^J=b~s-LE({eI}Zj(`6Sydu22!-phIVU2aCK)El&`5Mr5I_-L0Iy%%Dx zFVmqu20r_iW~2!uM!ZmO_=ZLC z6EPhWd%wSo3t8D>wVXj7_4b=pDCZK$M&3e(#v1sX`Q8b0@{XeE|n@;-sjQi;31(bRd zm2K2uDmm$?>WR;##cQ}sH%yokZl#$bhCAa#9hgtRj)zk-&~OoHByP>oNl90{@pG~d zlo29pO)ZJZv(dCm4aCdWNKYp>FQ&JvowlF^ciX8-KP}V>b6PpY{Y4Ku$!m=zS|Eyl zgJk+;0$(x08)xzr}tNI zIIbrDt-wRQRnl&7q8M>MLgz`xi8%<*u|_*N__DO)dHZsGRnjVRl`8q|V>d#-j#~0^aV2Q9fOW#G^#@>!&t(+hB<9Mzyq& z8|+$bh$Usz83JfxW8vcu#Al5ac44@lz~W@hR*DLe*dta={CG{WHe81LEE7PhQ(w}? zFQ@G1VrR2P)igZB{+s8m3YGt;xDt{6h>rdY7w+LuX9ftlt%#2?b~E*|Kv46~AvZI$ z_I(O_Rd7*6Q9&C0Y`do10eyT}qozV?9r{%rDu6(nt?T-@UN)4 z-0L5%0rhpMn*QCe&et+7wIICQ?rZaQ|6YQxshLMPes|YaLUVAcs0VUaMY(aaOKbgk z>q~$4F3)JZZn3h6`KyLMoK&MD<8Sa}6K~|KU3I)qyTmME{^N4IExP?{dAft{V%6Z2 z9PUgqmF26lkH9e>m9qVITCzQ59L9>dFwp*8L@0r0095-A^&@a zl1K&sKq7PkuBc<%Z&QwaW8z?nCHv_KO%l>+Ihk*n# zppn`V-SXP0+8e4%U$0qzkB#(-kJx*1{l}MYy3Jf&Uk0LcZQ{+2Jn_(tvB;DAcWK5s z43q{>le?iJ-&a{SJ0TP^5j^KCG>2(Ol~R+~D7EAtaQE0q8nb5}^aGSjIZBH4m3+~U zoWp1|BnAmcIbse1Pw$J5`lFKwVnq3^1`6Ffg*oR{OA%*4y<{In6s8_du0p#DC})C# zwUd)b;3gz+0{N3c`mwYkIbz0z=LMqID27x>fjwsY?fV732n!gWPLEPg1ar_?;v)Cr z>v1C70mUYq2API8K^)RZAl;)b+{$+?F%#HPn@?$gV@~*yoV%lvf~6@ap*d-j2onMH zA70)*(jK#{8vR~kySMwgxA?kz+o1csXY87UOc9~)NM zCuJ}a_CO#Psd?kFw+37!Ma%$iL&3pWd_yya79VdswmcGW>UuP@IB)W1l_W_pd~za1NaPx(I2?&Z-AKv@nCRapjN&iJrp=@v z&rVRI`6>r_Hj z32W=nGU$uQ2;`0OF)#mw3u0IE68hS9CL2QE95KQc4?YA7$Pv4gej9I*5vq-m;GKy3Ho$*Brhmj;Ix_IEBA`KFqW^XN zSPPj7!VfIk?XMSGB%u*q5_rf?0c+!jRF)71kd>8M5@MlbKb*cjV2>Z>1i_ER zGq?eaar)2AM5N_)Oog;((9Z+*ls`ZLi(a||j?QyR{*Z@?!FW4=8PN}x5Z`C6WPk1& zyMOn@s}c*Wl&G5uynAJut$$*VGesJzdnjR{a+3NIVhGK#ODsMIapooasm z;xu-{uFPY@VXA={qffJ9u_&`f;t10KB`cE6Lchmv9@^tLHpxwVobWRr|BiFkaL4Vi zUy?KDJao!&9$X(|vMNAfEl=cc{_9eIcPaoF00zlj#Gyxp^0N~1&>Q;B?>g*mALWKa z83?N3THQfafI}K&{re+iWlE#SeO0M3zA+s(n_7n zGb`#ua48j{5`E1-Gz~?2Maiz2ATkA|%QRh9)}l8+hsb7aj4V3iE0~6gj5TCEEkmsM zaVknCq*JGUn{x>&F-BWtLKDlBwlE7Gc&Z@Xwe3vlNqqfLY zf38WqKj*+Wrp52k(bx6c!`XrH@7>wc*_EgIjPu*Jg%dS&ZMGp^v1SJABu72&ei0yl zx{VvuO?4E?d4Z{{1;tusqbQj z|ARNQ$j?_2w*rN=rRO9}W0hPA6f;@%KnzAJ@KS$ZLZOV9Eb`L|D``MWY3Kx#WciV^ zgdcsu=pD0E3zo}RT-W+L-$T$m>Z#*+;kR%9)0eJerhNL?o*e@yXZnq1VSRQXX0QcX zFn*8BP>dW%;FOh>>`vl+=~P`{U?OpscyAgr@6)ttCOED^e!E=f)pRuY(iv?!Lnrnk zYEB;P=a8~b(wNYeAAgj;>Gz3R!U(h6uroY!zp4gM!ck23u5Zt$>*?Gss~_$+Cl>64 zzCOX?&P4mljB^_c+rF4AKj^V75UV+hNE=pNW|>NYlBd{9Q?+id)eq8(yv+GzyUV^| z8U&LxE3c4N3tK?{!+r7tM-E~nw=T~ z%QNN0a$mMWw0<=&`6^QhvQC?gjKI1%t}~!{^$-Og^E_yB7k7fKXQLPm#%2oCA6Wj? z@Ip6g>lZ?lt=V(=n2?s0n!Rn!&0*ziJnZEG<*dPg1;_Y#x2s07~cv+RLQpp^uXmCa2w^J`r z&*@@PB#lOR6MMQFM`Lg!{N9Rflh9rRu8bPvhe zStH@yn;=L|_zJtFHNyJn# zV_6jnsmrJ)ZNu{o1wo|NDd?&NfM?3bT(jD+M>^8m4RkcFCT-;`?2Yzfi(3fKW~8gd zp9i%sK-5sYDK%-ipk0mS|5cQeDE?rQywPO6uP*R}xISdFJzp!P^6N6WPA!Vk`G z)w4+(K%v~%Hyr*GotG05LYJghP`*jDw}3W*LSe$4Ti7vB4=%u5L_QEqmSU;4h0fO_ zSG+eB94quh&~6hL4_w?Gxdk{43CsAlf6f{F$R0pykw+ucxJ5`GdW6@jlC!D^BII5@ zu4~g+)vu+Pu>u0$rTR-(^6i1MFbm)>8DTcIcPf>TC?2nI za|I$XNYc<*n%uISF;V&&y@7!*=D54S{^Jz*aUD=t7UrG$?$CTL#NvPw>?8*r=jk>R z`5g+c>=CcA-K9n(pQ#6@cP0eRz1MTAv7nrJ7RHD>rVYomVlcuBL?LQRzy~u?)WH^} zzWqf{8m<%wzRhk=QcFR1(eG5s#pUajl;$x@EM0~#w&o=2V`+9HF-5Dm6}t)-yj=!B zRmvK`k7+PkT{SaySjqE!_P1l_3|jLQQSG>;PyYQk=jGyEr0)fn(lW=tT3)J~-q}~` zkwl%Bq``HXtf2dh?c^!bMlOZmH{#RhM`7D>lIS82ug}xvUt4*jmuiRU8o$HJ zP3czC*D2mRB=3z7YKP6KlPhQjM~=q}mMo!g?owJUDxafF~_^vaotvbnbjI|X=b@^m;j5nenLun>dm))MnNvy9O62O26 z(B0isdL?_-OyW*7=pPer=!yxPEf=pWO)ll{3~R0>OR>g(2BgSMA}ac9Zc6lhP(mYJ zO6Q%*43p^Mv$IOcVM?1c6Rs~`nZVdi<@^?b-Nm-k+15m@PDl4-5LdW`^%L)Q+_?|f zIoK+#2jt~^$;+m0COd^&wN$2~thHXXP#NWuQ>MWAoYz_;qPan4#pdb;RHGFx@++O; z$HW1K%sr}q4<4w)Sn%9=U@W4tmO{i7&|^NkG2~QOJm4Pu4hnz2We+1-%#OZP3(Xfa z->joIBIq=!tYXZR3yZ>-tpza&0#;kFFqouzujRP2p;5ldE#g~X+biW*;O)rEs}K+c zb4@O}ghbUC!Ndt5cb|8K$Jvzi-~+_%7vC&iptw!cHaKRH=r!}O+hz^nT?Z2guPcUO z%+tJXKtS^|3zKqOrlmTyRL=8*ypxbyj=Co3*7`>0>t(Cz+9tkUe6`N#TTd}5t{Uca zZUEL_oOh`l4cOdtyhsM|Gphzp8&+b%BJGx$6VSp}5lXteo)}_Y{KShjdgk024!Gic zSxJ>S^&RS^h~N$=NJ_S_QYr)a_A#{pAl}z9hGwTZB@=Qj z*dQ5-eO(M9y6tjB1@PL?Z2s0XX=b9iZyO!$ATzK>;ORon#KN=IzVAi;j;eNMd99<6 zzVGV7;-T4+D=e4$_Hd=!_c;I3a8?jo`qn%aODgZ%i8im{gZg1rk!TN_3a~~%SSK1J zIZI-Xm=0yGSW%EFsQU|S>iZm~X$brZyuQMU*~mAd%sAtqFBv>x##{#e7p*`#q2#*6 z35IukD{OFo}p=I z<^9iF-HTn$i`}aqi)>XpGVu3Z3;;)ANrh$7 z5!Ac8^=x5Y6k}qF)_kxiZ-qpbzIqBP-|$8lzrP7xfg{oej7#d%%4mOLLR3?iNsHO* zN|*Abk1Bm|MmTDuGJ1MSmxq1))m+m2JbVh(9N{5!-*iGEZp_W(u@S65+-MV2l=xh| zd9+bn20z76&@rj2OMXAv9;-iHXSQhZ13$rFk*8luGxYJ~Z>D@Qb2S}D=wiBBU9KFR zZ_C&z*;NU*pX(i?_jobtWkHg8xzW$KmLH8E3O*kzWN#s((`!ztWf43lBGs;yGgmVZ zWb_dx4*{`je?=PllwZZFbdBGBN!;O2U>s~s+jOxWT$W~I1ZM_)f_Lf$OfEY<5+z=# zLu$8m<#4-UjmOX`&2FU1i?cQ*c~E8yR>bN$dyE1xrW8hE;o}BcfF{`SQv`llPnGt#B#KrIbmP`IpMfVg0m!aOh1|4iLW^z=2H+I?9HX0TV|nk`ePNX*lmSNokqy9PHMD%#mDXq4BU z4XF`;zB%)J2HMB)>9kWS62cD-M(-~chibuSm_+w>5r*zE!Gk_ z=xK>{xNoNpw7_;@UdbboD;B@PNJbdj4+}gaew!{H?_1SzUlwNOKMf)Z0`8SO8Spx z@?UDoKW-5~V=R~2fA0VP{BLG=LSdqpSlo(dwO)sucQo6X_GF@)Q*6_i#_Q4%6Z1@h5_HX17g3g%>y zlVEX8kq)eIOgyN0u8pQOTHxlAQgpwMo0($Mo}H^VK&fgT95}_P!W8r;1CbC!px`}* zmN9Jkuzn2EDP0WCz7SHKy^s$i+1YjvE=KNjj7$^+Cy*6p5j{2od*12=8)2K4VxM#E zDC4P%#wk8!jP5y;i3&2&aZ9{}K%|@&tp$q-1aqkC{NQ?I1!(ki?ar1vD`pOTt!`pH zB~$hu4mer6CWXX!aw>e%CW4pv%auE;n>6h{>-?{?gN#J~gtLP$cizy%2+XKGM=ot? zQdQGE3|*aR8v5fQh<>azH0B;PDV=v(c{B$nVTuh>U+Ji(VVNVv2(Dt#pJcaT8UE6> zO*^(Yf#AiJ#WIOe9m0sMW`D^pLUp2dr}M23edY~o)``YSWSdlCRQ{{8H1Y6#GH#Pu zJZ`LOWpzVQ*g0oeO3WV1GMwyC;+*Xp7>~}7lxa!j_9v36uYg^_^-bmUPr5!UA=tk3 zrm1Yy10PoALO~5!B6KUfNVHMiCLIlMWF1sT$S`ie z4fd?+;+e$hJ|A40SZr3c*pH`qwA&n3-m){CoGT3ap{!N@i*2Ed`KUE7ucEZxy~ada zfh6;kHMR1ux(;1P4P1V{a|tuBH2T0`%?WNgEi|+FtYc@|b^F9(b(rc>QkT6Hm`YZWkcPNEhEG ziNwo|28z;F6*~y((Wxh~cqgBEs}4ry=US+(HusW^=WL*!pEer0hd|ajX`2g=x6&TA>-dRz)HsYH$%HOP}K(+q(1K{;w*(H?;5?@6WfcN;-A9Ko=}7UeBE1LcQ0 zGTAgJRd#Mci||$wx68r4S83m?M4NgB;F}X{`YKbfV7gI%528scsvUhHRAOXsT^oF= zTkK8z5RCF0-+CAXS|VGv^=SxUbCbJi&=y(K)MTf)(_}4;!UTejb4Q-Q zy0EqNCV=VKw5!EcdjyDG5kkhsZXn;-$KL}>fC6W^3$Q5UA)xeJHV=z$cW;Or@wLD1 zkiUYqB>D2Ce?eMS;d`( zIFIXnv4i%fQ8C*t3U2bn;^fUkN6zp6)gO%UkTgR~Z=wbMs4^o?n?=AFW^7}n( ziGPquxcTe5?Yy+^)rwJh!LWjDT1It9u;D;Lbc*WNzQ8&SL!(-Y>z4lX9 z8+yMY)1*C;-5J#_@kYsAsMK0EGXSgZlp@gZ>92`q*dF z5qqLxudA=HIEJAgalU)p$WDHdf+8^yV`vj;{%m^RfB=gh*&O<8^xQT+*hD0Iz3dyN z?;8IK{7q>#&DwOervuari03ajQ6z>Pg#* zk2cAtbqf7oidpr9=%q%g#r?*>St>NMLmPjVxv}$WsQvyn6INNMi(bh{4@!r3`=1CO z@y6nCvnxlA>=I(v%vgYe;E{P2U&^wHbXZ8ZR`)peClI(RA2|O*sQKG^l8}eMZBkHJ zGr1Q+09SQgf_PVL!jpf2%ynDnd7TCg?G>4#{<}+sSdC1?D~n!#L>WMm=zHFrnRNz( zDW(pcSxyKbs-`*e?>O|lkE^{ewU_t3i;KPP-%ILpZ5byDnHwZHsvLS#O8!s>R0q`> z0H0ucS8ta$#7vxSE)JgaU#KAcTe*+Zu^v1xKZg;x_2U7R-=n*w^8wVZFJ~8z1+G|( zOVV)FKmaUpZ>c5_V;pjo>{&^UJ3RwKseW5l)1^1M07yL2bKE_&CWT)0nmle0q`3!c z!J*(u7DB*|B(2nAm9P~5qe}}F+LyMr+uPeBiPq=`!$zJ%{>ke+62Y)>LzRx(yJrSE zK-%Vqmly~h0_9{o$H`wJ(0zjrUm9x>z@1-XLxO`5j}lLNK?PexkLQFUEP%r95rlMK(QUc0&@QBQwGeF zr<>g;FCc4r=<2?#msBL3LY8to;v{s3Q0%P8O73Yu6=HvIY6{0ciF9ZZ4M%1j(+7og z+YQyOU{2a7s<@NN0m#}4nHKb1v~8zuJSot^RoMsKRZnQ}#-Oz!Bi*M!Y2rXqq0otV za6rVPOc)Pj9GKetUb_(cYt}UecL=6VMN~u|n{h-c*W^$e4@fHD(nJ!BR~l%{?Rt=E z;LW6Pdch16MGuN9lg!%Ahi^=T^-OZ$SJ08cyyZw& ztQH8SsieM0rbx>$S*U&#Ry(F?A%+3(SVRU&_!0G<6Dxtp?pWeQOusEzq`Xt^yQ)2~ z%s2tf?#gI5qYPx0MW&cDhtPYRQ%|9DJ`R$q1*Mh&7((eSA1V!98LB?+=d1rH?#3*n zrM%F!hD@Q)k$tfl%6SV@)S+Lj72~s9OPaVUJV3t0l;mDmw%F*x0F^a|`qkM4d`d ziuFSCYx18Ka%u_)a4uRboYHDW%6e6{it3iFN>!uI>FW`ESMbs5r)6|J|M1V3zJDty z`c^!IDD8_?6F@xi;?qjS$IF)RAtfs$%$YV5#U*N78UB!0yWp3tlo0F&48l_(8jP(7 z(s}eM0PHW(aAc2|{Qddh0^>X7@AO#}gj|}dU|Mt0!lf$xHrBowN(}SB89H+D6$1@o zma6h`?V1){H_Dm{XOAM6SP0NTlXQ9$k+lIwiPr^{1hM3tKs(GigumcgpcpMU09&<1 zG)}*+%Qp|a(SSX{x!|2j^ywQ>G{)Bc_vSUxk=J}Yq7M{o0h}iYc4|qZX zd{Y5#=$W}G6U+k3u}K{CPcKynSZqb`#43-~O9Va3XOQ?pHfPC);GjH_t!={=LSQCZXSS?ge(C+!HEi?2s2pwa^eHURSx43gY*vtUYBZvbd;`9 zPN`~?JgHF(K+-2lV&Eh%+*|tbHd#v+?=zT-Hud|a7Ftk;atSEjV3;$L$ZiqH_Wxn0 z?9xj#UI68EwaBiaefiw|voZk2XBjGkMl`zTo^y{y_ZuYQubF>PO==rrnqtBVE<%IZ z7X&(@(tL^C1!w;2L~tKQ1Rk=YW|WMszx1@&r%%s?h1HHo6Z`@yqKp|%g31(>v!t~O z7XhA>GeQIi^n`>EWJCZ+oA9Ex0n8uopy<}W7cRiCJy2GuPDVn66Yu?p*S``;$kN95 z_d{j~#jl;9o&I2C0K$B?7TZ>XrLFDHI_h63QquR%i9};*Q_iUgh&mYvZR~sZX^_9? zc81m*>SR|~^bSPk8*^Tq50czNxn(Aix)gjj7sw1^`$mWb1wq2Ogo7`04PRi%>V5U&>avZJp0x=Hew2 zN5 zsn4d>F8XNmH`Lbw;@@Oc%rs7v4%8;REn4>=&aV*+5d1jjNSFNdml)9QN3*T)AMIc? zG6~{8gCp-r{fWaMH*%5y(z`{#&lP~SLEKo;rRUaLtm?~Q5q$xM^)p%GxeJ=!z#dRo z;zPNL^dl}^!L8<(x4EKZRu(nQKvDKBs3_YfBM#h|t>{-Xav-;!4o3a~eKwtXSxcw( z`ZLUIP(KL!U5SvdwtFj3omFYlJX@FhGR2X49$HB)A%*fQ#IO;5wwvXLaykwGR>y+o z#c4=zcIU2SoSxLa5s}8ZyQG1{DATm9b`|`*vVyj&ZxyyS5qdc-Fd-iZ;Yy@5rsX&^ z{>}~obZ#4i1?Hi?2VM+sl21(ek=f`+XQx@d)5&Z^hGrfTW(b^bC@6sjOfk2L^N<2< zxry%rksvv!_F?K_UuWuSwkBt{!g1UeH4U}ybBSCs8GB9D25%bCfl;F8lTn_wsG44_ zn8#(7(Y_WWtf#Y`R?kstGF2Jum1jkTpH~ZScx{1`_ zFd#kkRH|Yk-21f%b-q>_IpM;ep0s_g+ChUh!F)A@gljqkt~%V}0@#~+Et6?Q73GJ^ z?dNX^Ok?=42F2O5(HCq#BZrF*r^X`wtYs-unX75WCa~+f5ur5^`EMdV1t%?fDpP_`4%p3kuLGXG=;(88y4+@SdK5w^of3Ee4O-6M@fHx&ty;AwL*A*ensgRIe0l@p zbnQB=bsYXhxnEe%^mHlZA7t6A5@_%Pc*|R?oF4dAjU3dHyAD?#O5mvEidD2(fWp8x zB-@3s`^JgKB8$X%7<;Xk$3y`RyleHp0DffkAI|h~bjqJ+zwJ_yT`0y|NYkb=yt2rS ztb2rTz*g9(fUW8w~4qkZT;C=+xX?@*hBPVA=he3joepjPRKmz+P#ZYs?#*p zHE&w#HxZ=u4)ByELPD823LE=-qxHZc@%QQb=GLgERvi1$^KM>~VuEO>vFY(>@ zcu7(y{bc#xo`~OR=*=d5Wn;IW2HUCBO*^tri7h?aIo@yUZ7Fm}CW(&%7?Zn;)zXoX zw|+tGSn=bQU5`5kT$j$)#eKnE5F02oJBpPJxw+uP8e+D&whL7;qyE_L+P5EIJNvNX zd=b6^Cr-Z@HM%xi;#rbjv4PR%`CCVvkM=2Q#7`ouU`e2KAi z@Nj;-Z}!}8$8VKxjt;ZFo5GonZ1`5Zkycy2QgBn1ds$LN0 zJZ;VHL73SLx(7dkTqK83#FQnx!oI8;OJ(Tu7%cj?GAa=1t+CS~OYDU}wl`*rHG6eO z--BG|jsTN^z$6DCT(6GMhC=WD#BnNcec>p}&Et1XE|3G2p*6XuMCVAT*5Z{2>Wmug zf^06G*kCMtsZ@bpRnjueMjf$I@`GY-l^t3}k`P1b+&a73a$g>{y$rTgjoNlYhpC3N z{o&SYaG7-A$KT!oqkIrk-6>l!pIo6%XHZT!b8i6%1(>lL7@FqS2*3C9Xw5vGN=$&T zZ|zhT8@bPcgM)rk*^o>13oUr<1=&bd0Wu!hRf$6BsU=@vD?5VQTeCF8&OEkF{Zib|h`9}5lt7k2q4b`gX;0hY`P1ZYBg2VGF!n5p9!kQa2 z^b6ukTC-$8W6nN@Z}Pg6sdi)T*#N9uEo{S{LV10USMHcv^N3a#REV=FAlW^E57Xda z0!S|B2C*bd$nQg6w+x|bNSAVXKr}vZC$e4hm`uPXc?YT^Dj0A0FP_ei&$H1Y+3+A5 z9b)OQCWl^>-DLz*U|}smi%yLy#+*6Jo(_n5&bRi{@CitpBC8rX-d*|>7ss48gSqEr zp`ZQ3FZPzAjw;V6DVdO3kQsS(az4iY4cG``(mmk;N#1LGf7bez{wJrGf+7sSB_*|~ zvtY49j}+f%!c9XvT^7Y0I$YI&lsU(azHO*nbMr=GHP6m9E-n421eyx(>lVJ!F`oGr z8j)Y#9MxFp@!iAS6$=RuDX2eUrxk~j_v4Il2M5fzbp^zOY)zxz5T@Afg)gmmA;x`o z(N;ctI1t@f_-*$S>h6=?>usAT@nXVH1+RIKe00vBjJ+;1^$baz*n5}p`MJw z3RazN-UtC=2O}akLXsGCP?}W>fW!6c;nM5njqTdK$K36Ct~zj6pzC*rB+!#+q_ar- zg)05Zsn$R>&Xg0aEGBOzuud_A%(v~vm>^40T@{O)DJgeK3E>3ZBqrFr(?o%kA@~p1 zE~)ha6JjoGdbU&U^K0mJ=MFki`fU&C$ zK9&SVnGppx_;$oaUydqxxIr>-yOv&9@>m`x^vgZC$r_U1v#eM?T;dzXJ0z6cZP`S;GrLSc0M~g; zXv36^V@aEdTGx7+sfqKv@_~PpK)81UYQY}ztMR&mK4FceVp&uu^$fF_W4F08H-au$?NYk^EN!L?~jQ@0#jyXdc?*l5_vKBD6OwR(Jdb{)s6o=m8x(TD&PW zx9yG;Tly2~Kr6vmwTkm*o)Ds?paIxabx(IYh377WwgZ`Lw*T}vNYASVw7&>E{g^}; zx_bWAL9<|?Ozv1?T{3CLIJ&GSV38AC2>sPkr$D$Z=R}G}3l$4-OX(2~{RE$QNfdM)hYn9qJAf-#^5tvj7f%!zLR?eOPM@H8Y077&uHVbvuApL;S=Am*Ku zRS!2Mk8^Mn8^Epp#~yts(!TM73$mt93L8i4#WB3|@j zxgy9+qy^!pU1J9=(%LBTx19on9@s~N_Y0S*v!h+ZdZlE`=>uDUurD2?!YGSwJR~>S z$e)LMz4^w_w@@++YI8S#K$Ve1Kj#Dxd zRi`tnB2A*7m@xM_@Eflb9a~TcP$Vh>du){6-DL@ zl61d9aE3S?;6l2G-sN0gGxIo_U$K; zdTV3k1Lm%3NL;+#?9yymZDPiQ4Z6T4b@5kps>FFDJuJMtLR%c~>;Nsv3L5I+_@Ot- ziO3M5C=WzmcLzX;-Bl`3cucoGBN*x@-g6SwlVDFoZo(L_aySV}|6aHe*E2uXTKwM> zGaNX7ZyTyS{-==T!+wyP9Xh#7);Ql(2}iz~nQ+CK4Nu%024)wvOTBbixno*Q<87p| z5k$aoy_vvIsRcop6v8u4JTK&PHUmLWZsfL>>0w&Fe~iND0PVZ@sy$mv^-(`}{uC!h zIi466(sfh6s}t~}>1gvfyrLJ2db3}VVXodqmKCA&`O15~?+hXgdJDCM1vCs3nkYHp zIPI@t`Z?|8R$rId-aG(f7Z^X!HX7CMi5cm{C7Ei0zJo*6wcLwOppo}ybcV~BXS|Q> zAvxb%OvTtt^f|q$RX_qA+B9%jcS|Oe5FkgopZ;yhjG3D`#DN|> zQiV9t*zB2aT~N#ohaeJ9hWb<&Png#Dc~68|E39~TdMW*2j;hNF9@0|9luyYP5eGx#rYmg|C=-NVO~K~!;b{PVTC;x1HWmK?kqmu zFm}9Yz{suB9FI3SM?0Gtd#9lbsCg{Zbkq(*QTVJsFC*&Son;{dpI!G~JOSz*H=4!A zil_W#kJRU7dA(s*{_W21s3Si%@faVC0}iw|Z5OMvWnVqEQbU=u!|-s5A2%_+azE6&U0&)VkW`=c|5Qar=W z-eIf+`_+O2M2qI@1pMY78@nZul?Ak9Nw!(L_eO^sJi@bjV*xHpj0^HRQl_O{RJi3x z_W+B293H;6J^rlWC8E->30)N*lmu+GRU3b+c``R+ex-Q1t+eH33kSDJyqeBLAQnw` zZ!1V;JW~m|U|NbqG`u9mwp&~b(in@H@3 z8kCqlD>>xqz)aH6fWYee`den6`q)-(PO9oTKJZYuM8{H-VR)UcD2T~4eR1>M>Q1r& zo|`+Zz!xy}Iub-fQK3|2HDSjObpk_9MC{|mZxlfQP9 z1D&%MePQcv;x6 zGHBFYsz(uw#vk6C`b}?j8M7}t4J)x_?(0T$E_=R zAI?zcf^p|jS;{gu9><8#Yh2JKSD>G^9!`7*90of@eEzDwpDu0e%grwTMy)<5P8qH@ zZcOS1u4FlUCl|uIfbI$4x+ndp5NpKS9Y&$^wmIO*E5!2WM??xcDND~BON|fzuY2|% zL6eV`MI^nET>{_gAD?{)ySsT~Iu>5vD0xrDDyNR*0YslPfylX3`Y%l5cC5hw8#Bym z84k{Frd`N#S(By3l&0gVO3Te=Nd}d}s1fH-B=w*9u1#H#7AS7wof+bdw?F)%6!?uO zk;{PMz2@1BI)dvf^?a(m{9(ic5b7;L_=OM;t|;+QQPpcc)oGNj^91f)nTw^q`=1yK zt#-2KE@R7X;Q@m2J&VMTWbE%Ui3b}#a{9@N5PywBA`}}RC znA|~RWdM=K{-jDJZO@Ixmsbv{v7^qWCKf_FATV&VxDn>iPAM9BfTX|T1pDc;p+!Em ztRykxaTxV$L=~ciJLgP{hxhHUU#()05u#{Z2iEt=%V&S-{MXLi&dJHa$3ULjUF}F8 zqF2e>`booXCp6(bei0Mj&C&F&{rW};!srX*bQDuaLbR*ktjCH?fM8Ep?`3n*{Dip+ z28L>8vSs66_LNv>2CziJbgmRC7A}RmIRqIn%%xwA=Zq!8ru|hBj2186?k(a3CRqx$ z0$5QQL}UNzo$wb!YuH&+tCGgPXkVyENqXA@WBTM@Ffu+rTYw^46m=~6B| zM#`U>bx4|fU_83d_rC}vO#Q;XX&v{Oz18JxN64%sGknH4)<=?9l$5UDDMqEDZW$GO=wFR>PoviA8>dDxc?HGIpp65?S+)?d<@i z3;%MsHj}q+YR5@(EsOLS+|xd&sivL=yLn{Zw}ms3^`!5eSsQ|| z8u3Jy9IOxg6Nl<@emg8L-qWgSAK+_(khfc)Gx_bYGEZOvY|zfkClfP4$$Tvh$Sv*( z5#1m!EGJQX2kZirf4_Bg;@$l4&|qcbVIjI#<$1A+#-7oUItV&`pE3pKagfNDBxyxf z<1OK0og8yW0!>dUH({`BLYrC;E_QGWv^9fC{}=|xmqWQ+=C7`7b>0zS52Ng%t?Dm{ zBj%n-O@O^)^hU%h~@)nrsTq8jd!tqk-Zk9nP zaopi4uN*upEEb(;Xv-G<{HfW)HtG>Kgu+6i5*mp?c4nR!chYxxj!tOF#H8fXQ7A+u z*mz`*sRXdmAELz5ZdgX!W?1q?Se|8OWiuLv#AOY5cn&GbE(+Op{V+;ds;HMT1u&}l z38))1Ho=;hz?Pdapr)yd=ehi-5ndxdHQ4$eupDisJ#|-U$HRKmdR>0Kv6DNSzro~0 z)X#6WT6R5Vps%WG!v!w7x;psI^+FzNhcNEsXg_JnXMBg$wtLlklGOj|@=s>X7*6$eqc3Wv!_$km2&GlbF)H>Z2 z#U%^LS_s=bo#Y*yx?$l-KgY*@+W7&%nzM2GQdhRGrAvw>i|j9L%gVUe9u(i#eomvv zD-ulMBdc=@zIxDeBK+XIid}{hu5XE1Hrke;X#=DV&ExyEzKYcN6F{JXE!_JzQ_-$qvH?WV?uHvNPJ5tAS@QNq)nqT z71$_dX_mk#^6P_tv$tmhpuWZKLY}a$o2_>lb+?Il$vOh)T`KrduK4lp-OEJwY4$&_ zW3-&`M0K@qG0+0I6!kX59s#}LYtk61ePo-DsVfZwFZ&rT)~w2whCA#=afxdeeZ>uG zi|ZcNmED;xtT6rNoJjJ)K7gWbAW|&f0;5x~8i#~bA>aFgPAoWV|7)-SJIJ%s2W!wr zDbiphB){>MEyI$qTf`U^6r~)iAA`0$58K6yZ#9AiUQ)op z^!x@7LK9eBVEvb`iFz=wf@yISWtINjZ?%#_zqsIqxe(xiA`7a}vTXj`l#E4NfQ}mcry916!O_Tmg_1DuK ze+DnfY7y4p$mx16SD8)Z=`N#;(b{@^q`|;*=$1n*mriXBiN=$k)oU?mkqBW+XO>ya z8{fCQa-8tUPT0=<{f58DPVrs^~n27p!XP{HE#eLeo*8?P$x* zyqxFF^6WfE)=T|Ng)j8;>sFw=J6<$kaHzda_USfY7&T5m9B@ZR0!7MJq~D&yXiHLVslUI5xDU6PYNK(w@Z%jdKY z^HOl&m4kXMYx2yBMOcH>tNtZG%HUClw_IimnTCInT!twd9Hh*2#Gu~}>zNNT36<`_ z7i$)l)c%38o6E`zon`|UxTEb~f1ai6 zG2-gs;^1+!o9Bn?90a^Q z9BRItwX^wx0&v+Cy}lPZBSxCowI&O!=5)kt2lrHa?_i4~=u`fXX2u8Iz8$8sX|deo zyq4sxWLot^-BmUrq8xmS3LPb#1WzQ!hrbi;487__9DC)GuHbwFs%Ai+T^(YeI3{4X zmau(MQ>i8&svc2nc~>|({B3kL=dZm3jnVAlLOQJ(MmEl-3vIj6X|eC70a z`S41BhNaOP42o;4^~JaffeI5)*R1_hTczdvZ2hV1%T*FFz@MBB`%koBhp#+8rDW@r z8UlF(3W1U0GJ@z?B`O{5^%8x3)+LEg*%9Le_`L>}S!xBCbwoyLLR@X?#%1$-CmrhG zh_Y)UuIoB0xfh z_hXdGx8c7ag=i~&uA&!=Y%33}IOM?U6C}up$UbdYG{d8hSyw zZ}@zJIU1};Wz4*;Z_!&maASwSPpPD`e#i^W-@38a&9m*=t{)zL|6>Ni>@qIS%iHa0 zF8)!&ygf6>X1W9xU@+KSinujeTy6*5-g&jdCXuT^)x)GdG8S>D>%@S0M&gM%qat<@ zQjk4|Qq@ZbA6*j!$XHyH za(8k~KfMNzR?1dX9u_v{w@I#pJgBtA1}ZPtwTy}Ib^EUnca@~?dd`x}4V18-*ezTAHgGtTeOxz6}A#JmOpWr(KCkSf>Nq)b$ z`o{M&y(x}aX0*7-qu!38^>l$a@7Z7Lo^LlS>l>Rme{W|VBOq)#!Y4j|lzxB2eM5bF zb;pG8e`+n=g(JKcQVMip5YO4dbZsH)&gR~u(mJowamU==t16?NZoEgQK{;xW2YG0F zYtVyk45J?~sB#4c<$LTA$QP}$pa8kK|J_PV0qFv>3V6Wc8S%&&7{HFT6wfDfU>_|s zdX4y4I>tEO%6huI1hCL2_+WK^7(Il+zotU=J4J8nttsp`! zv6^A0=#s`w$1Q1MOrY7NF?+2apiPq;@UxJdFASMdiLus4D9B`U(dlhNBQ1> zCo_Y9^T{O`v85xNrGVi%Wbf?O{%3yvI3?V^q`Oj^^ofPlLQU^8M z0v)|sw-_8Q4kuUs8r;;+n9m$j--NSM!!Mm7fzO=%QHu@nV8L|s=i(lw*uea`Typk3 zu=cU)B<9Fi6la7V0uHKOSzprB!UO6C8Iz@?+r#79X8!x9+oq^Bth|H8db5~IqOJR+ zoHg`Qdl5>q=?Fs6xeRpF4@XlL$xj04qH>F7B8#uDB~q;|+4?9ly=31ZAp+~=B8v&q zL_X(_P-{i3=Zs*E&j9wq=I*&R*T<6#*l%2@rdK8<6h|VrI1cMY)HEv+ql^`7@<)0P zW-XY+i*LE98V-%jPT-5tw#{#0r@+!ys#3}pI7X4ncN^o}5S8p&zwh;o zpX-2-kP|n05NzgtTL(6F^S{Htcg7~}x~j*i${M(}FHEahS17V}+ahj=;}By;jmpOX zAnD|uaH)qc3H&Y?U%$=m&berLbn99h=M5hH>LxnA$>`*Mh8>Gq^V7VPiZz`l5fm(f z_tJ3mx4HF;$8de~py~914m;~tS*r0{!`<29v~2n}$KU^?b_i@e0svR#fYl0Z6=#Hj zdjs8Qh08VIbElNpRVTnDXkfSgv>q>q*S?J|Cf`|W)ezB)OHJ^_7d_!vq1K6*x6R6X z1^e50)7b|{<5MVhwre%-UhC?wdY=P?CWfkDrz{GVR!a6Bb@F@@P;OguvI}VhFpI`M ziVur$3+;w9IFE}p`DUX*eQyhJU{8z^Bw0eI2Ba0q(RIhK2OV);H#xW(a^ZEFi`08; za`$ofQuttdA-r~JeHLCgnpVnsPcv~p5&)`c{uBn_7Rgv`Tl}7N9~fBB>yuBiAqs5u z{7aT0EN9-bdHRIe)i>%B|6fxcQkUE}ToTEvD5MNc#Q1@s#%HSuz;(OfzRTvq8?pX@ zaj*^9$*I5IW;?2El52?ect~HN$PHj$hVQiE?kbG^ks?1}D!2?$SehWyS(K*+4v!wS z)S<@nn)1q3T~Z2JAnU&r3MIXGEPk&nAVx;|V2NBhOJ)BPFS|_#-Bs48yYHwo0YJCd z0jKuiAPL;ddkHL4YJtc{+eeAMdO2)RR5}NU6PeTOR1A=nJ)`6}cxvPd30QDOYOFt5 z0kyCpX8^=oZ!Mg@)use~j-ROgb-Z%A2GN9kWUbLapwxUNF+d#34Oy71NIBqsRLRy$ zDf2y8xeG!ow|{F}d3}@^I-bwKedYS&$}BQ!@Sdv&HFw%@zZS-~H3jF(^gpLp8eM#6;UJC;D+At>Yr`NNK#(wM#iOkNW!?Z8eM( zPHx^f^;BSA-tl`feAYS)Q3?fto^W3K@SPI);(GVAy|ue}*t=gm7R;Y|Fy-$fIz_xW zHnz478EK~(vQ0)kFu1n?Dw~VvECR#%gx+o&n*;@g_Tj+CAe2dc3YxYJHpWG*F6Xt; z?UwfE<>qwvHP&L?R~e^nvOyIK_4}p+Hu7cw$3$1~xao;P$v{{|j0jK6QZr5WI@e;f za6&Im9ue(`vP)(Cb48n5sXAkMH+Wqq0`01jm3O}Qi;6vNxvG7=As26z6Y8s}Q!RFU zq6)wTeAfDV=3>fc_JRMpfDjY)ZmV(c21j)@$=EJkPe&U)Lwh%0rfhSV8J|U2CsmqF zZScN4-8}&>-j2S`x9u3(>W^3Am0G&OfZbY7lU6R&Lh!X`69^;T8y2J;T_g$b zn1iJigJnJnD+v{hGdTvlJ*{Fzn7uk~Hj~SkhLRAo7XpMSeq03KcFs>{*A3#=p+ikg zcoEeB!gL0+nadS8+Tq;Jw!T)0O5E^!X+Eu~#1m4SAf0GcEWwkzE+Ilet*(T%yk!R+{J&}t?>O7*X25Pq|mwvJ?h7U3s$T>xY{AI zkhr%5*bO_}2jK3G3eEH^4h3)q-3;QH|M}ZK>f3!3hlhu7=;XA5Bnud*04#xQ3oCiAf`KYbc`PMRGwu2A6m;`Amtgh=yVO*-|!VDe;fKX+jg z!qPscv<2j-;_jV(;tbUn3-$S`@gU6}eGA_^F2v3zeK-LF#+Q>e44G>>tkNMd3b!3a zSOkS|j+6c+F+eH^o1*pP*U&%;J4GKC)El~3=d)AA2HSe%fT?#gJxXBTJndp&dup6c5^9 zRAMK<4T1O`j6x^)Nb1rsXGd~YtL4}lZ2c>yd6;hBxyLTb6v&l|SF+4UW!Cu%RfdR- zeTlc(VS&MIi=|2h{7gW+9T>9&Q{r~r89Cta{vP;@dPJ=|G0F*btvYpf%g-f=z5Y}- zmGCLbfUh!;(%j|4{l#4*Q^rKCV%TK;l=p_)b>N@wexL3a6(ggqL-Zaqpr&KY4PO;* z1$PnU=n^4d*W{mO>E0~)_stpgwud|0&ST=!?M~``|EmK*^<86-6Xq`3)r%aivtqsr z3O*A<+|+d6R$6*o1D{V5?n$VykK5a6o1eq%_X$D2eTz&5pfrpfL`Zn)Wh${`2ORv4 zG*4T`mW%l^USC4f4(w^<7SqjT;+2KFc+Ouv_1lpK3^w(4s6o@c<*)u{;zUIcl4(ZY zv%zsw0k7897viiPFBW7CH5Ug+n)RtsBao+~hkDySZGf#0G=>hHLGSvuN*gV&hGHYj|$6ha{3?Rq>9yk@Lo~!U~6fd%>I&n(+39h-qF$+Ym&z-61>%=k|Qg ze42fHn9_uH?G#7oGLo*>f3AL^J|mR$r`!+}$OxQa^Kg)fC6SO0bEZlOlIA%QS1acd z+Ov3P2AicW6Gb!F?yS3W7DfCu>}O1e7$GW$mlQHSl>azYaa&hKwgYidf>QXBVy^vT0h2>s0zvzAJOEo6d^ z72D}=Z~*FI7s|i5dQsf_>i@X?ixIXS8yXK2C)CEuUNqP{3KJo2mxNw>;o~HIHM{cR z!iGJ%_xN*4&B%^Z20jSa(-aJO^`~N@b2f1EBsqw~-gs|4nK%wz z{vRiXlrfuRHlP8fy)&jwhvRi!9dI*_l|E4>Y?;ZGLa8{pG(k?eb5aWc27?;4T9qW|gz18M4oVSAXQJ+QSN^us<1N z>E~5EutT`Jcc#W!4-$R}x&#?Bx|jFsF?z~(P|+UJoM34XFD3PH{tn+1QC9Hr$aZPs zeB)1~=gWz?ql1)9Ld`s%bkxzo17iON7F2(wqY;iur}XMcZ^?W`^v( zT0{$36g@uWg>yr77M(cY<>Y?hR*k`J-xv3pu%}xug3$hVx7y#28MXda5n*)ZAfgi) zvg-|Pi3Ipw3k`ZuXZp`&gc7fKkr431m-z6ZKJLA7aR~442RrjuFB7VoN)8mJqS)%j zT^vItu3BT!TEq=W6e0*WMj=FzF2o^EGV-xj1rqh2p3g;=X1@~C?K@wnofqZX&79I- zyg_qA2U%=cw6&-8;=An#wv`#(8YN-at<2O@uMSa97$G612t}6kUzA~K%1GFpXL6zK~Pnf z;S_+~&(YNX8kwLDjwE__Lm13K1rLF`cC>_umF&G$ zCO$3MJbWiqfJ(`>^%M;M{%Cgd*Sz1VQKr84lmKH1>`tPUAgme1-iHfgiYWsQj#Re= z{ut#^=Q+#DAFI40k$w@*n2+KWp@VU%i(&|M#o6g{`xRwY7!0h4KH7oS_=W%88ic zN4FXBVG;leelh9Of7?-)+FYJC($6`XGAQaqq=Qxc`D4kvs&F^iO$ohzHiinh(Y+^A1zRA?n<_uo1e2{fax3&PIN6qW2LI z3hwp8nKz{X#Q0Wtyah*~y@2H{?&mzbKh^i?3*2WdX@K6V z9}!u#1PnaUr*;rx4RPQE`+4QdvTMuhFt*T)AVG(Ln%qyM8DmgT zFyM2_9Pn=M>Q`U(5KR%|^!_{9cJQ&155OFkc<8HWdPR#aY80-U!U$~TU^Pa9GsH{4 zZal3(A|sO6MTnbBA&;@Lx!NO5O#0PAd^<5}I0&+@+R%4liXzHsyy;w^InIu%aEM&T zNfpcXqt_;RlTrn}&ohHu;z7BFob{Ri!20R5)dMfe+Tx5n#!-I?_QZsW>* zEw}IOUiDlkvm4K?=5T@G6}2sf=MvWQGj=^W@!L`-Pnod0|H0saEt5NpD>-sTYd7iF zGb|7_;q)qkEp`oPdC_~@u{ZZl7GD*S{qCA^*aUBTHqy0@U&33PU|Cf$OVS#xj+4|M(k z@~2DS4htrHhs{Do6oG9kKXxq7{xuMtxY(vcFUtx14;aPoA&vMTFe@mKGI%^pH90fl zguIv87qxF0h=n>UhL*FVO$|G%fUbH*@yk+5=A-@zw-CFU^9%; zTwY){TnSekxkxGa5Ma#%pDUn5XX9|M#9(y@|@YzF>!vm7{$^KM@LL z3k3;={Vmc6G2sO|3danra5x`9C<&=9x}QwWVuc_w%OYeYVWw0IKlhiN4)|bRS|o@d zOc6f3szPW9+5<}k_C>_WX6AP+iI}M_kYT4#@-j4N(^!on>+-@T9vXw3U3G(gzF?1( z#5@?26N%lEu)Ol&8kPD5OI>b~UIf2okH}G31vahm+P`@kz^aRg8pi#nf%{O(D2tkSXnBpE{ijL<{292nkpS%z zSYD$tO{k=oKZDJ4&%+C9J24#9k`TX`US26CIiV?;~MvQ zF;st!sF3L0n;kHp2_xVLwINP#^J7-UzR_VwG$ink3M_l4hRl9oBS{JnQ69T~BDB;YHt}TSsPllSB3k~n1C0=oI+QB9nyfBjFSCeBNJ$yCSbpR+ zu!1F<$%cd*Ew3f!#$-+qBga;`{!v#|nXevWDvTQ1B7Ib+G~gRWCZ|F5aF1mKZNZEp zq)VQK@_|?Ns5qMmJ+6#K%EpZdAXKO`eq)*@FpPb z@^8%F|DfOmkWY1EEd8YZ0wue=ANh5Jc zd(01DMnIzW&_*&X7ur(*6~(ZIZNw%srOG>fc(_Bpyj>eXg~yflMe|Mmd7mqk^HU0p zb3G@+FJF6f82~BD2c6Km|F7K4-GUu!neRqgw1&D}@x6G&f~6lH`%3js%)DSYa+ApmIcQZZOT zI1c0p{JeSqdGCB5FS4oZ@LmcTIy^b>a2q8HG~+M6_uoSVlS)tHGDsbJPvDf7sGgRC zFifwr8Cnb$XvD^YY$#~^dGe7Vd`A>w`3S3gzhN#;aX)%kf`U9$O6UL4<3qfjMYy)X z$u=bRfi9*tTqlxmUxcvj=D$w?-a85hCG-B^RLEU&qa|g zHL&hh(FZ!Im8d>d9Da4#c~_+Kvw-2~0)8?TM3e~qW;VPJn;;hS8;B4^jm zE!hQxO*6c%x%jG4oT#6|G16+XoYy#+szn`NV94UDVjlj5 zZdse9@_uS40lY!X+)|K|A1bpqL%=S&AVYoG#ZuB}QzjbTlI@6l(Qdo&?Q3v_PdjiY z0(%6GQeLbr_L&OjhHc8Jj>fu0P>y5>HMy_sjgwpCh-qa+wpN7#<)V+RxObyN6LZ$z zyLmo!|46UeE(#NURENbRNwM4jjjzagy<+8RbkHh8^uH@_4 z80=MretoT%VLquh3_cvL_y=J-29ex24eYPzMLGABIO7MHZgh4_-=LP!MsNiF(^N=P zg-!Uoj~GR~l($L^D9<4=(WIere8!L}j%ct>H{9u>Fj6Kk9d)n_*tK4*rODemc~yDt zQng(tkDELqht1RcBUit}k5JvlGls#MLzu)*H}FBRFeb}M)z#O#m#yY{A-=a8i3!6| zX@-mCHN&+AsW9krdk1GpIMI(-I0|}){t-X#nhx-kMl6~3FdU4tk-k{3z}ufw@2ywe zyNlmED~e1Dce7o7aiikwY^ky4{kU-d7l#zmQv3W$l3$@) zc8*>agkNK&!j!U*{9bz;cazQ=Qmk@zeUDx_)Ts;V+yA2m8_pP5H(y~0wjG~zo`ajZ zC5OEk(HZ*7G8z$Tai(zw6!bBmlxII}h5lsdpp4!MESXMgJCWEZcX|5(7zyBq_hob18|6TPxrX`BQ^i;fJ= zKCbcjS~1(=3mt85_aY2s9<7Ex1+Ye&GL>X2yp>Irq#0-_?tB4#0hJlSm@(>>*Z=zn zwFf0oW-os=0o3 z)Q(#4Z&jKL6q49A>e+-U?X~a)i%~%sL7Ooj;)?(XWClprA$=Wp2_gauveya~aV~_= zY!i)3!~udUkimmqb-!sy#UIwhmIyR8wMwmwI8w|(fr_SkY#waxDN_NEn}`J*6k;0HamsB@rmq3TwBG4hz%i;JhvHb!#WbBFJL~DGZ!dD#(FOgNIWGipke+% zNI2S^9-V(~!)7zN)|SMJVQ1{?NY3}E$KCE)!~N!t$cV1p$G>jYQL~!mJ%lQ&P6+aj z??_hBU@6@=7;xxgnd2DGVK%C#6LCl1J|Xf)ruqeJujQz?G_@=_S0s6TrgC5+Vgv&& zfb|%**`}5u#ItRcJnR^n0Zc#B&#tS10*tjQzmjbQ=S11mx3d~*;kwmcHs-oxgNC9{ z_n&u7rl0R!j^c33x|YGiBqVKM$$~6DCcCk`%$*w3YS9Wz0MoZA>1+eW_8*#UON{UT ztFaQu&AR0IX=ne_xc>K+)`AoWNc4ZHu~HNj6poqV1bC-<{UmkiK;Mz@|9n zHPsXzNKyxLNXfgT$cSK8Z6nV|^!4C_}u zpVo_Y7our2PEv8CU_XZ|;f)xKRT#}0Q*kWF97pH1Iin>u+a$Ixvc5`W4BpyS^-g!sgZAyvMmc0=9Q@ueYB_4V)EAUqBRd>&K5yF*7)xn02}u zkk(z6GR;!fkL2K{2`MgiIx3lpiu4#Sjn?XCR)Q-+_duOUPwbEqpf$FAxL`?HXoH~v0uPQ!*JH1WKsaLBn0umGSK84yh_65mh21|glL zkA}r4Dy0}Sl^?(nP|liNSCy;VWRcD`y6AxGjksh{C6xs~(X1Kd7RA=@S}amBBtrkX z2|k=#jFj_wFhz#_Ye_S#C{u8nUr5ffpJYPiG;35jrQnG1yeq9~X_=v4Q-??Z<*C0q zxDsFKLB1ldADiH=plB>|>_yRLS7o0)bvZldI~x1TtboN~y?s;eWSXz0r_(+i?WSq& zg$G{upFxKqGvLH<48nZsYmm{%art+DFtK}HlhZ!8V202QrixL;}R$%Ci^^;aYGTy5bi82&d;g}5-T+|p%v!C34#dO(;DPt+1g6?v16O+tO_zC ze{;!`!G3GcS7a$VEijO`XRj~#*C(H)fBOF zt6pf>H;WJpC`C_>%IO#7ksorcm{L{=DB3u!T^i(!xBWcv9vg-g2bB>Ks=M|A={G~_ zbq1;Q=dpKPmpD1A*wm1TR z^adsm7g9$A?V=(gg#ro1&KwuSYmh}|*kNv!Jp1xObN$z@gu6Yh0tdm=A+zsp-M;N zaCiro)IzC~rWAXeB`Wyi?o{p+xR8nc%0o{$9F*;Am~KW(*Eb};1sYjUeoF)*4`irX zd9S84IexD_39|=vcXm~}_?GUR5TKW{s?^4SN0eN3p}a9Z&&)1Wn~$(RFC_|bOsJzj zElQx=&(6v%8*wtX^5lN3qp7PW2dIpqti5=2iB4ET*XF0@&k3OCjq;rMnsIds-pcbm z4QhQ8hFhH8#raDdrIAIhbRwHwn(SaeUUn;sxB(7DV5k9L7Ed!KF^K0=W|zEsZrPR@ z3%{-&gsEOR_ju*_Xg-n}bQCEcCYW+)(VPFN`2IV)$k?L_Hiu|@ynquDDSe&nU;p~M z2TkzN0|LiD6!@=aQ;AQBdln=h%_9*7MzH(SCiXbB%k`BV#<3iV9vz{ON2H7`S6^CF zhv1Y@S&3GIO#dcG0)j#t+lx>vO6eTD1q>lC!N&r{Ng1F42zg<9v*N!bHlUJeY~raw zo~1{Z5dR?H5;i*fFVtAqZ%M8SYkJo@>h&I4&Rm9|hZE<#e=UEw>i~Vy<3WmCG&|#6 z$Qr>gU$I3xIEqq4wQ{Ix|7t--a+8aRp`X0lX)V^1Xn@qRxBVnkSb59=9DJj^8!!JX ziDCLvG1KF;#19gRbltwR<^3!1vlkm_DL%ZnEuw|vD_GgEyb8KUEL$_H>$q-WUW^LE zBDURUuu+myAVSC&FqkF+m?#k3#!eAtz32e_R=wH?=KUTj2NRUC?OY@Nyvfa6xACM59>me_rnrz`fTfygR2&yi1thkqYMZyt|bjoH9yHx=R3EzrV>9 zEzY_RX~ipYD?csBgWUMz$e?{ymFY6H6cto`gqEOkRfFH_AzPUf;06k^g0jVSz;H1! zeMFS$i;4n~(SV0xi}yY~60On0xNgxvAVDT4hVt!ZYIzb`Xh*fIe9)=?A(en8{VaxN z+w9loS6yBbJ``RnyN3ezbf90}_;kwbhW9yV-L@4gX@B;w_*%n#-K^ZBVIm`bvl&A!K=kfOpA}-3gI4M09X49Dl)2w)5 zNe=ocf&JH5IuTJIsq-OOf-h)wCKDDMSu`xd z{bU?ej0WLC1dS#a;WY+z3JxEJRV%dKaFM$?s2{*s$DkYs*H9sp2ecO~34RNIIlgio z$H8CA*HP8bN)ZA^a7xJ3qdie(&WNbM#Fmv1(M_uGM%Gp0F)gxgiIx_EMpT-3T3`%T z?0EQcw2uXXi1u%|#FYVr7X5;DmrZW|P{{@mJ-TMsv&j0tl31Dad*a)8YYKomJ*6u6 zksSczv_YgD_$9r*^p)G&cOU(Pqcr_K?&jpJR@G(Y*Nh(;qJN(}i79dwXaF-X;Iuv8 zV{lkEySiovpR~deai|IxayW|TS77ect-f+JjVPji|93;FvU?E78KFrJ&{|$Vsw90p z86V-5QVfnIX#$VY%4W%T2w`RB+tGV2Gofk7I9F(pKI*hwr_B{dJ@dlv&Iguy_lp;W z>m|&!x>){D(y9_Y4)BNlS6p7Y_~CBz~0a&%pSgK#NmKQ2Bd9#HBw&J8lju z`L-;M@iZ*wZ>2PFt~wC<+r}>kdl04kMAL*2$thQc`-lf`_w*Wjix%<>y8r%esUakd zjS5>N!D4}!hbsjJUuta96xP>VFzG!C#F#9>Kms@>*5KGt7?{;$uxdwk45$s5t&FuZBO4lm^H;B0&$u+BA{yf zzIEpU(I`Lx>(Eg%gMQ7_ek7g6JlXb|*G~+nLqrH@8YkLNzvK-SMqHI7_scrj+z^n_ zACr3b>4Yz!3c29unXST^LVT+$-|2TV;cVZ+itwgXcg|v8D)&(^PDLz+hYatJNwURt z(DbgtE4kO9qpCKD^;==%E~kgBuUqj1Y`lL`ZFq+_Pmt%u-w`-DhMPGnWfmbK0_7_y zC8ew-2y}a#&FXLaI=}Nont%%Y=%|{9&AQ$G`h%^11QtTJzec;6{PeSow|e*s2c)$q`7yh&n2V)+n=$gAbx@^&GJb zlkHW6>t;YFSCCCmMBO>jwW26Dp9avzZ9Sc3>BY zLv$~Dw#hfS=M7H#LP6_THeC+aBaV^81;CZdkEQO5L_oMNaPogdWt&?aGc&xfyy!ON zH}f2~{>_hKP*NFSK&`(NMZzO(?qYTGf2T*gYY>2{q*k~YTEXh+;Q8=@1EOJzVNtIoTZpisGs#2KCn731$u!nXT8sN3w(05d;L zs33e7;P<$!4*^+VXGmE5nUM3N#w-^L?#THE^q*!iX;oO+*srqwkAD82%336kT=~D- z2*m%klBNHT%G%k}*~QeB*4Ez6(#76Mz`@YT(8S)u!-LMt)XARC+}6<2=67w|mj3ta zVCeGS??lIcu^Srx+6nyU`M+2SxT?t7A21;FoT^VdNdgU!oSUlV*DNhcb@5);R8}H{ z8ras;ZUU;J{_`Q%ANF=6#Oq_XKk>ZMfim7#jfAB)fb=daZVkO|pU~V9In~=Snw->H zf-B#vhMwWIXTwv@%$Z~fG3aNH{_=CEuy$e_4i}yA{`T%ldNxCkND8p_9A$M zKv^zZ@I=o13wBDSN>mbx3pL zTslz$b>3bq5D(=_w$cx)(6$4bB1HSTHaoRTD?};k(|kRSz(@_ho>sBRe6Q=#l#hS#;Bd&M+=K=qfI6(+7lS=_$8q=Tm9XUn4F(?&lyKcfAW z#Xc{2l?yK+w_vP<{-5~kPQ6(gr{`AZHVg|95WK@EbT*`G!&PT(?ej}Cc!)a{HP@kU z{M`1zOp<49f?e!J<-h+_Gg@46Dk~5Gz<+A?e_zdBivNG35C6B-?BHZ-_CK6P{}08y z%x&$y$=100NImD1oJ_5ly67Fj-j&4>dugj@&3)am>gq~?l&GLgl2&X}Rq^k01_l6W zPq>jb&#p3QjVSKzxMs&%iK|Y$MUD*i^z#AHJ~9J-o= z{YWtzg#6Q4mFj@LSwRw4nUUGFMmWzMkXPqFk-DL%z+IFRrH2S~GHCtb z+N8RNKzgt!5;W07PF{c*j{yUy--(&wXVA$2`H*mk?E$7K4;`EfKy(KJsQkUivA{7v za1zq&vU$uy(jMdV3X7FwE8pG2H5W{9P^IGsyw9)T0rJBUrYOw4cGc!QFz4Po>FoDx z@p+nWBfR|*?4{)x5t(wP^C~L^~(I?w{o=#dOcWG&6k_jkP$$tX! zA_wD!>$VQMM%@_EJJRl19)NG)w)6ZxDQ`PYfA&_Rb{tmN_t1P&WB2~$iWv|{ieF)4 z+(#ZMXFgo@&vumlw2~id5kVzVOpJ;$p+}ozhC^Wj zD>XM8T!tH-_;VA^IO;PJneRWIHuUX%U&uFel*ykwfNA`& zTb()b$nJ>z(7f*WdHAiFx6qQu86_y8e{mI9D=FTQQcom%5CW#js4mn+=tQ_*h;#0; z59=qTh7V}R3YPVsF!3F-6ENO^T?Nm=*(+hj4-ZA^?>dSV>|UJMG~6A|3Y)4@alqkdhCL^ZU=ul4dlYK*+DN4+W zv!WYJ+d-gDl<`Xh_s9uY8UpA!Z>K&;inNBVi3E;HSd^6kNB*P}j!36Sc$u{YvU@F4KDTl7L(4Ee2!BVEl23Hun zKQjjxJh7E(Qvb}((tjYV($gTWk?A*CW|g;y`M3x9`gl8eIK1p1{d3UovuYdLpKWGo zujqrp?k%#kX=5#uuxl0cEnCNMG>;jRu6QYJ_HIXn^ zU}1P;KgBc`9n3##M{A2`<5b+${8KfJxjL76icWdo&!Y0W1{BU zU1=;1X^<%I=mo^t);OIl%R!|KCk4hvDp9at2mvh+0zozajG^gy)gQOc%Cny@kR5S= zPb(+!feHB$xNJ%Ro{c7N-M>wkH7qY)DM&#hSSN2?9sRTAV&}8ztgGO|w6*RDR5Hy^ zIQ590UU0IrHLD+xc7XZmI0L=LP4SbzBw>dU&4AxKpC46QIo2O|SZuK;!E{f3#?ijR zg|rlArD7!L@Bz?Dor_A;PYAWr!*$`EOH*`Lgs;=MT5rEDG>m{+w@lR=fs>ZB81O`` zSKAm3S_wC$%r782;G!b{r=N-Wi6BmWQWn1pWH+aSO-XjiT8L80Y_OnDGS%L%GBJGH zl+k|y&=09`gD{D#oTDy4xh_~+>FR$RkPfA=Hxao4P;RK20*Hm47pUah+d|zyQql_$ zTd!?8R-Sk^?N1S<_hd7}1jmVi36HBxkDBRp0S&$2)UTq<(uwb9ynC~%+nM^AG-ZR<9Ry zU@g(dQ4G#hEGP^o8YURR;o}5e%MU^M$f~lx|X1xEK7hCBcm#2?EAp91Pu5LBam)kZ&OHib?PkhQ^R$qT$UA!*MSG#qa990O#UjK`H~lCBFwdb7^*#|pl|BnTYw%4riYc-9q1m!PtN zTUsxSDE0^3=JN8g!pm)K3e>)hJ~3G%uf?6rL)TdCRK}NcIo53sx|TEsj(hZxc-YRl zmliHEI7<BhZpS22U|LlCD{= z9fOj{UVXDF{3ZDO5v-y&Vh`kXg!_LqWB9%N!A-+_8Qd+q$Mn8>&_J(LO`KRpAC({t zJWBLRgiJF6RSbi`y^$dBNW{XDeatQ*c-o&PE0!XRKm-Pq9G5Sz*%gw?l78%n?T#N= zUp~%>Xhm)RCpWu+@Z)KeU+FH*MD@aOSS~#!tB7WAKpIcZ`Ytbb>NbM{Vg? zrCrLU5S@RMjyUmWfxb9XklR~JDu8NtkZ--nQXY1)V#C%|x`-it=pHsY>2Zfx^|Ube zTkf}Sb6%Qp(QA9xRP%e@`4W&7@wrlCpH;=Et2J+m>5xBJP@nbGwH=M@rr2{P4SGF46pINeE#5xiQFEbC+@ z*>fDVY}B?7*_O3-uwAA$$ukw`P=zL0Eb#Y|cwS7xNEGTR{~6C0TI82$2#(AI)LR7R zR9j!SlsVyO0c-m{?J#93;nPWun9d$l z#!llB6o`fJN@;i-u9hFF&QdqRn`G0ak!x|M0D(6oU7;vKet zG%(qh!q50`McW6v+Erg$BTFrRdY)5QRmF{uN>QniiJ6oX>;#V|4KAg;&y(PV=Tr~c z72@zir*VZcnr92K*;l!-B+yVTcMhM)P z?EwZWo*e$m68u#Lts_G9?z)lYDQJFKZLH5lps(6N!c}f^6`OuB^fPO&8;OMS70f(L zTn53;BWh>*6r}l-**HEuEzpTU9D02@6-9u^2>5WE_(Wz0nH)Am76I9Az2QSm#;^}h z6DUk6^95h(Jqs6)BjiY)n6DJ&RRJ!kF=4MFlhIGVO7Ypww<=XhCt_)Zg%Shss(zt?r0*X{mmH6O5;R%G~>BiukF4I+SBnhoJMK&$-(Y+gZkrLL0c)tA_+%HOs z%^~1xmpg_&B~}78ovEKHEw*fMJcf0saIV^(0%<8Rt9V;_WuVRW1(8FvSst&QGaC;* z4_~Wmudt$?)_@8_l~h}Dx}CO8H8Y7+JwlRj0%)mbnzzR3d1A^hc9qK=`wyc^pT1eI zy!uOxv@Q_8R-bG9OSh-f1IjI0wvy-?QWJ9xVO`wo;@&D@Wwp~=Q-|BMsS6#lX=6?DVK8axcyO*=e5hZ!b~5%#GeZI4 z;K+(cniHJ(wgwzRcYJl?p)KlOD!l@DIz9EG8P3||*tK-3~ljF${Ch6m@ zyOubxqtyEc=x}SeCOu$NaygO7ep(eZG<} zKTG5Bjvz6tN8Q|Rs-#i>u+(uuZmWMkK5R@)v0S%Xh7u$%2h#+?2lY3 z-~OK4neLocJq3OYZ}5B`D=hF97uwag?7}FnYmR2y+Unpw`J*?|acUa#t6{m(-6*;? zN5FwAsMNIRSuqGiF_6Pj7I;ZFZk6bT+{6TFvT;)-8OchqR_$8pq3E>?reZGF|mrx>F3$|>T00mEOr!f9!NU}xc$ zcC__m3(WhI9fv^ZP8(~AgmZ@OcRncLxwSkjjcszA(YZ4xQGXa$S5mXfNPI~%K*!@l zY-WtUF2zne?5N~$=ad$@-=`iIE&T^xI)&Bln+dpA;INf^{(;M(k9b7Q-qmK4x`Igv zhTfRps)wwNka$_fQaFL%+O4s-O^J}*e$;9>C+109vVN0ewXJ&Eosmo$FvEAW>^+VM z#9mb`&;nrfNumMc4^Cmbq~4BqRWU{{XT7Ju1rq1OSlue*%90 z+hEmyovQi|DEp6z?Ei-P`o#0X4Kl!pxy$VXvp`TS6<{M70kOfwv#8ZuWK+q$ckose zz(}wtf4whGDZ8x^Y9EEx*P+v9l;SE4Y6$dpp>WOF><6FY9Xyw7a!2n`1QNCm*U}g7 zad@bFH_4x+z{^k$gB~GcxLHUvEzOwiu`CfA^w2Dis~^A%?Dt}-bGGUG5KH;(~XPZ<&vT8xBt0u8ZG)bk9dpu3+-QR-VT+`VT;Nj_A0KL;* z?Q{JHp!XjN>4Cg5IP#0n{}aIf8CoC!ivPjXrG6Qu{Qr~C+M2o;ni#qm{!(>&yZ;(t z5mt`>%GLk#{9n0x!j#+)1A^$Q_Xx%1aKr{wL2W#M>xeK_H2@(yCQelYt|u7_;Qj5I ztYwt{_H*}5#{C$iz(e6&VOq2*Q<%y9xBoK06fDs$_n0eG3h*UH{X%weL!A&+kDVqr zHa0zLOAL-bm=R0AV;N{siXrR@fWg#!Hvy zPrB1jO(HmCs_fPXGUG+Vc}>TMchLXjcikkSQusHw|HQ7qSq*w< ztxlxu&MHyWvjGQh^3DV~Hcd1YbW$d5V)|=7KtX$|>76x0)(r%JcRIpSyJri@9~hxj zSAAfm2o}_S26}AdfjMl-AY1C`h)py3>u?gd?@ib{lX$^JUmHkNoA|*0Gxkrg_~qf< zHbIWAD!;1@&BoTo4y>-RTjEgDA(`IHQVHZ<6=(X82=ADkot>XtRIZ1!OJ>SI?gTogchoq@EylKybaeTq>jtdtk1L^7*Cl3HoY`}ldAVxiWh;oe31N1E} z+@|N(jKk;mj0+Ue1M)l=_!{&BP=L!J6eE40ckJ^D!1g8qu+v0kLDQovzBq>v#5+@- zupb>D!P6aANCOrL1Hyzy!ZQL03f%A6jhF8%ck_Xpd-wr;_ubxYUcOI5a47XO&TiQq zau^k^9P?l2Pd(K8>Q2xj#KHNW&7RwW$(yL5)i85@0rWuiF!Qm`va*3HcKe|1J(Jh# z_5Gc$)h_#>BzJrHo$Q-1L5EBNEl3~>g1hulh;R<6N{+u$E7$l23ex?w*q~|mpCDlF z>BYBzO&l0N__X*OAV}t%cWiD*P^%^&OK@WYGGu4D@7| zzZkdHZ)|Q|7ofm^sKszie4tCx4ZATR=$}7!yzV-Lt}y?jW*JndsE!^O=M%j&c$1|c zke`85%A9DXJ?Y&A43}=IV}e zGSN()S-RYYJJcg;7tCyfT^VV7Qb-mc+`ILzsp2|B8Rz;*}V-XJ@Un2bZxgH;O88T>= zr54-}A+PE4OQUFrvXF2(zX>Uvp7wVD`PX*Vfc!)~lU`F;_3))fX=~nqeC(!RCie3} z_A)1_V|h=J_*c#R7G*OCFICmvwxqAETL>@rID+vJv)V(lZ2%@+$DN9JiT3&2|C$BjgkXF?mg3|5obLXXne$vlX%^IZQ!|8tX^TyaSRTrf=pf5 zRZANM)E?n`VOJ~h8_*j1nsxYdY@$LlL$!W*;-aTcM#xUG-k>>T;15Jzjrc5#W^t6FpqC&g&4KF4b zs^=_#j2l7E4y_1%00B@dqx!uNdqJ|;S0M6ky>9^2>Y&z^?3#z9hEJV2&U_f&fPDrf z0xTq=0Y>G>Ja9+^Xliq2TO2b|1b@L>Y%^UakNzb^hW@StxBes#tW3;-h|#y>5(I-^ z;ymZyU}cerGt&5dfcTReHRcRAku2)Z-Y2~LK!i>yg5gg&y?ZmdCnLwXgK&XEju&Iw zJ~WZ+ydriVL4=!;8j06S-QrydN0e^@ zT9K9Wz%3TT#4a=jj~tDy$LVLAK+^E$EBL3TnQj8|5g*sp8OKPWG7S_DRj+lOHD-UFK&v0-Ih&I5tZ#oZ=c9a^{<}Wk&oUN>s3P9KL7+ehjMY5m2sK13GevUj z=uU@iC=2jjLuE>M#!Z$;9-NKfDE4X~*QJA4be#K6XPMayaB0(ae6{sPqzEG_w3MF(9h3IHSHy;D? z`3TWy{WVI4TKY|t_$)xmUHwy2X;=rE$t8=;7gCdV3)@t0bZZ(xEokUxe`8``dxnOj z6*K~J{KH835ubm9X|n%`5{BzaQQ9|`5A%Q%{2hIUPNoT3Wm^Vcy5fpI;IfiUn_PZ5 zPG;e?hm7kq@lgjnYJ@8X=@nE1fW!{vhO_c`DrlZ8w@``vb%=j4B&etBhJxU)0$44; za~TYzw)3?BEPB0d5WpPV%;w@_fg6mM?-W(#j3IiA(xq}UzKR-6xV$vEx9BkW1T^5# zXo3NlqF~7ZlAskRn?l+IDKSvjm#Pzz1TU+tpYj+3y<<<}ftKc-3Vfn(gg@WMC}%!V zUi5H*+aFQ{63W~cBY5vc{(UZE;XcXCkI8SX~e-Y88UK^OO6+qP)?g7LD?R4df ztpDFgT26lUn6Sqx{ljG)qYY!u{-OC@`(l!R(;J%0zwj#H&0v3oMsQIsFWK9! zz9Uep?IWg*RM4Fzcwr6w8Ms$BeLoFjUfoU03#;Lc5IkDg40Zg={ zyMiIaP7Hg1Eih}hb&Dhe*3hh3nIuYshVli>4}gn+RQ>s7CM?i#=mDBsvT|M(B+jol zZv0VI)S#;stwWeQtYbrU@nADBh$7n%!iIea>>Ewd2-8AB86*t1#&3rOe=YuNb;}T; znObMyMe-a9VwuY;IzDLmS-0KXbyYj;%BySqyz9Q@N^gxz(EREN!b{MsyWNf0tm5Ja z4U!SZ-x(<5-t+WhN@sZPvS!XfYB)q+9fR5X-6*{nEo1h3Vrf3#t0Ov1-R^$`A;K!(h3KGFrxR^sRCT*CO4kV1Ayvhyu0v-^r^y_Jy^ya-(VZ3D<*ZWA?l zAu%CF<5tA@2*Q1s?%bCKgSEg@M)GV5uZE(nbONkCF?OT84EJ4EKIUw61!t@JpHPgp zMl2^E1Z{JZl#sm}_#y}KpVS?|v`kQxWI_!Bxz|=rP@EJ>w4HM1V;)&X$4{ps=(1P1 zOv6AMv>ASf6g~}lZY$GD24zYGXHd`fdM~rmlX5AIQ+smBjo{Lb@n;9Cq`%iowbk5| z(s=KZLn06yrTEs@9C~nvE@*xy|7ZXfi96-Q`)g-D-mrRM>&zr0!fp7RQ!H!(yxWc% z+$FN${5DUq({NRPl1gg^8PrL^%bq}|0oY9h_U(Y=6mc(U~{UbRHCqHj@Tdpbr+421h^&-u3p?QW&lvb+79vCo5S`X&%&3MWsI-oQx%E~s zq0rpU=ez-2FevC7x3}5_`a%%vF(bOz`_Sl_tM7dRT&yqe65wr2 zX!IHd3mNSjAgymcEGou9qXb2%+3_rCZ2IR-?C2>kOT*Li%vj#n^03^(WlKHRH^b;8u%(XPc`!YJEAnN*nUXwJ_xy z*GIQbCD{^YZxe@UbZ?C&j@W^wLxyR-1by*^b`9_bXLatTIk2u*W2_!9K-``c^>xq3 zm2fUz`5Y#1)M)xM2lQ#yjm8$-_%%mSppD!76HEehT>|W6K8ef(KH3hYa>kNw@=h=# z^kG=2U}PiCg2t=5Z*}X2lU%UP-0DsB#@7g#6|>T^4&btm--NO2$W<$3ITn`#1{cUDPY-j3pZtQ#1#mbmK;p{X)GamEwz;{~#&@Y*Hb#I3$qVbq zoM+qF@rO2GpU+S#!B7VWzO-D|Bl3@Ne*=sONf37Hg!GvL?#u)2CcUjv0P6+2oXqPKMH5P*7$w zYyMq?xpqH4j?{J^eWECmBiN-?wusG2%L~cPA_Lr02blsri1fA7rmUC<~Yt z_|o=O!|mf&XV*v{d=ks$0(~Kd`MyANJ2}B~0>7%=h*z4y>`P_^LPmcLf zlp<*()IerTA=F>zKL>z=7`Tq9?lE-xCo=@#xE5FnCOtK80DSC5B_XZsgEi*0A=7GR z`LavF1%I>j=C*@7t?XwwN6{HdS(@W)n4)H7=fIspXg5=c?~(1!o7CL)z=_}G*(R22 zjq~VQDd)VqwciYl$W8Wbp zIyaffTjgrtD`DQ~&&1SJJQ2%;6SuTLN@PwZFP-@+)O5ypD(e8hwM{wL=y;%}fy<+j zYP4*ZOw=My2|9g5X*J~5xhv)=#@`zCE`kC^IxAPKFq!it7TxpT0)z-Be1f|!ib!TO zbPoT(z)Rjis7BPrd4nxd3SRcXxzUtqt#zz!mZVv^Ss|`409)KEKC5{#YRjzqlJs6@ zaa&^IU8j?VG*PWyCnX?7RG@}y#9hwd6nnm*KVxDhgf1xWq_T>g<~&b%XYK_gK3j2> z^#$>iA(LH3H6r+}GQ(`%rc)fuW5T9u71~h*Yc|CZLTo>T+m36E_GU*}VopSMbJ)4m zxvz9TN(=;2?suc!Hal{Bjz=6& zT@g3sf=NV&jS|v;_}d;F>@kWZD_V1t0gz-t?R8AJTARVHul%w5-Pu0#j_QPYq!vt`Vi+J!7+F>LxKZtMfYW8dJ zh|oZCL39_jq^e*b_0OCIM5n9W3;5(g@(}B&HcYuxhIjBNxlAzdTVm2y-m~{-G#R!v z<*E$11}|wsPkE-QZP)o``?QoMgu@nRW1??Jr^D&?m|leij%8-4mV<<5EtAe(-l79# z^!JA_O0{u{99-6^W}Es0N2vfPgRFGGf@>w(FTImfYg%~Etw~@**30)c%2n(s@`8DC zze!!aInJ<=H6*P$b>P(}p{4dSghZkvuXifFlR3XTb_ zS;EVTES8565$l9gajE2^w6rKiJ`bevO^ujoQT51NyVnuv)eaQwxIM^aZA@|MD~f|U zOXm!pS0>vFE?#vSR(9QCtdUi^gaJ$6ChTFr76kVOFT4k)0z7nR>YKXEww88s-RJnJ z2GnZ+ScU}VSWA-}noqF4w?(AMun`>0jC#N&CBWLuY)*7@b8{Hki^96-;Gd5=IGBdasI9FIA2fGH`u1JxbFZ6K#%Mn!Ve_4J zL@*Qe1qJ1ngs>NbhSG=w?#Iaq*G?DqX4D$sf>s2UgHDx=lLV?$R!`)>;aZ}lzktdX z8|rDuEB=l$gE86GWaD?=8iUlr0IhmaLZS%}1X zClSYtmb~u^EyC+%D1!GC#9=Ne--qYIEGZ>ygf8sHKdKm$SsOA)aG;Z_4EV(~y|M2w za=N~;`v~+csNxHFmOh*3jua7CoM1FYs5Q8etVC$cs};?=Ota_})6tT*1BZPfTzA0K z_&(eUwZoMt4+?DnC^fp!#biUx=`cF-xk97oT`V>4&*NYJ+0=G4+PlD-O#nt#X#uAK z1MHZ&fx%%lh0-KU7%0MWM%vd|5G&eQE9tTtki~I)M5G$T-Z?TRB17n(ybXnwiLU2-Xgxs zs}?zCryHZKl*Pu`kcf3PR)Rnlh_n%snmbfe2#yJ~-Dxh9xh&-Gxn)Jmo8Y(bEqnNz_rk@t%4}%yU|9>4-ts9*~U)E zM_>X4NJ<;@Su4PpuhVvHP3W0J5%J&{$q6X5F{}cfv@gOqBe|J)D6b%_)G7_u^c4JV zl>q2vkAOxSJ?y-Hefmb$GR-HDV9RLz7iWJ$y9%u6-A!wB1 zv`~KIRgzs~!CBqOR)`~8SwK}rtp>Ky@0)GMBXO=c=QAkKfLCrcIu;wbIJsjpzE|?R zhmAXP4Hh&c*@s6l))u-nw0chSUX|X`O>UNVwMGAJM ziSx_U%)3laVqw|9kS#D`(36epYjNNjy**STC2(ILkf{wdax|sDH`sin=v8& z^0F@Cp6RwGP$pinM$IWH?m4e2;{E-izO(=qKZS>Lxhl9DRkeKRu$CwE5oK`yKy}=Y z08EA6m(27)6Y_4F6e_PZeJ13~eN*&&xU99tcQ*V~nV)4B7M-@oH1egurGA<6q#BHu zhePe4ZHtIBL@(a_&Jr?(qa#P)^#<+$}s#5VZqp_YR`a}dp z^g9IJMBma$Hg7afZ^BE#M*?(uTW#6DU7{nU8KH7MC(4v85+_YAzT>(f(9?`RBTjYtx+5i^5p6=qR(E_|p+M`JvN9T>JO9AY+JWQ339Vz42RY-}&D{wfwS>yR zX^-#TYSiId0N`67+;Yc18?5ZEFtngDWBK>;Otgi4Jgo@(e1$eUrX$-J7NGcsM*RgI zl2=#wV`YF+L&(iNZokyq_`cTK-14WA6i-o}@hl*xWzJt}|7UC{vdI~Tt< zEMY3lXpPf~XD;g)z9f^W8EsLOIu7*sGSY}%fx1K}k##BZG+2y7*4(7Tv3XDvW>h$P zp4oEEP)iTW6xHYOM|-^ji=6(~M^K|+Og{thoM`Mj{t!-PJ{Y`XJKCrXDFTTHxSL^P zzF&+D`H@Puq#Tgv06afNQ}-yyBYs<{nPaCb=zLyUmN@IUNW?`lqiBhBLnE?2*i@!z z?;oJ_Um#E`XD_kyf*BrMCoYJGND{>T*F-L&19yIKRy5@pbF|DxuNcNIs&Ey{VwB3pLdeqrEn+hNH zYUifp4U}X4I5?hb!1S)+)4nUm)q;8}A)QtpT^+^1QtQ~Z!1^PeRPr8*WU{F@VPgg% z#_=`Yf4x)CyIN3Ojb-r2c#x&fsbIYEsA=Heo-#iwQhK(#88R`1u!ZG`b!$+ImT4Ok zQdzc_H`p8u5oChxO6ShcAN1(0wX7#>Oe!vC_8Wnp0gk8cz+}|IxMTZjzp3uJ$Tf&m zzBRQbT+C8Iwnp6d4cOz-oLuZclO0om*|+6farZwxJY1t(FiL1Af30Iav{s@=a5`KfO`qGel5tX8?IY2=ps+uOB^0cl_(F{N zIZ7(G`I?PZZvfHM_b3-obt>w61yPtFPAMFkrlqLLWN7aBZswz~R zZ{(}i{TsdQ@3=W$YUu1M{KHRGu5oJ)ud_^Hd|%PT$Ouc*E2HY+RVw!vGq*7qYNHan zA0^QGL8C`%#cyf;bylXym-iBXjP_lh)&@g!D3gO!d5N|yX0X8Etk3c(@;&ezB)f~t zVVwjtqZhiekW25uGNS*&+B*h`(zMy4ZQHwT+qP}nwrz8_ZQHi(?%lR+cc1-!6LZhp ziMjWjn3$@l$of;UvMMrHK2KKWTEn&d;WZ(1>cJ>HMto8wX}W(ck!?+cXb7~kbU}@E z{q^Z8lxJb|Z2;+u!)K~B#8?hVr~r$pTC)-^rGe=5j|lU>lpK=dpHw@|$G%$NAdc1M zBMCRt;Xx$Hn68~vIx5Lh<$0r3Q%+Q;YtYaWK^Oi=qWW{dW_L@UAZ~0tciU7%q?bLN z!$El=qp-sz&Y8DuvUn#Q+8>DE<2Z{8BhqwkhEH?))lhdmiFHH{1$TgD$zIKhU!RRdYdgPt zyrxy+=Y?SM$FC8v-lzA4YK)T<9_9TWQijfL+0$IoxZwFf-Pl!If+zADxNt_u>EiKz zc)q<1J3acY+;Xd(Ef`F#eKDyA^R?un)^u|L(Tr9~T3Q38}7Q)@O zsM`!W#wrW#w}?-O30$K(K4%`s7jrgQR)v!w5}XfXa8}~3HjK_d2iMKl(;?(LTq`rW zn3gG@ycvP2UK2nAxin`f`ViCtwB~zlxCdqg@a1ho=L^i{csOm0etnOZ4Ja74A$vup zY*vEdgP=d^A~z0?3uPLgGT16jS(^qb`0cn;$+TO*1HOvh^UPdk`|Uz8OQi?y1`bm0 zDc7A}11WF<#;Y)|N&1S@MB8h@RREcU*%=~wwq$1?J^J0unA~go6+la z-Ajwkrw(DWy5piP{OE7Q>hGk5RXcw~e>WRjS?@&TypXxu+)|lB;wCc2jm0gdFCo1I z+%)NSO&*&$O^4fUS_9sJti|&_X_+~^rgZe!AVn&s1FRyA`q`h(THI2vaju2lCOg_t zK+SBeZ#5!;lWK5nhYa1nfr`1(|Nb6{3%pV>+Nssa^12NHxSeuB(PUBl#t)N{fNg|N z_D6IN6E?b3hyWh$IC!m|D&uuhEEby7vbMOTz~{?l?!7CT3q0X6Ab~=ZH!e+Ttl6SY znZdXSaYAp<6dC!TV5g>dByBm6CF8iML#CKMW0rYIGQ_f|Z6Iudq3wuKf_Oc#bDUAY zx!NW}t8l`z%>i)*l#3X_m&6Qk+?io*+&?4((YFR=)z?6BRlCp(Y!S6mZ?ZIpF)k}om# zRd(&Jo7H*ucEu~HD4HTNwW%3XXB=he^)dDzg@$ZJ;ZIhn0 z-`hLq(5HvhQn3Y?OV;kvd62E~1l@s~ft(XP8SrNsg6`xru;;f36Fr@Vc2E40$ccNW zHgV!y$~ixChbc~^WnF8cZ5=N8>!Hnj4;HqIsD+Q-*|A;~E96W`n{fU35#Tb;U_Uoa zgF_~C0RNyGa%Ze4Zw(d_A?DPTla9{p9$8rcRa6XB)2bp%QAuD_gTPvPc6eKia8(tE zRJm2lCigBXO62P<+H}Nvp48=Z#Qm$}U;`h{omUj|Ls!0p370IS-aeWI7zG+%>o+3? zu@QIv>orIMti5Exi|Wl72mvTHI8{u;SbxRw-~c*WE%`GT*HCru%7-}x@FxoZg^s{; z(-(!JINVcLqU2YNK;82S25aALlmJ7f^M>h_mOigkWowT+wp_}GLTtJbt;6|l`yw9& zi!{^)>ahLlXn+D}K~+r`SO{1O_LMlE@I+J}z#w)*DK~|p35|TrYL3P)T;k=)Lmy7* ziB|j#hHvX}=HiXHznj=^quWEtA|F8ohRZ8ef?fY`L;M2s3sr#7yUfYH>iz0hS3&TC z94k&s8=4RLWX7x?FD8sp#EcVYr!qHGu68BVYokhm3=K#j4eS(UyD6tR* zZ|=lamlG&OwweCyUoL{63K{ZTLf{Me`jH{ zbESiSapedD%tq=W=|Aulb=|+&>alPOBqMEFgG#QG!XOtS6R^CcW<$0W*>A?rdrec2 z{9UET{`Qnr+$-Xgr8Hl2-ms?LY!ZvN29*kUR#rNZfUC!+@?6rkoRcONj&2o6ZEFS$ zPiReCXCf%(y$*?Y*ZzaOx()_=Hu1IIlQ_w6d+0UCxqETe4HAC&TFZbQtp&v`phX22 zVc-pI@S}6z^AAlX$TOBd7*AJT0t*k78R-E6rkbPgMeMim0W`2?`h3CTN*12RYByb7CRW82!fGcv9) zhv;(~^KSz0Mu!pl=bpmVQG$1f`q^5;RIk^h|NX%|#n?dj#i3_cOqBxJGT`pkajS&$ zyLm%~SW{iA$x(KW?tBqP=Hd+MHf3&|M=*u~m-Js6Pw2;QDOs`fhTom5%7u@%fs0-KVn`E8DmC=iSBG-TB`0$NUFF7rTc84u==` zPC=9kH)iHOV|#0TLzQUG%JO4+BlW}X$OWdM1GVoo6Z*R*=MwiusP^_9vfHW@ex0pC zo|GhZ91%CtG&v#)=PS@9MfWXx^;P5gW^nesgViC8Qz-jpJ*I3DNJ6dViF#@iTU^0= zEX84KYtA)YKfz%{Q#x5EbF+ECzPtjuhF~@7g6rU(YNw2WE1$w=>g4FkRh~?kp8P2f zDzxFQzSxE#W2m=rVLmIglY2*dp=x$djflh*1y=JumJbA-#)PoC+A~wGtU$_rLZeev zD4Az~3r@@m_fK2Aq;2(GN78$TB#$p{pda(hn)wc+3ThZA%>DZe>MrP9#*^{VqWc`; zZjt`%QGfdi4(^kG4!_X`1RrusZQ~|^oftoDT*Y7{hVrTt!O$SRwH;O*XuDJpv&Gaj z&F7}5LyBx(q2@rgjyKwMzi0c;v#h$O@QGyEfq2yGU?%}Bl@7bQ2<)!qI3+wMqqn#( z%l*WdEL*bn$JB(W_2jhavV)Z_xU${$+R5n zCgoEh6Nb!*c|%TeC}6r#+Eo7a+fplfbt5^AqB3GpCoTBoRyKg9Y0aob@1fyeeLq#5 zo#>#t;5+IwKGVPGHL^saA!e_ZGWqR~zah;0v$}(Zyxy?suwF!4@ndj#TGt=!6kcuN zob;(nDS7B&;e2rvQshoU&HPWbxD%!j16(gJmEIL%+A?DW=wrDDq#0ePM62ntml*lE z!LBk}1l@~A`%8}TKwQC^5lSc+)7sFwCf4Xc0Jx>ko{e$3j@K#lKij{iaO{7con;hO z;cACf$4(tdPq7ZX(eCpLzv=ITR$45kM&8$Z!B~~aAQnB0CkZA{!`{gx?aqr07@1MF z7oZFMEy=%x>9S*|vKBSZN<}S@JX>x&LH1eUny^4Iq+Vo5N0UT!;x!o!9C*s7+Ej@d zfj_gk>{_gVFEkEHRCvnO%PIrg-E{~bnQ_zDgQnbcF1s=AkH=#f}N5_0Cu>La06x`%QkJp4LQk{R)K~Q^yS!EKRQZ4se39A*njfkyo@r{-#?L6cB^|cC=LEc(DcX$0- zd$Cy#IE+h0mQ6A|Va;=p!p;YezjJ-y$oa&EQ;wb>VD0I2gahaXkXo>gA}=oBf^U^9 zVsZ`sz%Tm6@Yp?ImOeKIz1TCgq)*D!9@NG^=WPLr0@hahap{?jPMd=1bU8)${tVP^ zDA~%qT$JJq=IKntNiVS1;j(oBZy2~JDhJpV*j!$YvSY9ehLkVaJ#hwaaM~`AF?}uo zSm_j+ERpt6Z9WwNiq|IV*b)?d-Vz|TF}VxZ*WPv2Bq5f(S!X|t^ZB*j?Fre|b5L$H z*Oqr`X0CTYRQkj%d;3Htg)7lExdoF|nI8gR_F9K@kSYu0ExPk6-7oN(PRl={WZMmG z=#-O$vY_?{nw3MJg67^MVPEN5X?nCM6gi!huoukfuO9tnL_r!WSB?s^s{{-?V8QS8hUOa}nH`4+ErpeK z<#~ukYv?3cIlrOhFm>nBZBp;_6tx^5LC>f7QgH+JT1+;``r%_8!8{OL-b-zC z`9>#&xQJ$p7f8CBq?ig_LZ=Jyhn+OK^z^>Ktt+NdM<+0G=cFEWx~pJ|8k>yH9qZ$r zV**HaY}yh@xu(>Eq=IUOQ{di-yf_YWudNx*vF$z1dqA8uCAQf*=J4O{#I`~dg>7Bg zu$>sr>&WFFUZ3<)2jNKhs-k7+jSXN;4xCc?Y+XH9al=K};^7|JNfOL$)kqmsI>C^Z z4W3)IZEM$~8l#(%4iZ>_U6)01{D2h-9;N6>_v|y2P$R{}g#L5N`;ETeMjm(WTYC;F zvkZzpmvaqFQTqpwi_JU@Ll~!7o>S%S?3M0Lvs2cjE^jhwZ+sa?F+%JUdkB(Ka_|vdEv~&3vJzvVm@7BU)CHAMtolrU9$4s4w@K(!$S?;SR z5wr*tc1GhUhEQ)4u^M1Ntuc+ZCQyU6AWW*<`Ltf(+y}$IpB}_26qPkXCg_I;PS z;cvDCLVW~Pe@==hpqo2`s4ZM28K~Y>54Q0q&_&d}nu zT16#%eRaU}e$kGN*7}O2>gTNpwAQcFg{Na`S;tlRd=*-AJPZZi1COM-$TRU$lHi#j zDa~=>Tj=c_Kj#yLJo)o&)K929!jRofa;fd3$9jDJkVy)r@3#%yYXCgRWmvl6*{?L~ zG4L`#=En06IcI4`)@rB!Lz-fgN+#(5wWYBpcOH*@BI-4<>{)hIKbZQx~0a={g!Shi&UQkRZ zxkFdyxj(k+bwue-*RYja>SW1BQ!R9KV&=@pjf8r?Zzb1jJRf!Iv1PJkCX&Xk#m-}L zgHdLA{_lOWRr~Uik6E*VRuzX?%W9&9lD;j8y54Y zjD=(B)b^PR>lgLUX-iiqA6+3%NFC3)Iqt2OOBlnP6-g}@E2yNcG~>_taZP2KEp>yA z>PVLrb}#PMYkDI+R(UKkCy=5CcpPPfS_IU=I6Sk9xiM!f3AKx z=MIwLq(=gAj>1CKd&G7cpq5|YoIX)cezVz9Y_o7a9M~~@uDCLtL;K)vHt@<)#+k&} z;Vv}fkf;=Dz+SOzEERrwhMF>e7e7vud}~gv^*$k&B^Q@)HwNSY}SkOVZR z-C)Aux)H@SrQo6j8dKGR_?Y=eGLu5qEU(1PP-NGwf=1wdtamjP{P^BZSWFz~qAP zH&xqZpw4uU03j*8uF{yhQ!0Ei8c*0KuzZlceOjI21kjQ|Q0I@a3yM();k?kW+YQkMrkm>$h+9rhoR>^#V!B8GQU@;gd@m*6wfgckR27`- zZ*^{JtbQT~s|pP6`;C15?V|IlgB)%edg6;(%t1y2b8UrFx5F`xq^&?+!#inD(=ii8 zMK5RCr!8V15AO?f7&xe*a_H^`eWlXVNB^=`bm;M!4K>%0XFNk^I+xc@N-fh|dKX(s zpwduT-L6Ekb}{XPap9XK6!FNSOMpg@Fa{nOhb%V}XQ7&C?{;%}OV?@kLAL?L+6>y! zYBduM_V_-^2Q=#S?1<{{8iBEpTG6b6-$^NGQtkazyz#1iPm6Uaruw@|Crnuj;T7H}}wz zZ%0?=urX6-v*rB|YFV2CECM;yEZay2z2Yj3(5!9b+%mapoQrPS)ZD8<d89#74oPSkn_9+>br`^u11h0@uY-Yy2 zZSeXRyd6~KXOVa)@vly~by2S7>$gLr$Io2?&z`OasaJ0+R9-(VlWO6L-qTssa?uZw`U&5ef@?;gq7je8HHS+!j!vR_?>4i{%Upxo!4@HCih zX8J6EKaZJaey?9Vpr50sQwfz!&$n#h92kXhw7Yzwv+&njPOK&H1iKq|9zp(gQh6%E zgO=Vs&4jsZ5U+9b=_%gZ_{X@>vsfU1pZ1XAwL5*2^#1N|+ddQ+D3d{A&ADxA{nY7G z<6CP#0`pBxv-ML;(s3~>eZ;u+a+#W6O6e^RTU&bBOc78s-i>+M=tsi{Q2*=H3;4nl zkQ*IV2cu(o^M}Gr&3aB&$L#lu!`}rJncHtDSmpF#d>-}z4HET~6?kXl7p1?phCd(v z_%78aCx0);f^Q~Nyl_urevbZp?)+qcYt}pU!U_DWim{J+dg9FT%#%N!6AUUy0{p>< z3#6g#W-?tmXAgT`YQ>3zu-LNAUHiM?9H|dCYS{}^Z+6$9?Wc8cu~F&5@uIjq z1tRSik=IUBZ^6;?c*5nG-9te^FO6LC;kbcuC4(c*LYlpWJhjnsV8}^*nH4%k_NC1$ zxOCxr|FN1Aqk6CIMw5W@ET{LicqntW7zajB!Z~L>*aKIy6h(9)LY$ArG!l}gt}3Yd zgUE%={IiWW%jG^7aXc{Uj_3~~#q(R%c}wmL6+s*T?+v%NFc4k4(^ig;>9&B(R3pWjtTtg@^H!#mAGu(xtk;vsrF|o~&5xpdYz`Gd~}_wVeH|-&+^z zlINA~#|rXy(?Q3z(PqvIxT7^xRHNLWv+f^eI7!zZQm6@mQU2uPiyShi4{*4pXs>V0D{9+xgK#y+3h-*EuJfGfSI7NiPp_>=Q9~ zxZ$Ukc}6%=lXc9_dh(_c=hljz$GCf)L)XkP)9^XLQAkL1K;b4L$H9-F>^VY~fItp!0+?5>8#+Zc&W2$HvOU zoVv8#L2o``$G>Q7`+#cR{CXAn-GTBXK5m&mJbVETm;#DY|D=3J03leN)bdc{AneG` zr*ggc@%*Ig^Lix)(=BQDTVa(O;+y}D_u7cMM;%9pPRZkIv3QB;YT=z2T-CN2(!hPp z3hzVhqF-$wVzBL;fjd6#QnkBcd%>Uh;av`vOYYYRbzpuksY%%YLOnlX^Z{WmnDhfY z*f>4dZ=-ny+0;4R(MHKGlb6X%{oaBulqeWck4Mx=&)*<}lWk?{IpHG7rf0KF2-mw@ z0D3wn08F&#?q@XQ9nf>VIPnZ`E7(=U{7Z89LNhNY{UxyoB8m~4ST1)aMNc56)qg$3 z-P>=}WZEhmHb*DgI*u*2fAxVL?7{D8X0ShRpJ}M|FXP=bW6N!D-RCYbJjtPhK65l$ zO}6lk2BypSBq`UrpU)l$6sb*L3+``V;5qq)el+EKD*oNax@Vjsmnd&l&C6Bhrf{Jf zwv|f~3>$d0^w6)p0a1I)Q8wK8T32+;ACg{;jf)S{ZLex$j;qQNE&s>V>^!kQsP!lNopr8Xb zu@7n)n_J>dPfGtB(muw;&y!q9=}N7kG9FseeiN1H$*U)q*Kel`69)*9Q#$%p&N9zc z#4gCN#7DWa(>J`I*U^|5GLVF39CD9sMvQULGV`JAIhKtkK*Cm1|*SchutpiCYI>tMhx?nFptjx4lRTm`%+hjU8Vq!dqeg+y;=eJrL6=9#H7C$z&D2_J+FGVIj;sckhrp{DQsqU0s3|P#EnAMy*(wWNwC^O$ zrRi3omsx=ro*4l>mI6ikt$R!^B?R{%n#ONI%?s-CY=dWEvH{T{RMS+o53aan*o&4p zyZFMPpRYx<({6sl$Vp}EJ!UNey;R9}icn?0tX-pxc;@L$I`4PC2~K7gpc_HzA)G&uAub6&E(rK;Z^;ER}3dHg#F5-0Jt3tHg%owNidS{b`kHM`ysKZPmGI zP+kuP*+$BedAbd_20l3`31Y4G9<36TSi&3F_cNI#M=I(A8=LI;g&hgh5$q^C5D(cC zu3T1A7LHsSxGzzE90s`XPF)%SYTtpQ(7Koi@vLug!x55mb^*E`vUEViZ)$9lNC`B6 zRZvXrgkdc_?Afp4c%e?Msw<2bZAq1pbwCQKR@+V*;9xj6i(6$XO^>Mv`zQ6j!O&L~ z0AvD}I-S0vY!3FX41h#hrmf=8!=z(&7Ac2UFcrHvLCgmTc`N4>k3{q7$Z5Y!B#!s` z{F;0G&e96RSkb1F`qL z*G6{8WnYq~G9-o_9CM9BXG&R4ZRjW1Y_j6h;}EJpOQrH4?Dl+kAd|RsBMB`37!u;2l84jTZ)6WSIP@SP-g*s160)#&`ltvD`GjB!bJ$V#r*uYJXqXGUaKxOmj0LYgnPfvnl@Tkv z)2b~l?n=B!1Q#=1C1qE5g@};dfcCS<9rPx3}s1 z#2+@mTTK4*QJDOEv!0; zg`zA$fk)KFa{_$#=Cp%a+c0fgAD;ktF$oV)srp}{0r9et!PnX5{vl;g#j|C6qnNbu zV+By+buZ+!<9U}2qE@|oJ?0B*>)_Q?~ z=Ex;df_ag^p+`A8&m-@?F-C>o?K^|)m7Ggz&vjU|<(JZMMG8jZ1c(fG({+ie4a^am zYk5!yDex995>#9upO(Jy3T#p5>3Jl87>7%+<>z-St7fzlxq&w>nPArFC)8NRD84aL zIDBIt6$Y=GjM!hLrnszn+7@bH0fpFGb3h!wxhTf-K|(?d02)z5X(?dZbw;G$Mf@FM zZ`yy+gz7)T*#=Qm2~$Mt(r3|0w&d2)P`-bH0v{Ki>XqR4LV_aT==s^aGrKb|IuVj{ zRk&aS;HvW?DB$*s!q^78bQ*IkaiRW(ndqj{2Roa4OmXfZbRzH0W0D~U@EH7r;!qtN zfw!U-t2Q-St}pXwV~Hb@h8{jUrADp;RojS+2gIT@K6_=8dJv#SYlIk9*Of%9SpPkW zk#<8;6olV314?_)r_}0M=fm}|k#;35z`U1!zg2cMd;$0RKbkEoSyEdM-`|W+t>w=KqiU(f^0&eY1*<-M%QoH}+2? zMLsBTw2-G_aZ$v1Nnbt@$lY%%-uz+Qjmk#1v+H&2?#`cWjg5HiN>YnuO+nwabhDgv zGgJ1jkq!I3vmuVJS-KOHQ%zEBp&=!Z4!d+ld?NMB=6)F4;$2Zn49IkXU9liRCkoHx zlLt{WTE*}@6JuBDJU_lzh6)HIO(yosh_ z6Ft#I)M)uULyD<;nF-*uTYp1BddWWDdC1VZ@`S3{xqI~`Zhdmdj9>eIKo6a3^7vI8 zzrPWRLoWlBQKd6~P3i?~YRCffu^YY_;DV+?HVq}XbQlhQ{I#^>p3YHnCB%R7}tf03Af5>b- zJpAF#iB5%2!h#u{JkziD-`m3WPJ4SedNpOaJE7N_Hgk&-h(i*Tf~5*KtH4V}QuGmG zjxOz}83m50iO|Os9DpLe13mt)ko>i(^BRK69qgt(q=Q6uSYKos z$&hd-#{fFZ*8O9Iq!*yU;CEdiZHolMn`9VmN;MWwyrx7|j}b>om){j=r(X!dIBD*> zfpe1Rq}c1P#b3B)*T>>cfR-~>o<3XKd%>kgK54m;1lyycjq!Us)^q~&92Z9s-J#e5 zG{O-ldC<;pL0${R=?6_+pnI5=V!gf23=>$wAlH3vGq{-nM;Sv~BQYqXT3Q7uqu0(0 zE^gOC5WftZ-N|KyuDaV^7Pr@bat}uPr4@U5JErwbMdd(OqCu-y9d2v$Ht9##HUsz9 zZ{+dc3{I%01yp7A7&h#lW911f-k~~%tGDiLZI&+iB8dZKS&?8S!2Kk_Nc7^wDyb~A z@Nt==qj?54Ae?X|N%9pIxk%hg==7*L z8sM0Carc@|h~qB#>MgY0oHG)?I@WC2s6x0;bF+KP?XqJJvi@*>8aZD)qI97=*8ZUj zP#n3Csd>4eq0|H@p`B8b96b}mdXbMg+FHonRJuSoc|VmGT;*$Bh$Fo?`>M5y(vj%? zo-o(9!6f+VN92ORaz>c5buDy4-$c+vr?HxF#mjpt&+s?>k&62Lbn|t$BkKEbJ~n#i z@7Hg@jt652b!9}dNz^zakSO}#zRvE;$IgrR4vJRFspExrvQ|6Wzav<{y&z_v=5Yfc@8`NAlMMME-xK9?l-tCQjxi zCeE}*PEP+v+Ed+dT%($|57Lz3p?}O-L{z`8zEaP4faY$ae?( z#Yp@{s&_~l(sCeOIo5e{Su>N6Nfw(&NP24pc5gPBZtwV>2(p`CT)nD@Es}Hv#DB)~ zO7#{nVaD^pliAKF7%haPhRDi&tN~CvK(GBGMEGL39CZ$n16HTlpE0eKHTO#3AIy|f z>Mqm~k(FjW{LpYF{Vw32QP#>%dkzHQNQaHRhy#sZ*x60KBS-FZZBG0QNUZ?d0(qV( z0H2otO&$3e-jMwvL@Hh?Vscf{2U=JF!?pUuL>S$yOBsD9UQsVh!nPxhGXHt}XY7DD zv|daA3-(rKgkqeP&R-y&n1}T8Xsj$|xSG>WcGExI1SaNOUDu9m(c4ET4PT?x=_j7A z=aWs5>u2`LS$nsF4K#aP=nPJRUc5+TN4m_wizBXreQ<<(cFjzjNml~jgIZN5 zbH4bGYnyh8q0CI35ok1yV_*2`eBYwzrA!aBgsE|R;iyf7>d?LdT?#iz*ks`Nhcr<~ zd)0HdzSs!~tfhRo!oQX{?#b(zM8a%YF!fm=Wzt|@vzl}kIdlEKJU*jNTGVDM!D$UU_(gSSiD)#D>(<*0lnm188( ztZ&XgU0;)-%(FYFHiJqW1EV>;N(Wzb)R+Vux~^` zrLyJ20eeo0u#l~&#`52!FEY``LY)aMJ`WZEKS3V%_2fAWiQX zj8;foI%QsG{XZ zWdi_&_(=13lRr9QHPE$Sd!hsp^vd#y9GW@<*6vmepoDrku?m-5O@$!lcZ;OfD?D?- zqFNJkxyvk>7{B?(d8p;Q{Vj96cQNj?0y-+RpmMqBu^|j(c{xZ<07r`kYAr;+xvpb7 zYV!*yA-y|FOb$dAwPyT>S6lo;gAk?iwygqQm)xIUj`{Ywiz#dcDP2opWgEu7c8%CP zPY4OBb2w^WRWW2ud7}2Qz$Ts&G@NW7@Ud*dx#(4_)O|{l=}myqQ6eh(YUojc(6p8z z9QQ1oZve%41>Iwe&=IOvrV}XwYD&a!gl#3EDi)G7Z6eDZO^Tac0QJ{g(iAcEOj>;h zATC6ZdZA0LB~#tljZuc8I*GG%%$#v%OQ|Ks<4XR-G!S=bn=-I&zfv&oqygi<&*RkV zp+QP1MIuAlp*G*@@DbKBqL;v(TF+fpd8kI;5&8(QbJ@hH?WnV zflwdm)>W8~2*{#p&>av$5gCxRdJO6U;Rf^^#UaxN`;h|w^oKvYo1qj~1abzJAcAJE zD`CsUE}O>SQ=5#;2^Utb){WwOsBepI`2;%=L=P5!R3cz??6*L-v38L#@&FkGO@Vao z^7C7XTe(!&*1hbx(7XMWN5d8dM?`9I$}DN{VrS+xIcUKeH-PKl&AArsCPfXax_+b5 z$pU)2MsA#;JV>%?OjGHs6BN%*AJ2viOe<(utk8t~+OqXJ;Y?DgeP2q5wex z%Y4&5&+K<8V;3He`D2lIadyN%X_PzaLd_Obd0hk>1Sxdo#u-I3!DKfuBUkO+Fc?vz z)DY_4hW=f{V#Ma~PSy)IMbc$kxf#2&ngf^pC;Ypvu?A&20JY$SF^g17Kx-A__#RsoW)Jh|g z?ckc!(j~4jpi3e#itHDK7p&vL71Szfi3gpfT|QaF-fZ&-$9d}$#=GK-)S1O$?8fk&>Lu?CD>*4+5%Km`HV zV0XsLj_T6v%Rcb65Kq;51NPGzBcD#PN82HEqrJn`0w=F}>xygF8jM(WavZUw`?sG^ z`}4!G!|v>_5(jvu*R~s?KjMIatNg2im=as}a$4pqQ3;9o8qToJ5z^?_9sw_kTA5uw zgfXSkaXg|A>8oOXh7DJm?`#e$-Kox{i$!5{05t0ivt3$wP0zjQ}oSw9PJCO&)-uDjnM zg5!ezE#cn^2=WOA0|5BfIQXv-@}HRdKgZw_|0A)lwVjcHwaNbu!T*su{wECoFGKKu zs!{)+QUUJ&-)flI+S!=UxLD9QyV#oWTR1y8TiBS;I-3}o)BQ(ey}yY6e*Iq~bNqLa zog9t+?S=mx@}Khm8kXn34f`L{o&O{BKS5DLbdK^r-~68=^shtQe;fM$W&MUb<2wJK*xq_0L6a4*mk+@W(Ws9HC~00`WdMopURi;REX5@TmRhs^&8uNclm7OcWQo7SJV0u@&9x_eloAs7K6xPE8Vg}O(b_gA0-se5XfmM}s`80;4gXbW(GSJ>2r_71 zWF`f$^58T~;+hG!N&$6zeIZ5U&}QDaMYA1Jkm`O6Rt^L!ah}w1!Kf#G3)e2bdS&e| znKW}2(#x0luGqvd_%M~-)q_qdWz%aAw%xGNyV1kFW(`Ln(AlH8<;*{;?)6#TdaMAO z_f*!7TGx~sKT1})G+2gE{EITXO=5@JTS4KEblELX^-Qe<=Qx(mm>aJ!AzFhcP5Nf7 ztCER*aG;0}4gA+%WxjZwj`jMCVKO*ZPv<&oRUIaN@#g(}RC9E-LHw1J!POf?U$)yZ zpXueV;iL%yM(nTN^gr$Pe<$!OmHmqU)}8?XWFi0n{@d&! zEg>W#t0eNTWL;#ZMgN}${ZILy8uYM_mJ^oP?`yBGNT{yxXn*s`oO-t^NHKmC<2@J= zM~Ml{?rg9Q{>O^>m@8sIZ^Os;lg zt;KRdGuNthRE<;nm1Sqak&WsRE8ThxMT*Y}HBV;|XzQ!do~F@7^A+o(sYaFdGH2#$ zrSCu|V=eqH-kpj;+yg;}azn$pS9k1bZJO=|I=58kTJg^+fK3woZ$YK#RBt9??(M%#!lRYe!*>8#5`b@y%NsTPfH<3`8T zWrCZVOv`yBYJWeS)+dXb&7FGtCc;X`B^J+j*40(dH5M3kZEK%d=N%P;CN{wg1;|Rz z2J)lIs<90l%T{hqTN&qH4STsbpB3ZBMywliI9KAs11JGG@9*eXB|g@*=O-&obLhE^ z9Nqj2%S~3QQwnNy2Z$;CgaRv@odrpdck}^nd|nx^N8%iMx-5#kth@n=&saM^sg{jo zVVfo=tpjb1=G6^=cZj706PkEHNs#kYuTc7nPMK+X-)gVU2})f^zd_1q8Xi9>u`;WY zU^*WbXK4v!d? zbW@1liCh-ltIY~zO0)LWdmCk0`!=ghWC`4S7zElqYPV%vw_u^MjC;b}sdc+|vg4T^ zi#|ozT(O)E{dRsforC>5eA?kE?L|a8g!gqE2E}^niGo2B@{G7`#mHic7P^%@e!}-I z^&nzD4(+(UfgAhNB!oUfZ_$w{aLviD1RFP!>JKCko8EQdSh6J>Y*mIwB{h1{w9c#b zGlN#1y8~LQGdom$gP}GR0ch1=L0*Lx7tuXScnB)BnS&5fVp+SJ^s|z0i^TXGeJXj9 zY9=B_Nd9IlLi7@A5|jn4YMWm}-3EpQeyBOp7;-leoD-hl3;F=cG>Z{@RppIav&=b5Lds+6fgo3BgffDIE+<%>vuO(l^2LhUH zCna^4ubI0AG_Sc*VkODUrk@34VUx$Q)0sl-b8yR zG>Ha?b0=t^)IlfB7=c^bpcJ|2@lUI(lr|4jjOo{CU3M1g^L~LK#d8e_2>3yKFl=96 z&=6It<0K5kqdC%MR-XbM^A9M2CySlfzE5D|8Vzl_=Z~eggpW7;1~|uK`y6Afd}m3A z9|DO{kXT)zHpyFrT$@X$&ovk7IJZ=>a~sME1|$*DB&Na#jPBJdAnuM3mcve%BAm4D zBvag8$ez+jw2a{>Ud{M3 z86?R?{b(Ez-Vn-PxI=R$Sy>}bT}dO*2CPKS{OTnOl68bnWr&fc1%yiTtn6-jMDvxY zZn<^f3ha;u!8I>9*)d^7g~&$KPb-S*}P*Zl{Ku@e?h6kuM^nCV_Yvc&@k z^7__ntotMOds$HT*#!5>?#JH}W1looSOjt`P6SeEkaOLaMVKj*sn*S>aj;(?cPLbb z>X;WUl_nZ*@H*t(;TPsI+Q$iRIzu`GU=uibbxZWN_XfuRP57A$% zlOGVlLb9=AN1c^Rx+O&fDS#K$VMNI5Z7HII7b05a{DsyA8$;07>dFpJSoOftJmDJ8 zFq)c-v;rd!0L5SgvK8q=b_lQr#lz7^8Y54XR)=+T&$Jz%j@HJDm*@NA_pf~e2PdDn zu-;yLmlj&ewS=8qZemVT!efe^+LHo2V7%<60h9b)RoS84?T%U&kCe9+Q+Kvf@Xwr{xhnyX%m8s8ICxYbYf~ml`F&*8c1*1gNh1LomvJ{~j6xp2&fkP6wz6knmQh$leM2RPrLv$Mp0EJcbg>$%GB9EyHQo1(BebSRdDwS9ud;V`%^e;W;TC{+(w zT{bAwT2&B5*EMk*)N2hoQV{q;0KF=XSJayTW*e$dKpUz(0$yT70FA|Vh!dQsqcST- zA?yvg;WgCg|Hauk1&P{pS-NbyPT96j*|u%lwr$(CZTpmM+t!@#pXlj{jz2nj<|;4V z%Y5R^y?3s)a$y)Bj*u`!b)92Wh8o0B(AU}wmNbeD{g9;Y!X0vD;o?(#KUQW@S!Oss z4HN<@KB|z{7Th7{Kyx64qA?UoaMjL>Dkg4}RREme(Q4G_`v zr&iCrgy~3eQ>vz`h3glp zOmU_>1`wNkDC?RKtha#vl4$sTzeMbhljvg#+eXY!_GB1ou$G<`hEI*1PEa0>)Fs@W zlP>LW0wC;<|JhVT)J7PC4JBAEsLei83smwS< z)N@9HOa}i5cnV)cAVq@S!9{}8O#=``6LwQ^R`AS|t0G64BVh=F;KDaBBqbszm0;Ct z&tUxu+*ME@Iqoa0TUuo>gq)>IZ?ruu?m!~!nGg>PgQhAYct~Q_vFi`MS3x^Ws7Fc( zomK~AT+J0EngkTKgD(&G{BWUkfo!3ZSaECR+nT^=N<9gSB;0^%jYl}$_f%ULwMrA9 zyAav;V(&xdXF?zwwv#5M6jo5rkk_NOCm&|JKmbV!3r3pN*o`tZX7HZz({FZSiWy(# zSwxAY1etv$R&O^PowMsHpj|qObOF}>8hyvqxj;Fmugym2IAQO-tXz&-OOEGoVeITc zBhvce!$yFNUqI$5yEJc=x20v^fUFck<|7Tg6vYpulJ;^RO98qXCZG4X#Fdu&3MWAP zWbUMuXsKBD0FBOp?mV}iz+*9}HA_Wk$6`t~N^npxj9?v~zpAu~98zj$GnOZ)T7I7N z`(=v?V%x_AO~f1>V7_W&(ZwOm8l2_;O+`G*VG?7l>rR%krA-jbVgN14IG(j2=O?Z& z_V*dDEf+tXS^UvkN`mjCkbt!t!FK6Mz~&KmRzBjUV?J~|xvu)bZtxAvwQFOwkSdN8 zPo!J|z^E}dt~Ge{XYJ(#qYhZO@V0oSduW!`&oT9`&oIDYp|hXM=-)%QdDd`1bFDmm zvv+!G{!S648d+$zlaSg397&nPF8-sfH4g;hy}UppMpS(^(_f)f2l1rZBquj*SQ;v`-x!__@ zwRg&CaMAH{V^Lg`c@rH!PY;boO2d~Av(OV30*c2$K)&53B<5zVh0Yv!A0giY*njv< z?o$L0_@X?3_7~y$BpAsL*9lX}N1Sg>7wD18dyt;xOI-IHw_y&L3KTO2groe!LL3ut zf3d8KX08ypmM||b<737TLKxdLkm++EtzQnnTC3laPxK_`VW;4?sTEL#5GO;VizdvS zv@Ij4))uHO_sI*C^PGrrVA>mN^t-{Cjmm(eG5+?zcJbe|fU2KW5`+ke<_MCICvJU}DUb7AO?& z^Q59a!0`%?7x$69U)#f=jRhy0xTAnP9MYnAX{K-~2so84S(@}?gLMhw`lv8d`9kvn zp#J19hA;y`d6 zask|pMUNxmxw%un$K6lbfgJP!@GvQ=*3o4g3j;P>qB0)6@UU~2D;6S@JT-4{e#m>) zXLv(k(jKu;Tr&QGFc#=B9xc|J?rF1=gunQT3@O&7l%%h9k z$P}`3g1BDDU~g~6c5LMJvfV-c)gtNfHO>2dhwL`dMC`VwV2{6?7)GWHd*(=N?*}&h z^vcv!zt4{mRXiZ4B0>Ag4oqmLHmyEi{P(VRsFzwSG^!PIck2D?lHOCW~JEmF_d){3dN z1Ru>3pGRjQ60I-&(roRzzc|sv@GCuz1Rp{@=^~@ZS*4^MumlS6tH3c3GJc+c2`k7Iv$E-`En$LX+ZdH?X&GDxypi;%mTAl zzIDZzPdtpa%gjin&{y82YEYdwk`b3gQvO7!-0&pIua!B0xG3n=961Bw?c@ck-Fx3= zbkmKuFF6#~sceK9F_z}rK(5NRePf^Jk_L}pY|i-wu|G^-z}SSbW?J|vX<2$%;kZuD zxRya(u#=PlLAuCXd&EeoM&GwRyh(>Jh>}GodQ=fuGG6kn)t25Q{Ai9wg`jN%MGwM| zgg_+}yfI4NacBZq?Rg19Ovqb{lJFrM%6R8#=BOl|g^Jw`qgCUQi`jk4DTF26LA&fl zW1z~wqo4txE-1ackNpZ-9=0qLSyRs$jj@Qo2xcO*GJ%51nvw10X=o25qL&eO31_|Q zQ{f%eGjj_c39Y)u*U=Sdf+$i{4Y(!m16A46-Q1x!&AiO>x<)w9`~{3OCXrUJ7qew< z2stuScNK#$Ksb4BqhW1GGFsy>}VM!i|(q7UQsI{(L$bXk{Y<1)&Y)_Nz|9ko7vD<5RfH()^;#p{uqb~-bvW{Oo0ttrsFc+~`uglD;Fo=i zkH$^T#E1b%etku_dpmm!$Mc_;8>C*XKG~<_e9z{Rk1(sICn1tjL$W7nz%#sHT7&i? zEX>H3%XE_(3NM|3cVr=VIAM^pBhkbCk_(Ct|5Zma4s-bPRYWL-#yKZN*; zJGY^`b<0?J??8f(BqsDdf_F$`+-jQ*iT9y$GN7Pe%wb8h99J*n2*a8hoVZGiUq|Wc zM|URL#XMZth3O*~2p zl3HAj2s?NRvdA@VP>yWD(q4JX!n`PLUWyd`aDoKH@V&UL+U)hw0SJ^_$U-z5hDRoL zArLzV@q6V=|D37Fs=X3zXITL@PoBu2yQQXSR|sj>NA^|0Tt@IJ9pekigh3HiBEe9- zvICq>o>%I6N>xn^ETO!xVhJ=HEo&UZ*E2N@S^#(HWS_J11%}Ze!VCKvexhY;7U=F^hg*! z)_kXQUy4j7&|Aujp7_%|xj^y?J+g8`dNa&dDkrvkKV)WcaXPXbOr$6J&jdmFb=*JK zkHi#^2jWM$b*_Ne4q*~w-%^Bvgz#$HfL9C|jl3r;YHnqJ9duNG1Zs%yvrl#H$My(O z_nqzYeWKtBZC+z(F;K=SHlkFM6)Z8Ff{S2e4N~RY*zA~A8RrFU#QK`(dU%w#0h)N) zC`5jZkI0RnbpIiipR^zJcGyhz_w`T#*?P zs;LQbgQ(IDi%Qrv1j7FWA*PtG6V1oO!2UfX8PkZ7W*Fy1MuCChiix!LMxW_`50%JB z405m+${#9&kt8JOc%`>tJ3PKC+Es{5nJpEnBhSO44b3@!JB59xqCp=hk*QSs9x9${ zqB-BD*o0_p@y_|S)h?^kED!uXWiRI5=s@deZH-SMqc%&7rfrYu5ko1K1Un#}_o8=% zmVA$c#|XVFm~ZSGI4C2n^D=3(m8wOzG*ShuEv?N1nX|H{IBgthF!DU#%vIiW9F&PDDtkovgk=N`to`uQqTJ{qbjmetmO- zAdR2VrZx&p7$!suDW4(sVp3iD0+2{7fiGH3 zkgnKP%SU{P@9}4 z4toUt^We?+mg>RNklIl!00>B_-6Y7?1)ouP1E{4`}23L|NXm2J2;S}fe51J%dWvE0K%pAWm zeOAFRHc2Nmni@Ff?E9M*-Yc>%-U~LsI~T*ir;8~~MF%qlAv9HD9+A}tehNWHXRwv^ z9j^7gHi(i1!zEMSyG6XbJtIc{1ngJ>QAC@CiouUM!LWlTQ?hP4D@y|Xt_ME5iplIJ zrT{Ut&And^BW*s@puPbdX}6#L8YK*rA!p%4&_mKRnTal1B2H^J3h~(8oi6H#V zmww0NpYhRtP&f84q6{uh4ne6}BS;V|YkC}KEEAEhrdi(>TW%Q7<3kj1R9+@&GjuTc zRGf5a4{zEn;C!HwY+qF|sUp4Aawecra0f&eru5r=cKg?{pH{{T*96ym`Vd`cTG(pC z5V+42xPA;coSDy1j75knI!vbhUefKvDR7zSxYm)ZIun~%o#`g%zK7hqb|Ns&%`R4vkD@$ z+e8Um{RFX(0CsYC{<|!4eBa9hvft_mMEwn%CT$arv zk%q9rz2X+pn=oZ0v$FG$gmYpuhC8&U(U)eSz`DW7WK31Ue(o;ee^)&A{Ei(5gR4(N z-W8N7lgqNWRy!cPWPo*480_Gb!F!j7$G+j#ctLbs=%|KU8OtW`d7Oqny!%=`=n8~M zz7w`9Gb9j;1;DV0?*v)2iwSKU3@}hD8S;%7kA2aI8`>_S>*e!- zW~Z}Br07CKG*IZtS_8Kj5r(VwesD!AvGw^ic#FnbA}g>N?4szRnNgb8V*o9SXqaBA00 zVYKWTycDrT!qQD3FKuLWxLrvy?rvekdxfHyV6VFx%-H#kcpL!P*Z5cZ)7TEYB^Q47 zM!)@4`b`6lcA?647Bu=q6-^A!t(ISPg*6yi{krJL>H0y(dg*NWaZ*Bl;YEmvA!D3H zjoykKgU{~>zdtzm3N}hZtTn9q+0nNkYp!vY$gtCya!?b;uroDTVXywPh`|#Z7|E{%NwOd2iEHkIQ(W7>!B{?7 zYxHeB4Z6r^R@p&)e--N44Nq|cyo2ue%~~2!qf`aT1))Q&&YP4_q(&h?y@D~9+3~dv zVj>M7ymNHMNXU#)*Q6Cp@i!Rik%MFTy2!;P-^y|ymzA@XH5q9m57r;CQn=l-s$wz@ zMElZMB9rY_$72A9F;82b+Ox#)Nd)eF#X`HtMM&%;ns0%>6b8q{|Aw}3a$Ns2P0xqf zVk8AF!9fjtn6E*veHP-PJ_O|R7bg*y^ zibkRZhYLm@qnV#2q=v9MacbK+&1cme|7Ucxh&(FVb&+>sOwgq_HX|%sV;~xmiHPJT zBdB5&Ebj;daTI+BkcX`wA~~o*B!oRrWJbb$F$UX7S-D+(vM)DmNZ(NQ5)^F7gi%EA zmu01sePLwn_=Cwa7;rUJ~PbEWB2r0g}SQ;@@6ce*dy{= z3yY!mpP?Hk#7%;Qb!}u^~lS@ffFeP7yDejd7Dbhf9A<3 zMqU;oyghKgelvlwvEo#DNYjrf1N-<&-B~v62llOjj;i}5?CK=Jzg_^w!UD4sRH3&c zVL(fT?AFR0`mqfAsPhHW?Lc7N^4n(!+VtFdkZ?^|+6&QMW?P;Kr|LKh04@|=O@Fhk z$zG-|>kEh-<%9xjcq<1$YPiUC!&rj-{ul)n{c+js0Ff1pmY2r!Ns4Ka?+mKVmP#aI z?6eYt(IQWmY>xm>0wHyMgQZL`csZ!jh~JzlO5&7~WT$37G~>yf$_O6wiip&^&j#~N z0APbugMtrXtB-?U+#3W_?^BrXgMA2SEDoF#GzVlPZnitD`+Q9Ui_dtF$0}KnvAV-H z-jx~n@F^&Ey1;1<+9PHMIT(n-G3Q1h#$!&CX~y@vf>KsP1PAw`I|ymoL{GV&vgGj= ziavXJVv=VbK}XJi8$kC74^;#mcPv=3NK?i%Q>80iAL`?NqzhzXSQ6PZuR|l=uWBU> z)Nz|_NmT;b&;=fXbLTHjOtC^6ZXr9Hq{gtEWJVuIAX$w&i>g;QCJWo|caM0>4Oja# z7a>2)GQu-oO7d4d6QgD52Q&Q2dts>p9Rm#Zw&Bo=|fm3IebkeiK=RlKSwbQ#F z9>wk|FM$z~m~|)|7dJD^->1bLGbHRt1v3kShMqoa4ByryX}_sz&nTaYOAvPfnWi_B zcDK`B){6y8x}4IRcfREjolptfsQzUwmh<F@*uU)P(A40oiaJk?#3? zyHzqY9&^?4Og8lA<=Ey&q7%w+j^*hg^zA4qkz1v(QwP~TL^hwIqQriuKy!vxdmysb z`tW^*30rS0Q{)j52;G7_JtVdgxzIb${7|D?BkYjG0_{enINLy7ECnuF*%Eu=w?(5p zb7~Dr;~w)C1)@+J@CYR-@1KqG6%>q|QS<)8k+oe?!JK!{r)g<;33()ch z4U=OSt!tr2`0!g0*nu{B#`%DY2D{XWQ-!M;Em~^a(Vj7-2y`i=HEnpG2zuhUqfTD= zGa7-Q&|wef;knZB+c-kvif;H=439-~CyDtRVX`~6D>^}YzUu2qC9QIeE8Nj-8Zw#L zfz|ejS}#55izI`en9G;L3aMZ0Z-%hlBVR}1PS1z!QO()6+_D4sFMF^K_JL~X`g|ob zTB#aO$fexBQ^}&6(z92%RgRb$bs0p0^Nwr!6s&H~0hG=ZIMuT4C!^m$qCyrQ+PkY8j#IM znDR{_F2p-OsFg(+?H2yVg=-WT7TpU#5uTe@CXN%Zau!0+5As9`hD@BC@qyu#QVcix z4iMs?CW3gV|2j2SEU{6%4KttuAjSQ*l%n>r(+`_6BPD@3sb}0mjpz>r5GgWthLTWd zu!0-dFnC}#@O?{*1R#wL9QB}@zLlQi>DQN*4i?8TcG;O9(Dc%S z#+{#Y``G7v{Omk~hnpy9g;uoGU!#2TvN%BT?}m7 z!688Mxd#i_YbHuyMPLm3ruSR*QU}w9AOsJ5fL#$s1gor{1B)o6lbNHli`c7)defuQ^W(>5Mx-(Oc@u28eKhzxmt|JI&?b* zhqmDne%ZVj+~2r!*bsw=L(Bv}asJ|Cpy=a_lsf$8Fy zXBlTH@>96Laukk?kx^A=v0WXg2j!|LlgHwZ=oPdLt8>u|aCscyT0(KJtZP3`uU+Q} zYjKLVC{P|*GVUa(L76UpF=*i?jV?#hCr8lO=V?JVagncsm6HOlxFG!BZNu^sT$P`z z%l^WHFGNF+x7O>`so`1K+yi|XVt`gLh9K=zPI5re2Gc(hpCx<(%0`=XHTmKw?U`LFQK5F8C`1LFQnN!_D-; zMw;~T@*P)I+RjWPwbdE<)%Nw?Z?!HI`W6m<^ z+z;Obv5gn*j8R2QNFNM9o;J-9u)*-|^-#udK9PnLt=+k{qG3TD!#xD7PVZZhWs9uk+85OC4ZC<~=6~=#GcHU9-J9p;~C&A2IUxzkaj&3qYIHxgq5gw~F;yAt&346sN5h z7vxqZs_F4z`5ud^Lg95_=ux!oW|^t6=^2#IJhE5}9@jf%%w^)y$<5(ZOL?UlfWbHT zoIRlYR0{Oz$;F5kDeWi`>I;qV`wUnX_NS6H@jRWHvgm;9Sa7DVnvu>Ng*ECd>_Hd8 z|2DIoxum4}?U~Dnr&dg$t^>b8hZge*d%i16`V#5$E<1f8noE6W`Enl;(Te z5fDit3_6bPv>F-P>h1OAB>Gd zLgFhZ%40g985H{~TpGrS%$-y=CkQJ&YGMSqth}`FK<5)#IkrC_|9&!P-=P}tX<3h) zAO$@HN1I419kGV=*Rn9OP?Sf=4aYsq=U6dJh?0WiC2ja!*6U#m$7WC7grFHv&^>z? z14s^%L7o#I8|nPCzP?u78mMfYODM)u$+kIC#F1g8^i?B@4`K{2=<5{2>)+hH3hv1sO&y(f7?QuAh`t)X+R#N{utCqZRyHzEcUkz=HelxBbq z9)-Pu6o0Y1U76eZroWQP%&JsC`G~rY4`FgxbcOeV;XT5Ao|&6t7kk@U+so9ot*y)V zy~-~;$57tYjn2%SYm?lP=e-c$oSzSUpD#Vz6W3fcc=(5x=PgyH&hBmvt(k4@>8qtn z=$@>{o5{DUz^{9IA8XsX&(z_s&28SP+kyRcpLR_y>KfkzP&!+i-fbG6k5@gOZLRLy zojdf3p2Dp+VNcFZPqnEVz|ot?mj@J5&h#zhRpbxjyW6|t2SI@CO|LxRo^@ZEnjP6I zuYTz1A8${#-d-{Qv#VjU05=(5EiGLgZy(t@sVh#6z4zmO9hy_4$JN2r+u>EAV99uJt50W;oDK7J_p7B)Mxyi;^|XuY$g zZV4^zKcD6`uRXqb!qb=M6FReWklSlps-C>PAKv!kZf%)6Gia`T^GDNLI4bS!XpHY? z0uhsf0|yhTG?7DXV4%~!;ND(6JwT+_$3JiBGfmbUAsf&^ z`oZ)ipHN=}NF%C*^;jQg$6x!vHNuc5e-%0}Z!4aO2En)3;x5nEU}5f}e$*Ja0RU

    {LcKYDT)q6dfi@A{3iZ<>mpOIn3fPw~yE%b=Yk}YiMOCb3kySTb^=GafGt#fNRiW6l?@UU9z)B0cRtL)C z7HJFnp#!U^N#d@Yjj@-iY)FxjV{ZBE-w`u|HPD!Bp`GKM4NM&V^o!QvLNx~Zh))wY z2pkre=eL!!qQ)R3Y~hpyd(8Wsx)+TU--sRUzzB5%;;SHl-!B&kSxu>H0Mm$ z4;tu(6EIS^Kn1SKVra4CNwL#98f6E!V73}(+tRUz;^fvs7XRblaEGXkx(9>hq z^}bN5`}CIH4LJB?-7+!MTw%ZD-RRoL#dN7=s&*!dEhU8vldF`nEi>zefOM>$jso8etL;2bJ&rS1tLv+9M z4^j^sPupR^!*^Z@c9HF=o5-Co6}u()cQET`R?A-Lb~HN#%@7BaIWGrROJ)w92P^t0 zBEl?Yk9IS^M?c$H9UE;5w|1#iaWL=sG>aL6Z9_M#cXL`^zvbJmDT>Ox3rkBEM0+U= z9Tse@Cs_`@irYB+3k8gQ;@2YiA(27{T=MkbM8^X3g;u)}n)*<2TcFTonU~#jZf4C! zbFbIS*2BZYu;G&K;`D)Q&-Ov5E@T0w#mgV(#2MCp6hy=vY=BhT*oQx!AnzF+1FPg- z)WjS4PQh@g78Ba%VHWAm=^~mXI#X}8)kb_`3z)_V-!W9V5gYytm@NnW(TrEj*{hM` zEbEQ$vRf}Jy;Bk3LFA3;nB|SGFKnv0c*m-`imJynx)s}{SI*8Drx9@ZL9J&lm8ul@L0&;AtRFc0(OGm&drU#NJRt;K)gY(5 zs<|y3@MHry5N;ZtjV6-BMlFSZ9yK#*bOA-w-A13QD_(YZ==NU?zhZ!a7ai;RWyTB$ zJJgnar3Chh0;Yyb%9;Ma2Wbst!yMKFPkc9A|{J?d-%I#$J|xUj-wIF#=5` zN;2P*GQ{E?cNh*yyq=DR#wp=3#(1r>ztt3_nY{*gEctidomuZIJe+7z)(@f^NkhDg zRcmt4Mhyvh@H28+q4!E%{rn-_LJBvUkt1AQ95dqhs$0?7xH7t>b9D(2$HXGcYi|+5 z=O@?XXg`R_pgw0tDA%2y8}=5G#5h}1CE~L52jtnlqEhvXqe2N_Dc$!hLv~R2A=VAd z=h$=%eAl-b6F{8K-5h=}`N^pJ?C{!5M$fd-oIm>H{YTjkz-^i;NB6(=`~RuzZ-t9i z`444(_g{Oj!2hpJ#@g6P-$>s{|F2=!*5+UO{_`|8qkr`M|E&K--|ws_ZM(<^)BU2F z){P?6xMA(70VxzrzAmXbCyZYYF>TT{UWP1-;h7aS zf{C4s2z#+g=3Vm>KwXiT&$QiIqWsQB=XYXg2ai#!wsz0?LPESfXP3YWIGd<4J1O9Cl*6VQ(&5X#x!KuMHN%Qf(A;S*t$z(W^NmSmn$Mv6&vz7I3?*(h=Z+PRw#~9?YAy42 zp$p;EDNo3S3=b4;}_D_#i&F<#pMkKP^3+{eOPkMjlB-L#` zl(>Tmk?6u!yt!T1;@RT6m(E2=G>1VTF_$to6ir)IJp(3!0Sn&IlqmZHSv^;A@2$mk1!b%tWQiGiubj0WK)+0HD#&K&9Si=TFH$xC-wIN zB?+64=MR^+-N3$5m7cn+^Q=KiDY)-9&_C$zzCoc={WYch1L%LEoA-a&tZqO60QmoZ z(KU8+GPZFvx3&2Xv-wx$|F&BFv;G%yy_Lpg2LENX3Q@)(E=4iE3oY%#c)`)ih~LZS^}TtPg@DuZFNmj8$si zJZj@k8^U@G6292CqW*lVbU1uC?BZ&KsmQG!UM!g8Vp+WR^L9=aaAPvO+w;#wR4W=d z*Ym60g$qyGR`p)HjvALg*T_E7ZwFb_sUm_KTfy$o0Vr%!h%Rl%U3@H=e?IUl^A`1w zr<%Oag_8$5hC5k!XeOSJw!j1w4#a#TO(WXF@M5^0EtmG<`Y`z$)<(}|OV(F^R$-HY zf3i@&+({QD?sZTLZOZX0d~r27s?j3q_Hk3v$biyKC}U|rI7__yugOXu&~-QcrH@5w zHG9Ab2fU5ZBdbGaFDX#_rsR*~NdeJ8b&& z&b1M-r;%w$#c6%(?nU-hoLnfECNT?kIFulN1DRL?T) z(9>O;7AQIk>z0`;K(H995$YGc+^^1RpyAYaXrEBdA8fCB(SkJfrf|lN2>q+LIbI7D zDB+`uSSeN@q#|94+}&Nh?m-kLXlw_=RVA!iHS5%nMSE{xA6ZiGET)3Dy(Ee)dJLt0Dax6IXs0}O?XMd$a^q`3p+bYD{F=cU|t8-M2N3>5-ZXv_F^*l zFgf_G0t6!aEIQ?Sg6lBi)${|OZxd(phOc6nez_|z zuBP3E=Y4k#Y;+4kWEanoQh(?zW3%KHE$$e&~-W(yl6B+9*g9BEi!6{f$!Nc~Vo ziU2(zRmRFaN|oKLKmKMXyVvk8z|@f+e1K)2B8$e6L@j;XH#y)a9b=Eu=)uzu``!o2 z9=rRFVt@5S}4|a=h00XI9L+HCFwL|x2Bf1jdbOl z$)SLiL$oa%0uPgEQrSQvnN>-$B5xF$ydQzi@K-F~WIG+13dg2Xb{B49jTS={%vIJ> z-{o<>ZQiHuxB+n~{~rL}Q)|+?=bZt?cI?)IVb9fArAV&+%nSz_hCr)6_k59PbVIi? zgsj(E^3!suv-}P^S1i|HUZPX1JVX)NMM$`z zCrG1Y&#gXC=q{ zB=L@)52W1ellfEoO+l-A>p}L$?w&ZYpy_qr^uYvuzXG2ehWW|zokm3n_UYV{&HZH} z!%_-7b5aISt466xBxcZsNt>D?WRbe=hu49mA z3QA(5XO9^lHDi3;g>Jnud9HDF8H9$02KrCEdSCGEgOO&X27~$6#V96K2BaDqu>x&m z-!YPS4qmD?pC^l7J3rLJ(*Qa?9Pghu4Ga};xgapQG=sS!MAR|rgBTrAEH00av|;Iq zx^vN%4Wq@0G!E3)K(&?%d%>S=bIePa2U&=N_;id-GV3E`=ktL9vZWn`R*tyXoS_M7 zk}A;TP>Wu<51Mi^5HVgO!K4^yBUDB>F}H>4Vf$>g$|NPw_?sSRM^F9)yc@NZWJ44+#bvY0S`9AJ}15lk1aj@d4MN3T{8=A;KeBl zZKOka+D6;e&Z5?kTfN=Q8Q$dj&$$U%hqZXFPaDiKua0WcI5SGt1AXR_6&-B zk*bWf?IEkjCo)!1Z`Msa9tWNe=1DF@(I;XCE>7>S*vJc4JRkO#a}?bL#f`YOGw6M5 z9Dwi|R;ecb7NP}N%i(p%-kxttzD|53s^0lWc>C8D5l1F+jeX8Gic^awF@K;fn2N$x zlzxdnYV*}-Ss|fRpPK2 zI0h{r<=W>iCndjA>xx}Lk~M6D&uz<~oJ)tFb}Mdr=!$s70m#gspSE`+1>CP%sS;N- zn>RY!7wv4L36PecM~}upDNSO}nLJ0BNnN9UiCm>SFuj$Tf3+u5Jpo;y(W6@`D*}Fj zQX9P>g~AP-e1`EfSyW$s|CsZh&usvML$_^%U<-`bUn?mKDi6Z(Kp3`iRPs6lrQl_3 zG_Prp_PGa*>yw_4(E4}I-ZKl2fO4M5H{t5z+z?9awGM^Unnt?I-;}eZ+ZNxi!Eo&% zUlJ|v0b^;Z>R&YeY&D8xBV!^>se*f+uXssinX2D(S4reagn+~tSkK7!F!p6e170WrRSml4dyfu zZM~GW*NE%~X34Coui;1}!Bh*LB0orb+kH9CX_MO$7LPM*4c> zcwFk0QIlzT+Nrbkq0v^hT|+kCOrR!+whpt;T+tax39)PO@xu=W$vI{85hr}#L;w3J zBczAua&^i!K3e*cwz!(LWD|on$K{KZP%00LQmAsyI=LMu`*C1ke)utR`OpTdTN%3VJ{ta{FR%y)wkXB=Y31c?oYO;(dOSuZEW zHP|4aAe&jj+f@Cu80?LTQlus{C*Rpc_>kyed3dB92)BICG~hqEa)mfOnUIoSglRr_ z!ClDUO@x6#muC`-zY?-!XLz*I?!xfS?JjO|&s5DPqtm^;^?l! zY7eQT?y7?B=HzuvWr9(dej0{FJo7@-pKjo^Xo7KxCs3q z1FRWyy@VFxqT#*Qsntc}&o$KIR?s`XR>y3B73dw8V2!jHM(>6rp7|)x%?s>Eg?0G~ z(P-=2qQ0VDP(OXwTIeA(TXl%--DzP zCQz7kP_ZTi$_~7e3qMml!K=-nt!?Ly$fbQqt2{IY4ewpQ&sGkI!k~uf%Hi-Q>08%q zL*X2w1Cbb1Hv4ep{YCsImQ4}5YUKN@Y#?HTvlSlf9T#?STx$TgmLQiO zA-cvaSVWx;yHQc;iEn_cQbClVI@m0;%UA! zKBC)#MK&zFuf#!eUq7s*sCS${6Mw(__bC+rwo&_=USsKK=wNL8e|r7@rcJ9>>bE%f z%jgG{5QR_(K2$LG;w1_5;e3vS?BxDL%w^a_Li`~u$?J|QaeMtCvo@NA81Xb$cY6G` z84E^8)KXVVCE=t6Nwl!&qtVLgSzizz(R;Yt3Y9gixjO>^E=6j*;cgM|WT>m)#fnNL z|Fxo&bAupxKQ&|56}g^`EmUs}vn{*|qhX($pidT~!tQQDM8k5Fh6_a>esG2E4LfQD z$?RRh$^_-dHj@I}7f=2wD{N)8zuFqs(kUP-CdA;O2+XfnOMZgf;I}k_S1$*Tvg&z^ zVc&&En-;- z-4l`2!6EmPm;n#OLuB9N>uflzDCqY(+olN<>1^V~^1t@*V|l%H0=$%%>SqKt`hD?k zIJB`0cu>cPFG+8y0%2=6#cTEpADY=9!21&Z=tjRF3{vyBcG#l5Xfx~jMm$B^qlY*S zrJ;vgPtC76dBsVbVcHQ6$ChYTTmE z+BWN7f5j4oBv8os=MFPRG328(!6ikM`k}Pp=oOtc(sRnaURQc*45=1n8)1$9n3IEP zPeV^-OQ>~nkts@8Ai`i)yPw<7NF-n^y^la85wgGLSrI2F9Y@feVuaUJeSmkw982!{ zZcxA2=~4@WBB;XcWu6iP4)>bL1j;BMFNrG&yGqs+_97=VfpIVp0F?w8ZH-vA2F(SJ17b>7c;+VSt=^&Z&5ZD#*=Epm<~U z->E^dS2_G%Mc!&RSIs`01d1?Io;7s0;t15GAyA*R-=lSn>6~Dtc>f~>7`w#JH49oa zHdM(J+9MmGLy<()RXz;O1+=jSRA<`-tXDQ$C%#Vsd=}z5=FQVs6n(0kM+w<16tZ4Et&G_#U8vJ+u!F>oHDHzT-%x1b@XK|e2spkBJlS6*)r4m zb#*w5rB`7%YXNYON_JVFROJIGF7i1DQbL?5yrigbsk-c?PzEbebfnfwU1m90wz(Bb zuWP^{v(Va{3{7D*s*@*4T<0TCbLPxs1H;)a4DN2C$>O;4W#83bXqT@cgM<%Sp2Q{>wBtL=8`0qWa&T>OUm^d&Z^F0021t-_L$q z7h?w(b7R;4!Q^X8P1AOR6~$+^R?|hYzDt~WnF-Q&FMmV|6m!|)6lr8GHn!tR8yiZedLqrH6 z3mn5VfN@NWO&PK8mS2~CT`##Mvbu^waY&%6C<{& zFy4ZKRbi@Sl)S-m*e!qW5VdQ7?RL`)G7UtYnBX#V=eC6WLzWTfktRN(j9owsO2M+t zAG4vY9RaS)v}bn4=Cq`y{$a@p`)H~8?J-oJ8??hT=xNsJy8u1nlU}g?D4+^g_N6#* zn~X5HplmfgQDOhpFE1p@{&eXk=x@z|K{JiNDmh6WWb_S$Rvlv`zgj3TV;P-ZQaU)1 zL+tZIpveE(YG3uHyz_M{3xictPY+RD3yl=N>KAf+;{`vHE}x0UrBc zY%9&uxeyH|O$f+ynPeLYvFhhVvlnHUw{b1RPP2h|)GVhcK?IJ=5e4NoF?7Brt8Jr2 z4lvMeeIQJKih#|`%rJy3wfBrFOX9)=ZQ!@PD_P!+vD>}Wp5F*;$fzG;h)AaFKor44 z(Xg!dmZTO{ARwR&^{%JfB(>L7uU{*#RmK2#u>-K+gv5eQ^9f3RZqukXp~Og2MSwJ5 z+UbXfQtay(@geHptwA`+bq<^^-@EqyT%=8Zrr{EtPL`ebW%|=LqJnoYO)K15{G+v9 z@_LzeXFx#+$70Q(S+Ej`$|UQG_bDlR$rncXhUoGp7f`Re%_7~$Gd#VK}n*n^K7R8SC$P(l!t zVT%slpDuVqUA+T6kWYF8Ms(~P*evl~Uo4xfijx6S;wrMdV{^{A{ZZ8u6pu@#1R`(A zIqa-I4?Mi({*RvLtXtnwIBNc?UnQL?i16=gz}{i2&z}xs3@Cc~fnUBTyeZ&=__Xl+ zsX1vQep$JRhJrL_!Y9L=OrBiB5V0Lc297zxj<;@ZqF~&LA6)jR7_Exf&-|oIg5_Qu zU$}pAeRv+YGnxpX&ru-ZZGZ_MEs!~REcyc{Jf|x0nTrPK$rCv|yP_=c#TvBd@E#LQ zCtfAy(arIe1Uuz{cFqH`V1P${Yy}XSA+YvqoncQiU*F(f*Lcu(LqwTc9JS10Qp<(~to< zQ%1#FBTn2JrKV{9iEygi#Qxy3G~<}n^2|h012%F+ z*OEaM^hBlU#IL14Crv1cZqjkq^jz4Kr6WjRTX-~cM}ygG_net-KfKRrm7WEGpN7Ar z&DBM3n%A&5=s$k9*osJVn$pGWm3uw?Hve8f<9aa{;iE71RB<`cP%x)5IO%4l2BP=y zTgIu96YBlqc6TlzuiJII*h~3(rE{npYiLM!xQuJwWE0+%dU^K){BID_KsX5f_y$>j zL(P8#p}*DV|GJ&>$Nzf}`d_xv|1CTJx9@+cz5MgYM}hlqr4!$E9}`zn^i}A5jb^^ZbH?WgDm?dkyumovpQ*TAyzt4lM&{!@r>N0nwGS&H?#>jcYT2_L1th# zcOIVcp}+hV)Cluq#HJ&?8&lR)QBvQ`A66WAx+3(&Z3}M9@xeK2OSa62?s@yFB#BKJ zGUBsKclP8zPU8@ui*+l2+c>0;X_P|0{d>{e~9M9QH=CV zJ7I~pp61_hoK%RqwFYxc3(J&M)P?@F*W+=0Z50g|JKbp0cLRxhe5$ zh}P@p1G&|xBX|9o@Y__xIS@xqOcu2aJe(jG=d(&#O+~m}$|^cyX^etzVzFa1GHHKT z9C`2FgU<_`j5frcDc$nMwNH_@7<#B_P@g}AHXHnIZKb}EQ@7Qg)zo*x6A@uew49y( z6#_7kiM59E2+P%Y*m!poJ40bdD@In5LuyAwLmY_?eLf5l%4)2&5Mr+vyyNdqXOhu^ zUK5}sA)RK9_AtLwvO2&vq%v$4lA?w!S^EdhaHWrpy)3q>qk(MI*;!7bBf3uPkWOZw zY8$e+zM=mM9L_wL1l?w`UdPbn!Gh_enCxey#pKuXMw{pSA2qA`E-$W>c3JK9scI_( z1U{9l?rILK^~my*jq%qD8;0_qOw`@W2R{1*goHo{$mD`XelR>$FrNlTdt^fxd%o7G_!U&6w+IN`vtD86>JZBZ?iu-$ro#^VyWQj8GU$kL{~-BVvlMSse$L<0tiO76Mn9q~AvJDj z(MdqDsp{5mxadZ*Xi*u%2F*15p><^>JbB$S1v?C$^%Zc=SPZJ__ac2b&1azAC=h-+`wU_TX6Mb=y?8?L2h;}Yh+S5^|%nh|eX&sLBz;f>+<|APh(yPJ5QsRA6M2*m=iUIW45gD2hF?$Nd}R=Sip4= zGjKc=cD~P}VB$v*5LiI7L6}6jt&!!!>i}{bz12;k(6{Akf?bWzFnhVB<(OSad=bnMA?8}2G0ZxcrLBD)?C@Dztp*0$ztaaju{S9s9 zwIO~121~I=G1RNz__j6jQxghqUj0fEc70se0-GNqGakDfSa4!G9lXM&175puGBn=g z`8?T(T8N#}^rM8oTx`Yp;BAd(QQgH|mp&VnJ_F-OFEM-|Ai(3KGLHq$Nq>FPg$ z=5z{0HX=5oxy`}6YlsDz2N&E#bAx#c=Z?{i}0f(Bb8byz&0IUj7l*E6%|8bz0cU5s*2eBU?ATM6%Bjl5{Ek;aI?WX+wr7o`3xZ!8 z^-v%zaKEi0Mg7Q&vd&o~wMw&}l3aeMG_I@}d2lJRS--U3U^#9C_XfAUU~>VbH2n!3 z`p{ysHwPVwdR}9916E$EGF7%65L2|hmoi^a`Fx})-;yq2v9twWqc~hbhf!98eOn>L zvHf*JaaCq>Ri#(7_Q%L9Rjmx@G_Bi|a2!<0vNL|MDIx!M59rAMM4nn;-0uGKG8axQ z|Fm!D`Db94%2J~2aT)LiW#*|V=B}G5Y`wcZ;Y@$|+BCGZwjQl4Zj}y2teXH%+cz~E6Qlqak64xk7NF3kLTMLWIS-JA=>n- zL9-0Lg!tR^`b>phEKI$2P+bZw9NM-3zUL~O8BF-lyKw==3N`k0#|EZ4bhs4@qH0_C z&YqDIgeY3D1@+aB&P*3v**8A-m9%4tDs`{JLKpg72bxvWksiKk1!z^SoU+&?VF0G< z*w?3Q1orNGNkIEXQAHljabiqDsY9uf`)F(tf|)>2YH}k%1y2R7klL=F^AsV-3AmYH z`jqIX zqEo(6m`!u}(dGS*`ow5Y!+pv(5BK*V{Es8@KX>SSejgsL|95!!zx8bDyOnJiv($8;6*U-fkG|in=Kcd*kyaEU8^R1x$2=i zS0>x3_;4Qbkns4R-QCh9XyidqcQI)DP&90$q2rKFg4PYvl5JP%Du>WFUnXlq*&8$! zNzfNUQ)dqM$bxQmKe=*eYE-T?9f3O-DHgS-YIzqp|_qAV@i6az{K8vg`L^s6C zltx9@<9+c6DhYqa9t0h#*EUG(g%$cn^_ny@7NJK>M|1ZX3a-^+xQ))dVX#wYlY{&Y z4nSAo+B)`JmERQ8ZLhBe1sn%BA%34tjebSLqL-udu zqHPX1wzw`Z3-1|Sc#Wd?AyDms8NNdj9hiMl^L__xa4Szfm92RI=MU>%01QJI8t5A$P{KJQpgOH_f5(WH z1jZF7g;j~d2cE4J7gLZ3Uf2tkrc#_{DAgKzO{%mrNi;JLbn)oC8Q-7zd0LPHkT9X( zC?vjCuPj(AorkE!<|V3DZ_bk8A!@up+bY+k;(jY_?l#lHtsPbwUDN`qE1QM)@v^PY zov<-;b|x~fGHoYsrTmPOmJkIN-bS`Dn&-SAeR=K~v$Axvw>0wHa>BIWdkn*v0sEy5 zgFmzvOoqT5&DjTYc$c=~#Nw^R(v#e?jCtsG%aF?RHaB9h5~vuyyH#V#i3yh&w<44# zB1*TM9TBm7mCKKiHTS@FZK3?VTw3D9ofu_eTA*=htobe;jE>N>ilJ4H| zko;cUHWZFT*5HrW!=^a32&)AefdRfVcy})v(fMu|PxBG-Sh&NP;IMGTsfDpX(Zo`l z7;ErJnMYEk{3}&2E9=_8!Go`RhfL2B$t`nW{!q}P+}Kg)6`#DxWi0r{V5hQOqsSSA zOIU(G6@haW4Rlsi8)gLUHCEkUd^{95yFj6lFq6Z<$|Zg`BtzE_xM5x|^|+wV(%dEm zH-d)Jz?3U(qyWg0I2mrSvGEKJ%rdZ{Zp7M16|fOm2fPmVSPZ<66>4MUn(eg$V2!dl zU9bCdl)-_YAsNplE>L~@N#^|g_i zq#|>|&?@_qb+W-F4Hv=<*o_it()rSx5o2sG8XXP*3`pzVy>=0k0kBuaw0$C}dl~Qf z`o&^mQ7su2Z<8146X7=G)}KyX<`3n}#REgqrqH%y>QUiJE;TDDqI+jWYwg&|7E#=9 zdui|FJgc1<-YOrFpYGt!L--#!pmy#IU!x_MU~b7|OEfF7U2c!qR_P#!O6fm^bs*!K zEsg_UxQGCyN~#bda=C-ebh5PT5hsu2fy~V~|)#@uw~D6o&a(aQq>xS!Fq743K1T z({4cFN}r$X=>h`*S5NQ7P37KwCC@t^jVqF^m*ju|2{|J3?R^}P8L3Dx^ufHr*){|^HOMoaYDTS;bMj?U;qas(xbL|d% zU#xiRrTaGPqvqYPPOtJNbpx@19u66s-H%~Vsk&67$$01{BM@(ZlqT9Dj?rP*hE(B{ z&x6Lss39m~6ywv0MenEXQS&JuVhel^3r#6i3UP8FG&N+d6voyQTSqgkpCiuH$!ZxM zuuvVwK_9%*##58qZ#_jrh*&&o>EalliT+uUXNIL2ScBeRk@$%wUipaNR@*f{I5BTD zx&n5rr+?DaxNIwoQmq5(BnrZoHBZoH;U45S@ZZF62~GC`ju-D`kRc zU&RA_RjyD??ax(_@TRL2#m_BVubPGx%d$jzGY@bWzc?5y>q^#l+~Tcb6}>n4 z1=Fhz1eC&Ans@VkQ3w&%NTbDH)w~BeL1<#rO?qCKJd%Xca_jd9zpo?&>jWM=46!@{ zxq#on;JjH!MTTlNZzMya60h{kdltg1CO*b#eYxdRHW>!ow%RPfN5l{>`qpv(peq(F zugTQlIi%;u5)twSzb2PNXX6iiBD$0N8g6}|cJJHc!C3ovMt;3NF$WQS;JgYALipc{ z-T1(4L1y27fPFE0oJ!F_>VZ-cWdK#G0&d1J`#5AA{Up+}>|esL=ET*if+O49mi1w9 zNk1VaJ&wE;5yl~0HQ#Y>(3>(rcG08PvUOj_Wvh?&=tCSQwr&cswb<#CG($bJM)ed2 zragDL{mM9R(&|ilxjOv7E&tk)4w`&F56w348WE3pCdY+t#m&azTY$ShmkHi4!qe?U-# z&-pZB^zGHQO{rM8{CeY8AfaQY%Q&%`ACX~1EwNI=U0n@#hwbd40rpOTvM`M*x0iKO zmlg%{n>_dIE#L(yD9%UwQHH_3*ZEVzaxR@)-o@?Co2+maQW$c$rviJv(W(Brh>F>e zrWdWq$y}zK181&b7EI&(^!xJwH|z_om+5!nUbywG-7gLPk)J*901-lhrTodQcQfl5 zW8g*hzP%K5YkWP-hWegvhhGu(Cp&7v3|*J?sL-vVzKe7jofags6!=t_{!G9`X7Hyn zD7!u~d-*E3UBg%Yo%vq%&tM*GYseAmjMo5qAf6=Nu_XK53LbzaVKajU&YCM^DSa2c3eExU_#;ri}Jp zTbzELzDrfnkCYHIBZTXfQj_SO0Ed7WD#0EW zLkh_$(HHJVRR}C)Az4n4_@GpoQuCbD#LhGTPc<$1FPL}6I>%DjH1jyq1Nt2iTp0*< z4I3P8q)YTcyT7=lvA5^c@9xGP`PR%~Rr0{AKzyr0{h=Um z289_&uWi%l(9P{Ulr}{4BXx||lZ-O_=B^2Ni?$NF_V*r!)ytRX$N*Y#F8%QN4Cn(Z z3Ah3yKXyYv6kb6JxLTN<8ht85x6PHyLpE1zYKQ}68%5Q|@bY)0qe)e>eCX-;rXWEi z2V)3eEdV3!4T23(63D|GBIYV^g#eUsf=B9I>dkl7=?A!EF0LbUk@~b2T%5fY+uJ|T zzczJrygW+2R0yJ1N<2%x3}(BET7QZrwLRvvuZhGlJ8$wiT35##eno_bO}*hwMa-&b z0a1)z(ZG|N?p0!8Zeni~P1lA;dQjCH>8#L_j$7I3Kf48|O987PdWYRkv~b>^8JDGe zonCLwXQq&|(l?koTrm%h5RX)V&FVNKo?se7Qp34B8Mysud|ABkSB2t)vU{4wi{>Bv zV?b8={9*rO=ZVy5KlD6f%1im@eE9|acijPw&8SXDqAhb|OXPjZNi5x6&v3Q$lmC=R z#@T_NTg}%G#uuz>$0r-r>#ZbV@qpi*ky&JbI6~clZ({kdt1#LI!;_NSBwQrrmY32_ z^#R)h_{SO&*H6=tK(leY=YVOlE;qc0=Jk97cVju!1!s+*I z1R?%%2Ko`0X;8iOk=gCsJPQ+0Xy{ z^zBenLVu4c5R9k?bboopUyw`={aOz8??w~hA$pl@EywY{Q-Si~h#=ChzpM5u!SAl; zF92f@n92##j6RrEyIK~6D4TPSLZiiI-vUd??Ofd7b$wLUIqE&`|v0 z+7_L!`Ha$$_U=P8 zXdN#ZCE$HE4dE${q61f%>jc|kp94T~&JIRd=u2Lk5Ta58+|&Bl>r(26g$b22?Xx5@ z_ADLZn2wgHiZP~|UDeeTPu?>aMwg#{G472_5WE{SpDO?Ub6JRAH>G=t$Lr+KUl|D7(9WBd_os2KflW z1jAGCajMbvlt(SUrc=-`)f9!Pjj#-Ke2T2XUQcQ>HT#S#eVvm8(cVi~bvNvONs#(; z&r*oV8B4n1qy!eDuk1~n-o+{L5ois;AhnPGE9RediV2lvSjM-}x^-HK`FQG2i+4V zZC=ssOCI->*FWtYV#+BAKtrdJ?Qds=u46opIkz#Lw>`pu;ackmM=5n`1prBTxyi;^ z`9Vf*mr7twOBC5>lr~v?k|V&C1qERU2)AI%4qtzvV-q}(|%sPGy6cfrD`28Z>;z0lF z`iQ8x2l0(&ZAR324`=Dz{#}|3K?J21Ja%4LEJI2mFzPHg2fd#JG6Ra=uk~VtkNp81 z@|VTR1*!UedyIvUv5+1ZiHI99R9Fzn&;8@tKyN`GPs>=utQ(90l72Z{voOl|*lyW3 ztrU#s?F3M3igQxe5qi=@Y6|wCUS+wINe{iU1xX*5)E8L!tbr9ppO9`UQy;&_CSAHQ z%#0UI!7J0{?2G|>%~s%YX@#JY6`mNVU|cDGj#z!bqTCAznb5A0MbE<`ZxAVxt?+a8 z{g@&F=`=dR-#7xn0DgOl&v$c?`DxoMyEl}tpB_xr2Ff?IlK6xHzBm~uHDyiej-yGIsKs2psAXeWqbM6OfoG~_N6G#Ns%9C%yhG))5r%w!s>vgcZ=`Jwe6cL`MBNCeVK})s$2Ayc zeua3mSC*=PFe(8lLuAu_LWR=SXo3d>O$VFFGRq{UjR-3@FkPOh=Q}-sP#2{Go-S;T z2mflhAuhyb{t<3P%WQrHyJfBnSW(1nUcwC%@E2A^AkM%j>BIzRcI3gRn4sPqR z)GWP|J5s&WGNJ%VvZN#$Cb^s&AZ`~r1r%n_83idLc)#ItT>R^lO#K=)c){joBJp`~ zIcCu+l4Q;ZZ;D&o@m2gf&ai1N$jZIOf?hxRjh7s7e$q=p`3x$*Dj9zp6FD5Kml+`N&gOt;g^iug zY=%A<0o30{(bS~wVL29c%kXvNLER(}N<%1!I!DAP6p+3*5CbD%v?F!y^=e|nGx_-- zgc?=^dJ1m6*#TsyI2iWr_rQ~2&TPMO3dE4BMf_zp>l4h++`C~R z=S0wmW~l;RiAyOaau(GLrDA-)boN*u!ypjzq=5ZwgrL|F=3<;kSh!Q0Mtq{>{6ECr zH4zj9n1PxYOy(@{qLoi-i(JvEdgkE`STUE1S&b7C}e-@ChM`d3E?!?;yfIgcFei8e!Z#2kfnSOO2*zOt%^In+m{ql|AQ+ zg*oO|jke}L=PJz%r|Xdu>@>J{B~?l2^l8d+BnqlRG~nBp56lcExTXtz{BL-CMZ;=qy^#!(eZPZ}wD zYeP#K|B_cLeTx`E3<0ul7ToBw!9;70Y6KS8=VK>S6_10`u#uPgB^1-GP-`gTcMADi1xEo4rJ=C{$C8k^{^ADD1%6~9_Ox7Z}X{Xpt$ zSy#S#f12zd@Q8L|IG@@EJs5|$!W^V#s34C0sGiJ)Z3_fMf({2UTI)3mZ31E1ym6eEMm^0j4kYP;eL0|S>BcwdQ{*s?p+s=0d-ij zc#5GHh!sN*nrv;;=Np!RLrCMsFcLw2*SWvJ*guD9l;8jS8^Z*SPHtAl--`!~o#+f5 z9sh3}(w|jX*4a zUYLJzN(ozttEtYL`7q$~7^&Sc>Xa%;Kb#Os!7II$hY4?-uuXlbm-^a2TAFB=FpM#Y zGq9|u_TCCsfL%1lAK+m-sjNC~9S?79)kVMFT6b9p|8v@Dt)N;CR!epNal9otUZl)u zYXZ$kQ>6T4x@WZFjNd*1ev!gr?#xeBxZuEu#?;97bvahAwjQ=~%IE|AO49XGO*I~GBZ-Z&d&Ab?(XU8LU z7OJ4sa4ckMyk*W28(^PS+Pb#-o{#);IGOuX^FYt^PVD1-WxeCFeN(?|JuYvi66;Fcw@gvDh`&AT*WSBGJq>S3fk7TqE(=HP#4$jDlxVV@D7t(4B zPE?>P$`Ei;!LBRHNB@p1N=59RJVMm>UH|uXP|zESNHGEKu>Zwm771QSIB{bZBId}Q z>aDxy%7V*2lt+m7pC+u`8JwsfSC;=~8nWZI>xCUMB*5#t!3g=j3;JB$afP`c{hv%= zyNozdey%WoO=CCRD>XP#zg=mD3<2=In(*h7Zwxg#^p_r7^p`^X^y?#MlRgsAVk{yh#n zcAKdi*N`DcZoJ(aoTy+|?x8(Gy#F+1W)>Z~a%&6!H+yFHO*awn5Hi8{50DUYJ8r;T zNE}&TSD^pNk{R9MTD=RA<4eAGJA`7(wZ`HWjs=DyRL;~0L8{Hd!PRBIm9xBX`gPPvbS{TS2_NEig;XqcLxB{wrb?>}@phU`u+w|UH#fa|Y}wxKQ! z&YAF33(ts&B%Ru6dpl<$2Z)#jE+Xs6Krl0$YH%G^rw4=(hnx2BJd=LiSSq5NYX!U0 z1z{$!R6#;D(gemYKD!o1Ud>t$V6+kTqgvJn8%1sB?Aq;N5KkGmV`vb-a+MYQufcNqA>#{sn4sI%5n+GT)D(%tH7V)?8$M7ne%d*xelxv6+k!KHD8cn8#P;Ghth z^wZh9QD6l_-j;u-&Hw@0Q1!KH_IoN5a- z^tH9wdX)y*qmHb+kk5J6FYI7)_c^WeQFfA@yCy)zh1F={T*`zl){nXJF=FLO7_Kxs z3rQ(E)gl)ktLmthNX@Gr6v@tv^{#;Zl3<1ISk2nIKs8p4l}PSkRAF)_pesgHfCf>* z^QH6~Y^gi4yyvc&Un!LURm}D*2=M+-!0P#~1!Yqj^o_vg^6Z2v=ZUZ|M;Rfp3?@oV zd#os;GOlW6CS15bfNtUFuacm$=~XhS70IR@Nz~?0nxvJrYt-Cz;gZrzYcpAv*3j1Y zoizmNT(6v6sU%w!+sa+(`Y@TTAXQ~&*qTx_cLibQLNJ4z91$FF09Jph*zG3&JhFhx ztdZ=psq80HrsE7_yWDD3xM5_{MNj97L7kC`1p{fkuw|W%n^Kmu)DDD=vK5rj#pnbD zPgZrRbu2u$;QWZ<eAGQofo0Xrd(ljAKN`ZEcdpXU2YM);&wntYvw?u@_TPJx{`$6m?)7{L{;l0f ze;H9-CtF>k@6p_Ufr7gDZqCB~f%JK)+k++20F^JZ8LJKWn8S zrTQ$e=p<0P9hLgmlnztPL;=(4R!Cj!B^8RgWiG-enrP{YWz9&hQWHcyZpnex&Emew z@$ivLkg3M-c^)EV$nK$Z4$9PcZtC?QtB*~@FdM~o*jqz{LwzohD4hhLP%nheTswG$ zbe>H(%TP-8j0cbo&%olR`?@TzBuC8JJ{0=ezex)L8So~mTR1efbDkSs+yL^8mu!4V7GzU@u z&j5ogqH0O+Ch#Dv>Y>>v7+(qRzQ*Z~`Jxaq3qkCfb&MZq&{7%9^6?Uu@7>vzsrDp$ zvEWql(k2lWOV80=WOD~p}m%khHa7C>#H?!V$Mvs>&6?O}G0jeLHlreps1V5@9Vl`u(IeE{j zx*^xy3-mXan|l2z5Y5kF+x7|a94gq}P}ud@z@mrNu@e9Zkwq&Gp7!|mqluyjYYMA9 z8h3;~t8cDD;fS`$vT;A_oYX06B%}r(0syH{EkfQjSRHlCQ)TuqtA5E68GM4^X0`yG zbfNxif&E>s9o(PlHi36Hg_Ef^x$b{KRq3kQiz z2wi57{kY+HmR_%!5kV9KGKf1aC)73gD+!M&!zmt?JlzR4M$V zom@n)chStgTzT?877u?`6}>gtf=^Q(Frq=%|FLtvI`6%0d_rU9Bz+p++t1J%i3rQ$E5X-B%`G8Zbgxg^I)8RnYh06S?sb!;!7u}z&-0d1No*Lk%V{o6UntcR_a#8CcVT`bX)l|BaN{0&rrCFWsM zP9SN}AvSHX3|EiD*jEpw=$m`fsqlk^PN5I?MVYi7TbQ=zM27{TlZk&u&Z-bK&}@2m zJ~w7A@n}d0GG-yU`th9bSXf8w9hR`-nj3P^39S%1hia>F+lbGY@ECE$eYg`bhiKXx zL)pIg?l)arC>zm;pw>|XzbEqhFP_tVOg5&Cee^`6G87d2#&TJ>F{-=r6|7l!1$S(P z9vi4$M4nghAS4RIOkjI==+w3Lh2!;; ziinqV9{kFkY<9QO5l)qiNIU#>DBA2E4mOw!f?=G!FA{_Em`dDa2*)&#;5g5D#u9;L zS?yNj8i~X66s}aedt4a4Ramat1K$H(qg(u%hPuN_(`|3>;`SKf1q)FwVM za4(Z7Ff69)A2MmQNgCT^y+OF7`i&>)k?^@EnXA6h1b{hgQ%4@%Vgg;MY?C)n!O&lw z@Xb*cbFtFjz4TedlDOwl^l=s+-b&@9W&5kTxaEtHi%(UX?{Z(44>48CF9*SCU)4`l zyzArY{w_?^c)wkX8qZZqNm&pexKtnpAoJ_Af&OTc>qq?HuBOMNfM6F%?!>tl>;w2! zEr)}(tg*gQqFke|GZ4lSf_QbFJ+}>^#{v+nQYVMm3D%rF+33f<4YNF0fnmC zVv`Cojme$AT@g7}ADEE{vkD@+kN({M`i8yCv zVZ3K`obo4VxdPtiEnjfL#3Ln1{NfPDW?v$Md@na|ym6$|Xyd_B*2_oWbiyzczv`G! z#2X~TC3$zi!)()2t1P?tk`;a$+Cb@*MD zIhk>Q7TJNLf)w3&5T#=DNAVlIM*O&HhV7Zs9dXF=YnGuVl?~Zn?u1Me%2hb9?bbYJ z{LXJqGrYaROtiM@7V=oaxIXK4E30#?c-hW8@;V^fh$Xy^ik%Hv2ie|DNZWo#EoAZ= z9;CBqQ*C%37urk8Nu3$t-X64FsDo#nbr{Omogs(I7p%G-z3FLtIX@yh)s7?z=&_mH zpB-L$R2eEWte0a~y^N_zTl1q@r}(N@sImmC�}PDRixH3~%T=b8$2jJFD+;@A+IA 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 z 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 z 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%0DRz^3c(a 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%0A-JGhU?}s1{-lF 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 ReE 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̐S<>#Mf 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�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 z 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 -#V-J#NVhU!+c{$u%zZ(V{=C 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≤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≫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

      3h_ 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%0Dc4)mv) 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%0AHdua(fXd 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 z�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

      &vrN^{7PM=>($f}p=MRbnTjg4P>( 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%0A>+RSv?k$I{3av`DTI+B1 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/01-creative_gnome_defaults b/UIDev/ansibleshed/Packages/01-creative_gnome_defaults new file mode 100644 index 0000000..fbd1a8f --- /dev/null +++ b/UIDev/ansibleshed/Packages/01-creative_gnome_defaults @@ -0,0 +1,96 @@ +########################### +### Window Management + +[org/gnome/desktop/wm/preferences] + +button-layout='appmenu:minimize,maximize,close' +resize-with-right-button=true + +########################### +### Interface + +[org/gnome/desktop/interface] + +gtk-theme='Adwaita-dark' +enable-hot-corners=false + +########################### +### File Browser (Nautilus) + +[org/gnome/nautilus/preferences] + +always-use-location-entry=true +default-folder-viewer='list-view' + +[org/gnome/nautilus/list-view] + +default-zoom-level='small' +use-tree-view=true +default-visible-columns=['name', 'size', 'date_modified', 'type', 'starred'] + +########################### +### Workspace + +[org/gnome/mutter] + +workspaces-only-on-primary=false + +########################## +### Favorite Apps +[org/gnome/shell] +favorite-apps=['google-chrome.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Terminal.desktop', 'com.slack.Slack.desktop', 'almalinux-creative-installer.desktop'] + +########################## +### Gnome Extensions +[org/gnome/shell] + +# Set default Enabled Extensions +enabled-extensions=['top-icons@gnome-shell-extensions.gcampax.github.com', 'background-logo@fedorahosted.org', 'dash-to-panel@jderose9.github.com', 'system-monitor@paradoxxx.zero.gmail.com', 'arcmenu@arcmenu.com', 'gnome-ui-tune@itstime.tech', 'blur-my-shell@aunetx'] + +# Dash to Panel +[org/gnome/shell/extensions/dash-to-panel] + +multi-monitors=true +isolate-monitors=false +isolate-workspaces=true +scroll-panel-action='NOTHING' +dot-style-focused='SEGMENTED' +dot-style-unfocused='DASHES' +dot-color-override=true +dot-color-1='#5294e2' +dot-color-2='#5294e2' +dot-color-3='#5294e2' +dot-color-4='#5294e2' +dot-color-unfocused-different=true +dot-color-unfocused-1='#c0bfbc' +dot-color-unfocused-2='#c0bfbc' +dot-color-unfocused-3='#c0bfbc' +dot-color-unfocused-4='#c0bfbc' +click-action='TOGGLE-SHOWPREVIEW' +hide-overview-on-startup=true +appicon-padding=4 +appicon-margin=1 +panel-sizes='{"0":40,"1":40}' +panel-element-positions='{"0":[{"element":"showAppsButton","visible":false,"position":"stackedTL"},{"element":"activitiesButton","visible":false,"position":"stackedTL"},{"element":"leftBox","visible":true,"position":"stackedTL"},{"element":"taskbar","visible":true,"position":"stackedTL"},{"element":"centerBox","visible":true,"position":"stackedBR"},{"element":"rightBox","visible":true,"position":"stackedBR"},{"element":"dateMenu","visible":true,"position":"stackedBR"},{"element":"systemMenu","visible":true,"position":"stackedBR"},{"element":"desktopButton","visible":true,"position":"stackedBR"}],"1":[{"element":"showAppsButton","visible":false,"position":"stackedTL"},{"element":"activitiesButton","visible":false,"position":"stackedTL"},{"element":"leftBox","visible":true,"position":"stackedTL"},{"element":"taskbar","visible":true,"position":"stackedTL"},{"element":"centerBox","visible":true,"position":"stackedBR"},{"element":"rightBox","visible":true,"position":"stackedBR"},{"element":"dateMenu","visible":true,"position":"stackedBR"},{"element":"systemMenu","visible":true,"position":"stackedBR"},{"element":"desktopButton","visible":true,"position":"stackedBR"}]}' + +# System Monitor +[org/gnome/shell/extensions/system-monitor] + +compact-display=true +center-display=true +net-display=false +swap-display=true +icon-display=false + +# Arc Menu +[org/gnome/shell/extensions/arcmenu] + +multi-monitor=true +menu-button-icon='Distro_Icon' +menu-layout='Redmond' +enable-horizontal-flip=true + +# Gnome 4x UI Improvement +[org/gnome/shell/extensions/gnome-ui-tune] + +hide-search=false diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/COPYING b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/COPYING new file mode 100644 index 0000000..0cf672a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/COPYING @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/README.md b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/README.md new file mode 100644 index 0000000..a81ec23 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/README.md @@ -0,0 +1,148 @@ +![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/ArcMenu_WideBanner.png) + +----- + +![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/ArcMenu_Banner.png) + +----- + +### Introduction + +ArcMenu is an application menu for GNOME Shell, designed to provide a more traditional user experience and workflow. This extension has many features, including multiple menu layout styles, GNOME search, quick access to system shorctus, and more! If you are a new user to GNOME and are looking for a Windows style start menu, this extension will be perfect for you! + +**For ArcMenu to work properly, you may need [these dependencies](https://gitlab.com/arcmenu/ArcMenu/-/wikis/ArcMenu-Dependencies).** + +----- + +### Support ArcMenu + +ArcMenu is provided free of charge. If you enjoy using ArcMenu and wish to help support the project, feel free to use the link below! + +[![Donate via Paypal](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/paypal_donate.png)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=53CWA7NR743WC&item_name=Donate+to+support+my+work¤cy_code=USD&source=url) + + +----- + +### Installation + +#### To install the most recent official release: Visit ArcMenu on the [Official GNOME Extensions](https://extensions.gnome.org/extension/3628/arcmenu/) website. + +- **To install ArcMenu from source**: Please see the: [Install From Source wiki Guide](https://gitlab.com/arcmenu/ArcMenu/-/wikis/Install-From-Source-Guide). + +

      + + + + +----- + +### Bugs + +Bugs should be reported [here](https://gitlab.com/arcmenu/ArcMenu/issues) on the GitLab issues page. + +When reporting a bug, please provide as much information as you can about the issue and make sure to include your Linux distribution, GNOME Shell version, and ArcMenu version. + +----- + +### Credits: + +**@[AndrewZaech](https://gitlab.com/AndrewZaech) - Current Project Maintainer and Developer** + +**@[AndyC](https://gitlab.com/LinxGem33) - Founder of ArcMenu and former project maintainer** + +**@[lexruee](https://github.com/lexruee) - Former UI/UX Designer | @[Thomas Ingvarsson](https://gitlab.com/tingvarsson) - Former Developer** + +Additional credits: +* The 'ArcMenu' layout design is insipired by the Zorin OS menu extension. +* ArcMenu utilizes various code from GNOME Shell and the GNOME Shell extensions package. +* Borrowed code from Dash-to-Dock's extension 'location.js' file to implement a trash shortcut in ArcMenu. + +----- + +### Contributors: + +#### Thanks to the following people for contributing via pull requests: + +**@[fishears](https://github.com/fishears/Arc-Menu)** | **@[JasonLG1979](https://github.com/JasonLG1979)** | **@[itmitica](https://github.com/itmitica)** | **@[vikaig](https://gitlab.com/vikaig)** | **@[MagneFire](https://gitlab.com/MagneFire)** + +**@[tognee](https://gitlab.com/tognee)** | **@[hlechner](https://gitlab.com/hlechner)** | **@[vanillajonathan](https://gitlab.com/vanillajonathan)** | **@[epskampie](https://gitlab.com/epskampie)** | **@[GnomeBook](https://gitlab.com/GnomeBook)** + +**@[charlesg99](https://github.com/charlesg99)** | **@[harshadgavali](https://gitlab.com/harshadgavali)** | **@[O. Giesmann ](https://gitlab.com/Etamuk)** | **@[aleayr ](https://gitlab.com/aleayr)** + + +#### Bug Fixes: + +**@[JasonLG1979](https://github.com/JasonLG1979)** | **@[lexruee](https://github.com/lexruee/Arc-Menu)** | **@[aleayr ](https://gitlab.com/aleayr)** + + +#### Translators: + +**@[Nilvus](https://gitlab.com/Nilvus) - French** | **@[Etamuk](https://gitlab.com/Etamuk) - German** | **@[alex4401](https://gitlab.com/alex4401) - Polish** | **@[frnogueira](https://gitlab.com/frnogueira), @[Z Bed](https://gitlab.com/zbed) - Brazilian Portuguese** | **@[sigbjokj](https://gitlab.com/sigbjokj), @[sssandum](https://gitlab.com/sssandum) - Norwegian** + + **@[Ivan](https://gitlab.com/vantu5z), @[Ser82-png](https://gitlab.com/Ser82-png) - Russian** | **@[gkkulik](https://gitlab.com/gkkulik) - Silesian** | **@[vikaig](https://gitlab.com/vikaig) - Ukrainian** | **@[jordim](https://gitlab.com/jordim) - Catalan** | **@[aylinux](https://gitlab.com/aylinux) - Turkish** + + +**@[MorganAntonsson](https://gitlab.com/MorganAntonsson) - Swedish** | **@[jiri.doubravsky](https://gitlab.com/jiri.doubravsky), @[panmourovaty ](https://gitlab.com/panmourovaty) - Czech** | **@[juanlucer](https://gitlab.com/juanlucer) - Spanish** | **@[plesry](https://gitlab.com/plesry) - Chinese (Taiwan)** | **@[Vombato](https://gitlab.com/Vombato), @[matguidi](https://gitlab.com/matguidi) - Italian** + +**@[skygmin](https://gitlab.com/skygmin) - Simplified Chinese** | **@[Vistaus](https://gitlab.com/Vistaus), @[vinno97](https://gitlab.com/vinno97) - Dutch** | **@[artnay](https://gitlab.com/artnay) - Finnish** | **@[rimasx](https://gitlab.com/rimasx) - Estonian** | **@[stevendobay](https://gitlab.com/stevendobay) - Hungarian** + +**@[omeritzics](https://gitlab.com/omeritzics) - Hebrew** | **@[prescott66](https://gitlab.com/prescott66) - Slovak** | **@[Mejans](https://gitlab.com/Mejans) - Occitan** | **@[KuroeHanako](https://gitlab.com/KuroeHanako) - Korean** | **@[sayuri](https://gitlab.com/sayuri-) - Sinhalese** + +**@[Latgardi](https://gitlab.com/Latgardi) - Belarusian** + +----- + +### License & Terms + +ArcMenu is available under the terms of the GPL-2.0 license See [`COPYING`](https://gitlab.com/arcmenu/ArcMenu/blob/master/COPYING) for details. + +Most of ArcMenu's image assets including, but not limited to, custom menu button icons, wire frame svgs, and custom settings icons, are created by [LinxGem33](https://gitlab.com/LinxGem33) and licensed under; [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) + +**Legal disclaimer for brand icons and trademarks:** + +*" All brand icons are trademarks of their respective owners. The use of these trademarks does not indicate endorsement of the trademark holder by ArcMenu project, nor vice versa. Please do not use brand logos for any purpose except to represent the company, product, or service to which they refer. "* + +

      +Read More... + +

      + +* **UBUNTU ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Ubuntu name and Ubuntu logo is a trademark of Canonical ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Ltd. + +* **FEDORA ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Fedora and the Infinity design logo are trademarks of Red Hat, Inc. + +* **DEBIAN ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - is a registered trademark owned by Software in the Public Interest, Inc. Debian trademark is a registered United States trademark of Software in the Public Interest, Inc., managed by the Debian project. + +* **MANJARO ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - (logo) and name is a trademark of Manjaro GmbH & Co. KG + +* **POP_OS! ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Name and (logo) is a trademark of system 76 ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Inc. + +* **ARCH LINUX ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - The stylized Arch Linux logo are recognised trademarks of Arch Linux, copyright 2002-2017 Judd Vinet and Aaron Griffin + +* **SOLUS** - name and logo is Copyright ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) 2014-2018 by Solus Project + +* **KALI LINUX** - logo and name is part of ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) OffSec Services Limited 2020 + +* **PUREOS** - name and logo is developed by members of the Purism community + +* **RASPBERRY PI** ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) - Logo and name is part of Raspberry Pi Foundation +UK Registered Charity 1129409 + +* **Gentoo Authors![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** 2001–2020 +Gentoo is a trademark of the Gentoo Foundation, Inc. + +* **Voyager ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Linux** +(name) and (logo) + +* **MXLinux![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** 2020 - +Linux - is the registered trademark of Linus Torvalds in the U.S. and other countries. + +* **Red Hat, Inc.![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** Copyright 2020 +(name) and (logo) + +* **ZORIN OS** - The "Z" logomark is a registered trademark of Zorin Technology Group Ltd. Copyright © 2019 - 2021 Zorin Technology Group Ltd + +

      +
      + +----- diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/constants.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/constants.js new file mode 100644 index 0000000..082cb4b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/constants.js @@ -0,0 +1,460 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +var SearchbarLocation = { + BOTTOM: 0, + TOP: 1 +} + +var MenuItemLocation = { + BOTTOM: 0, + TOP: 1 +} + +var DisplayType = { + LIST: 0, + GRID: 1, + BUTTON: 2, + SIMPLE_CATEGORY: 3, + SUBMENU_CATEGORY: 4, +} + +var CategoryType = { + FAVORITES: 0, + FREQUENT_APPS: 1, + ALL_PROGRAMS: 2, + PINNED_APPS: 3, + RECENT_FILES: 4, + HOME_SCREEN: 5, + SEARCH_RESULTS: 6, + CATEGORIES_LIST: 7, +}; + +var DefaultMenuView = { + PINNED_APPS: 0, + CATEGORIES_LIST: 1, + FREQUENT_APPS: 2, + ALL_PROGRAMS: 3 +} + +var PrefsVisiblePage = { + MAIN: 0, + MENU_LAYOUT: 1, + BUTTON_APPEARANCE: 2, + LAYOUT_TWEAKS: 3, + ABOUT: 4, + CUSTOMIZE_MENU: 5, + RUNNER_TWEAKS: 6 +} + +var DefaultMenuViewTognee = { + CATEGORIES_LIST: 0, + ALL_PROGRAMS: 1 +} + +var SoftwareManagerIDs = ['org.manjaro.pamac.manager.desktop', 'pamac-manager.desktop', 'io.elementary.appcenter.desktop', + 'snap-store_ubuntu-software.desktop', 'snap-store_snap-store.desktop', 'org.gnome.Software.desktop']; + +var Categories = [ + {CATEGORY: CategoryType.FAVORITES, NAME: _("Favorites"), ICON: 'emblem-favorite-symbolic', FULL_COLOR_ICON: 'emblem-favorite'}, + {CATEGORY: CategoryType.FREQUENT_APPS, NAME: _("Frequent Apps"), ICON: 'user-bookmarks-symbolic', FULL_COLOR_ICON: 'user-bookmarks'}, + {CATEGORY: CategoryType.ALL_PROGRAMS, NAME: _("All Apps"), ICON: 'view-grid-symbolic', FULL_COLOR_ICON: 'view-grid-symbolic'}, + {CATEGORY: CategoryType.PINNED_APPS, NAME: _("Pinned Apps"), ICON: 'view-pin-symbolic', FULL_COLOR_ICON: 'view-pin-symbolic'}, + {CATEGORY: CategoryType.RECENT_FILES, NAME: _("Recent Files"), ICON: 'document-open-recent-symbolic', FULL_COLOR_ICON: 'document-open-recent'} +] + +var ArcMenuPlacement = { + PANEL: 0, + DTP: 1, + DASH: 2 +}; + +var TooltipLocation = { + TOP_CENTERED: 0, + BOTTOM_CENTERED: 1, + BOTTOM: 2, +}; + +var SeparatorAlignment = { + VERTICAL: 0, + HORIZONTAL: 1 +}; + +var SeparatorStyle = { + SHORT: 0, + MEDIUM: 1, + LONG: 2, + MAX: 3, + HEADER_LABEL: 4, + NORMAL: 5, + ALWAYS_SHOW: 6, +}; + +var CaretPosition = { + END: -1, + START: 0, + MIDDLE: 2, +}; + +var CategoryIconType = { + FULL_COLOR: 0, + SYMBOLIC: 1, +} + +var ForcedMenuLocation = { + OFF: 0, + TOP_CENTERED: 1, + BOTTOM_CENTERED: 2, +} + +var IconSize = { + DEFAULT: 0, + EXTRA_SMALL: 1, + SMALL: 2, + MEDIUM: 3, + LARGE: 4, + EXTRA_LARGE: 5, +} + +var GridIconSize = { + DEFAULT: 0, + SMALL: 1, + MEDIUM: 2, + LARGE: 3, + SMALL_RECT: 4, + MEDIUM_RECT: 5, + LARGE_RECT: 6, +}; + +var GridIconInfo = [ + { NAME: 'SmallIconGrid', SIZE: 90, ICON_SIZE: 36, ENUM: GridIconSize.SMALL }, + { NAME: 'MediumIconGrid', SIZE: 97, ICON_SIZE: 42, ENUM: GridIconSize.MEDIUM }, + { NAME: "LargeIconGrid", SIZE: 105, ICON_SIZE: 52, ENUM: GridIconSize.LARGE }, + { NAME: 'SmallRectIconGrid', SIZE: 95, ICON_SIZE: 28, ENUM: GridIconSize.SMALL_RECT }, + { NAME: 'MediumRectIconGrid', SIZE: 102, ICON_SIZE: 34, ENUM: GridIconSize.MEDIUM_RECT }, + { NAME: 'LargeRectIconGrid', SIZE: 105, ICON_SIZE: 42, ENUM: GridIconSize.LARGE_RECT }, +] + +var EXTRA_SMALL_ICON_SIZE = 16; +var SMALL_ICON_SIZE = 20; +var MEDIUM_ICON_SIZE = 25; +var LARGE_ICON_SIZE = 30; +var EXTRA_LARGE_ICON_SIZE = 35; +var MISC_ICON_SIZE = 24; + +var SUPER_L = 'Super_L'; +var SUPER_R = 'Super_R'; +var EMPTY_STRING = ''; + +var HotKey = { + UNDEFINED: 0, + SUPER_L: 1, + CUSTOM: 2, + // Inverse mapping + 0: EMPTY_STRING, + 1: SUPER_L, +}; + +var RunnerHotKey = { + SUPER_L: 0, + CUSTOM: 1, + 0: SUPER_L, +}; + +var HotCornerAction = { + DEFAULT: 0, + DISABLED: 1, + TOGGLE_ARCMENU: 2, + CUSTOM: 3 +} + +var SECTIONS = [ + 'devices', + 'network', + 'bookmarks', +]; + +var MenuPosition = { + LEFT: 0, + CENTER: 1, + RIGHT: 2 +}; + +var RavenPosition = { + LEFT: 0, + RIGHT: 1 +}; + +var DiaglogType = { + DEFAULT: 0, + OTHER: 1, + APPLICATIONS: 2, + DIRECTORIES: 3 +}; + +var MenuButtonAppearance = { + ICON: 0, + TEXT: 1, + ICON_TEXT: 2, + TEXT_ICON: 3, + NONE: 4 +}; + +var MenuIcon = { + ARC_MENU: 0, + DISTRO_ICON: 1, + CUSTOM: 2 +}; + +var PowerType = { + LOGOUT: 0, + LOCK: 1, + RESTART: 2, + POWER_OFF: 3, + SUSPEND: 4, + HYBRID_SLEEP: 5, + HIBERNATE: 6, +}; + +var SleepIcon = { + PATH: '/media/icons/menu_icons/sleep-symbolic.svg' +}; + +var PowerOptions = [ + { TYPE: PowerType.LOGOUT, IMAGE: 'application-exit-symbolic', TITLE: _("Log Out") }, + { TYPE: PowerType.LOCK, IMAGE: 'changes-prevent-symbolic', TITLE: _("Lock") }, + { TYPE: PowerType.RESTART, IMAGE: 'system-reboot-symbolic', TITLE: _("Restart") }, + { TYPE: PowerType.POWER_OFF, IMAGE: 'system-shutdown-symbolic', TITLE: _("Power Off") }, + { TYPE: PowerType.SUSPEND, IMAGE: 'media-playback-pause-symbolic', TITLE: _("Suspend") }, + { TYPE: PowerType.HYBRID_SLEEP, IMAGE: Me.path + SleepIcon.PATH, TITLE: _("Hybrid Sleep") }, + { TYPE: PowerType.HIBERNATE, IMAGE: 'document-save-symbolic', TITLE: _("Hibernate") }, +]; + +var MenuIcons = [ + { PATH: '/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/curved-a-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/focus-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/whirl-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/sums-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arrow-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/lins-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/search-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/transform-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/3d-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/alien-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/cloud-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dragon-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/fly-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pacman-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/peaks-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pie-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pointer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/toxic-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/tree-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/zegon-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/apps-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/bug-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/cita-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/eclipse-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/football-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/heddy-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/helmet-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/palette-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/peeks-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/record-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/saucer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/step-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/vancer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/vibe-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/start-box-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dolphin-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dota-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/football2-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/loveheart-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/rewind-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/snap-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/time-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/3D-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/a-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/bat-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dra-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/equal-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/gnacs-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/groove-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/kaaet-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/launcher-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pac-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/robots-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/sheild-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/somnia-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/utool-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/swirl-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/round-symbolic.svg'}, +] + +var DistroIcons = [ + { PATH: 'start-here-symbolic'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg'}, +] + +var MenuLayout = { + ARCMENU: 0, + BRISK: 1, + WHISKER: 2, + GNOME_MENU: 3, + MINT: 4, + ELEMENTARY: 5, + GNOME_OVERVIEW: 6, + SIMPLE: 7, + SIMPLE_2: 8, + REDMOND: 9, + UNITY: 10, + BUDGIE: 11, + INSIDER: 12, + RUNNER: 13, + CHROMEBOOK: 14, + RAVEN: 15, + TOGNEE: 16, + PLASMA: 17, + WINDOWS: 18, + LAUNCHER: 19, + ELEVEN: 20, + AZ: 21, +}; + +var TraditionalMenus = [ + { IMAGE: 'arcmenu-layout-symbolic', TITLE: _('ArcMenu'), LAYOUT: MenuLayout.ARCMENU}, + { IMAGE: 'brisk-layout-symbolic', TITLE: _('Brisk'), LAYOUT: MenuLayout.BRISK}, + { IMAGE: 'whisker-layout-symbolic', TITLE: _('Whisker'), LAYOUT: MenuLayout.WHISKER}, + { IMAGE: 'gnomemenu-layout-symbolic', TITLE: _('GNOME Menu'), LAYOUT: MenuLayout.GNOME_MENU}, + { IMAGE: 'mint-layout-symbolic', TITLE: _('Mint'), LAYOUT: MenuLayout.MINT}, + { IMAGE: 'budgie-layout-symbolic', TITLE: _('Budgie'), LAYOUT: MenuLayout.BUDGIE}]; + +var ModernMenus = [ + { IMAGE: 'unity-layout-symbolic', TITLE: _('Unity'), LAYOUT: MenuLayout.UNITY}, + { IMAGE: 'plasma-layout-symbolic', TITLE: _('Plasma'), LAYOUT: MenuLayout.PLASMA}, + { IMAGE: 'tognee-layout-symbolic', TITLE: _('tognee'), LAYOUT: MenuLayout.TOGNEE}, + { IMAGE: 'insider-layout-symbolic', TITLE: _('Insider'), LAYOUT: MenuLayout.INSIDER}, + { IMAGE: 'redmond-layout-symbolic', TITLE: _('Redmond'), LAYOUT: MenuLayout.REDMOND}, + { IMAGE: 'windows-layout-symbolic', TITLE: _('Windows'), LAYOUT: MenuLayout.WINDOWS}, + { IMAGE: 'eleven-layout-symbolic', TITLE: _('11'), LAYOUT: MenuLayout.ELEVEN}, + { IMAGE: 'az-layout-symbolic', TITLE: _('a.z.'), LAYOUT: MenuLayout.AZ}]; + +var TouchMenus = [ + { IMAGE: 'elementary-layout-symbolic', TITLE: _('Elementary'), LAYOUT: MenuLayout.ELEMENTARY}, + { IMAGE: 'chromebook-layout-symbolic', TITLE: _('Chromebook'), LAYOUT: MenuLayout.CHROMEBOOK}]; + +var LauncherMenus = [ + { IMAGE: 'launcher-layout-symbolic', TITLE: _('Launcher'), LAYOUT: MenuLayout.LAUNCHER}, + { IMAGE: 'runner-layout-symbolic', TITLE: _('Runner'), LAYOUT: MenuLayout.RUNNER}, + { IMAGE: 'gnomeoverview-layout-symbolic', TITLE: _('GNOME Overview'), LAYOUT: MenuLayout.GNOME_OVERVIEW}]; + +var SimpleMenus = [ + { IMAGE: 'simple-layout-symbolic', TITLE: _('Simple'), LAYOUT: MenuLayout.SIMPLE}, + { IMAGE: 'simple2-layout-symbolic', TITLE: _('Simple 2'), LAYOUT: MenuLayout.SIMPLE_2}]; + +var AlternativeMenus = [ + { IMAGE: 'raven-layout-symbolic', TITLE: _('Raven'), LAYOUT: MenuLayout.RAVEN}]; + +var MenuStyles = { + STYLES: [ + { IMAGE: 'traditional-category-symbolic', TITLE: _("Traditional"), MENU_TYPE: TraditionalMenus }, + { IMAGE: 'modern-category-symbolic', TITLE: _("Modern"), MENU_TYPE: ModernMenus }, + { IMAGE: 'touch-category-symbolic', TITLE: _("Touch"), MENU_TYPE: TouchMenus }, + { IMAGE: 'simple-category-symbolic', TITLE: _("Simple"), MENU_TYPE: SimpleMenus }, + { IMAGE: 'launcher-category-symbolic', TITLE: _("Launcher"), MENU_TYPE: LauncherMenus }, + { IMAGE: 'alternative-category-symbolic', TITLE: _("Alternative"), MENU_TYPE: AlternativeMenus } + ] +}; + +var ArcMenuSettingsCommand = 'gnome-extensions prefs arcmenu@arcmenu.com'; + +var HamburgerIcon = { + PATH: '/media/icons/menu_icons/hamburger-symbolic.svg' +}; + +var DistroIconsDisclaimer = '"All brand icons are trademarks of their respective owners. The use of these trademarks does not indicate endorsement of the trademark holder by ArcMenu project, nor vice versa. Please do not use brand logos for any purpose except to represent the company, product, or service to which they refer."'+ + '\n\n• Ubuntu® - Ubuntu name and Ubuntu logo are trademarks of Canonical© Ltd.'+ + '\n\n• Fedora® - Fedora and the Infinity design logo are trademarks of Red Hat, Inc.'+ + '\n\n• Debian® - is a registered trademark owned by Software in the Public Interest, Inc. Debian trademark is a registered United States trademark of Software in the Public Interest, Inc., managed by the Debian project.'+ + '\n\n• Manjaro® - logo and name are trademarks of Manjaro GmbH & Co. KG'+ + '\n\n• Pop_OS!® - logo and name are trademarks of system 76© Inc.'+ + '\n\n• Arch Linux™ - The stylized Arch Linux logo is a recognized trademark of Arch Linux, copyright 2002–2017 Judd Vinet and Aaron Griffin.'+ + '\n\n• openSUSE® - logo and name 2001–2020 SUSE LLC, © 2005–2020 openSUSE Contributors & others.'+ + '\n\n• Raspberry Pi® - logo and name are part of Raspberry Pi Foundation UK Registered Charity 1129409'+ + '\n\n• Kali Linux™ - logo and name are part of © OffSec Services Limited 2020'+ + '\n\n• PureOS - logo and name are developed by members of the Purism community'+ + '\n\n• Solus - logo and name are copyright © 2014–2018 by Solus Project'+ + '\n\n• Gentoo Authors© - 2001–2020 Gentoo is a trademark of the Gentoo Foundation, Inc.'+ + '\n\n• Voyager© Linux - name and logo'+ + '\n\n• MX Linux© - 2020 - Linux - is the registered trademark of Linus Torvalds in the U.S. and other countries.'+ + '\n\n• Red Hat, Inc.© - Copyright 2020 name and logo' + + '\n\n• ZORIN OS - The "Z" logomark is a registered trademark of Zorin Technology Group Ltd. Copyright © 2019 - 2021 Zorin Technology Group Ltd'; + +var DEVELOPERS = 'Andrew Zaech @AndrewZaech\nLead Project Developer and Maintainer\t' + + '\n\nLinxGem33 aka Andy C @LinxGem33 - (Inactive)\nArcMenu Founder - Former Maintainer - Former Digital Art Designer'; +var TRANSLATORS = 'Thank you to all translators!\n\n' + + 'For a list of all translators please visit ArcMenu on GitLab'; +var CONTRIBUTORS = 'Thank you to all who contributed to, and/or helped, the developement of ArcMenu!' + +'\n\nFor a list of all contributors please visit ArcMenu on GitLab'; +var ARTWORK = 'LinxGem33 aka Andy C\nWiki Screens, Icons, Wire-Frames, ArcMenu Assets' + + '\n\nAndrew Zaech\nIcons, Wire-Frames'; + +var GNU_SOFTWARE = '' + + 'This program comes with absolutely no warranty.\n' + + 'See the ' + + 'GNU General Public License, version 2 or later for details.' + + ''; diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/controller.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/controller.js new file mode 100644 index 0000000..7c35a80 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/controller.js @@ -0,0 +1,749 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Gio, GLib, Gtk, St} = imports.gi; +const Constants = Me.imports.constants; +const Helper = Me.imports.helper; +const Main = imports.ui.main; +const MenuButton = Me.imports.menuButton; +const {StandaloneRunner} = Me.imports.standaloneRunner; +const Utils = Me.imports.utils; + +var MenuSettingsController = class { + constructor(settings, settingsControllers, panel, panelIndex, arcMenuPlacement) { + this._settings = settings; + if(this._settings.get_boolean('reload-theme')) + this._settings.reset('reload-theme'); + this.panel = panel; + this.arcMenuPlacement = arcMenuPlacement; + + global.toggleArcMenu = () => this.toggleMenus(); + + this.currentMonitorIndex = 0; + this._activitiesButton = Main.panel.statusArea.activities; + this.isPrimary = panelIndex === 0 ? true : false; + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL) { + this._menuButton = new MenuButton.MenuButton(settings, this.arcMenuPlacement, panel); + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) { + this._menuButton = new MenuButton.MenuButton(settings, this.arcMenuPlacement, panel, panelIndex); + this.menuButtonAdjustedActor = this._menuButton.container; + } + + this._settingsControllers = settingsControllers + + if(this.isPrimary){ + this._menuHotKeybinder = new Helper.MenuHotKeybinder(); + this._keybindingManager = new Helper.KeybindingManager(this._settings); + this._hotCornerManager = new Helper.HotCornerManager(this._settings,() => this.toggleMenus()); + } + this._applySettings(); + } + + // Load and apply the settings from the arc-menu settings + _applySettings() { + if(this.isPrimary){ + this._updateHotCornerManager(); + this._updateHotKeyBinder(); + } + + this._setButtonAppearance(); + this._setButtonText(); + this._setButtonIcon(); + this._setButtonIconSize(); + this._setButtonIconPadding(); + this._configureActivitiesButton(); + } + // Bind the callbacks for handling the settings changes to the event signals + bindSettingsChanges() { + this.settingsChangeIds = [ + this._settings.connect('changed::hot-corners', this._updateHotCornerManager.bind(this)), + this._settings.connect('changed::menu-hotkey', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::runner-menu-hotkey', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::enable-standlone-runner-menu', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::position-in-panel', this._setButtonPosition.bind(this)), + this._settings.connect('changed::menu-button-position-offset', this._setButtonPosition.bind(this)), + this._settings.connect('changed::menu-position-alignment', this._setMenuPositionAlignment.bind(this)), + this._settings.connect('changed::menu-button-appearance', this._setButtonAppearance.bind(this)), + this._settings.connect('changed::custom-menu-button-text', this._setButtonText.bind(this)), + this._settings.connect('changed::menu-button-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::distro-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::arc-menu-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::custom-menu-button-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::custom-menu-button-icon-size', this._setButtonIconSize.bind(this)), + this._settings.connect('changed::button-padding', this._setButtonIconPadding.bind(this)), + this._settings.connect('changed::enable-menu-button-arrow', this._setMenuButtonArrow.bind(this)), + this._settings.connect('changed::enable-custom-arc-menu', this._updateStyle.bind(this)), + this._settings.connect('changed::remove-menu-arrow', this._updateStyle.bind(this)), + this._settings.connect('changed::disable-searchbox-border', this._updateStyle.bind(this)), + this._settings.connect('changed::indicator-color', this._updateStyle.bind(this)), + this._settings.connect('changed::indicator-text-color', this._updateStyle.bind(this)), + this._settings.connect('changed::directory-shortcuts-list', this._reload.bind(this)), + this._settings.connect('changed::application-shortcuts-list', this._reload.bind(this)), + this._settings.connect('changed::disable-recently-installed-apps', this._initiateRecentlyInstalledApps.bind(this)), + this._settings.connect('changed::extra-categories', this._reload.bind(this)), + this._settings.connect('changed::power-options', this._reload.bind(this)), + this._settings.connect('changed::show-external-devices', this._reload.bind(this)), + this._settings.connect('changed::show-bookmarks', this._reload.bind(this)), + this._settings.connect('changed::disable-user-avatar', this._reload.bind(this)), + this._settings.connect('changed::enable-activities-shortcut', this._reload.bind(this)), + this._settings.connect('changed::enable-horizontal-flip', this._reload.bind(this)), + this._settings.connect('changed::searchbar-default-bottom-location', this._reload.bind(this)), + this._settings.connect('changed::searchbar-default-top-location', this._plasmaMenuReloadTheme.bind(this)), + this._settings.connect('changed::searchbar-default-top-location', this._reload.bind(this)), + this._settings.connect('changed::multi-lined-labels', this._reload.bind(this)), + this._settings.connect('changed::apps-show-extra-details', this._reload.bind(this)), + this._settings.connect('changed::show-search-result-details', this._reload.bind(this)), + this._settings.connect('changed::search-provider-open-windows', this._reload.bind(this)), + this._settings.connect('changed::search-provider-recent-files', this._reload.bind(this)), + this._settings.connect('changed::disable-scrollview-fade-effect', this._reload.bind(this)), + this._settings.connect('changed::menu-height', this._updateMenuHeight.bind(this)), + this._settings.connect('changed::menu-width-adjustment', this._updateMenuHeight.bind(this)), + this._settings.connect('changed::reload-theme', this._reloadTheme.bind(this)), + this._settings.connect('changed::pinned-app-list',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-weather-widget-unity',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-clock-widget-unity',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-weather-widget-raven',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-clock-widget-raven',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::brisk-shortcuts-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::mint-pinned-app-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::mint-separator-index',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::unity-pinned-app-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::unity-separator-index',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::windows-disable-frequent-apps', this._reload.bind(this)), + this._settings.connect('changed::windows-disable-pinned-apps', this._reload.bind(this)), + this._settings.connect('changed::default-menu-view', this._reload.bind(this)), + this._settings.connect('changed::default-menu-view-tognee',this._reload.bind(this)), + this._settings.connect('changed::alphabetize-all-programs',this._reload.bind(this)), + this._settings.connect('changed::enable-unity-homescreen',this._setDefaultMenuView.bind(this)), + this._settings.connect('changed::menu-layout', this._updateMenuLayout.bind(this)), + this._settings.connect('changed::menu-item-grid-icon-size', this._reload.bind(this)), + this._settings.connect('changed::menu-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::button-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::quicklinks-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::misc-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::runner-position', this.updateLocation.bind(this)), + this._settings.connect('changed::runner-show-frequent-apps', this._reload.bind(this)), + this._settings.connect('changed::enable-sub-menus', this._reload.bind(this)), + this._settings.connect('changed::show-activities-button', this._configureActivitiesButton.bind(this)), + this._settings.connect('changed::force-menu-location', this._forceMenuLocation.bind(this)), + this._settings.connect('changed::category-icon-type', this._reload.bind(this)), + this._settings.connect('changed::shortcut-icon-type', this._reload.bind(this)), + this._settings.connect('changed::arcmenu-extra-categories-links', this._reload.bind(this)), + this._settings.connect('changed::arcmenu-extra-categories-links-location', this._reload.bind(this)), + ]; + } + + _reload(){ + this._menuButton.reload(); + if(this.runnerMenu) + this.runnerMenu.reload(); + } + + _forceMenuLocation(){ + this._menuButton.forceMenuLocation(); + } + + _initiateRecentlyInstalledApps(){ + this._menuButton.initiateRecentlyInstalledApps(); + this._menuButton.reload(); + if(this.runnerMenu){ + this.runnerMenu.initiateRecentlyInstalledApps(); + this.runnerMenu.reload(); + } + } + + _plasmaMenuReloadTheme(){ + if(this._settings.get_enum('menu-layout') === Constants.MenuLayout.PLASMA){ + if(this._settings.get_boolean('reload-theme')) + this._settings.reset('reload-theme'); + this._settings.set_boolean('reload-theme', true); + } + } + + updateLocation(){ + this._menuButton.updateLocation(); + if(this.runnerMenu) + this.runnerMenu.updateLocation(); + } + + _updateMenuLayout(){ + this._menuButton.updateMenuLayout(); + } + + _setDefaultMenuView(){ + this._menuButton.setDefaultMenuView(); + } + + toggleStandaloneRunner(){ + this._closeAllArcMenus(); + if(this.runnerMenu) + this.runnerMenu.toggleMenu(); + } + + toggleMenus(){ + if(this.runnerMenu && this.runnerMenu.arcMenu.isOpen) + this.runnerMenu.toggleMenu(); + if(global.dashToPanel || this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + const MultipleArcMenus = this._settingsControllers.length > 1; + const ShowArcMenuOnPrimaryMonitor = this._settings.get_boolean('hotkey-open-primary-monitor'); + if(MultipleArcMenus && ShowArcMenuOnPrimaryMonitor) + this._toggleMenuOnMonitor(Main.layoutManager.primaryMonitor); + else if(MultipleArcMenus && !ShowArcMenuOnPrimaryMonitor) + this._toggleMenuOnMonitor(Main.layoutManager.currentMonitor); + else + this._menuButton.toggleMenu(); + } + else + this._menuButton.toggleMenu(); + } + + _toggleMenuOnMonitor(monitor){ + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + let monitorIndex = this._settingsControllers[i].monitorIndex; + if(monitor.index === monitorIndex) + this.currentMonitorIndex = i; + else{ + if(menuButton.arcMenu.isOpen) + menuButton.toggleMenu(); + if(menuButton.arcMenuContextMenu.isOpen) + menuButton.toggleArcMenuContextMenu(); + } + } + //open the current monitors menu + this._settingsControllers[this.currentMonitorIndex]._menuButton.toggleMenu(); + } + + _closeAllArcMenus(){ + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + if(menuButton.arcMenu.isOpen) + menuButton.toggleMenu(); + if(menuButton.arcMenuContextMenu.isOpen) + menuButton.toggleArcMenuContextMenu(); + } + } + + _reloadTheme(){ + if(this.isPrimary && this._settings.get_boolean('reload-theme')) { + this._settings.reset('reload-theme'); + + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + Utils.createStylesheet(this._settings); + let stylesheet = Utils.getStylesheet(); + if(Me.stylesheet) + theme.unload_stylesheet(Me.stylesheet); + Me.stylesheet = stylesheet; + theme.load_stylesheet(Me.stylesheet); + + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + menuButton.updateStyle(); + } + if(this.runnerMenu) + this.runnerMenu.updateStyle(); + } + } + + _updateStyle() { + this._menuButton.updateStyle(); + if(this.runnerMenu) + this.runnerMenu.updateStyle(); + } + + _updateMenuHeight(){ + this._menuButton.updateHeight(); + } + + _updatePinnedApps(){ + if(this._menuButton.shouldLoadPinnedApps()) + this._menuButton.loadPinnedApps(); + + //If the active category is Pinned Apps, redisplay the new Pinned Apps + const activeCategory = this._menuButton.MenuLayout?.activeCategoryType; + if(!activeCategory) + return; + if(activeCategory === Constants.CategoryType.PINNED_APPS || activeCategory === Constants.CategoryType.HOME_SCREEN) + this._menuButton.displayPinnedApps(); + } + + _updateExtraPinnedApps(){ + let layout = this._settings.get_enum('menu-layout'); + if(layout == Constants.MenuLayout.UNITY || layout == Constants.MenuLayout.MINT || layout == Constants.MenuLayout.BRISK){ + if(this._menuButton.shouldLoadPinnedApps()) + this._menuButton.loadExtraPinnedApps(); + } + } + + _updateHotCornerManager() { + if (this.isPrimary) { + let hotCornerAction = this._settings.get_enum('hot-corners'); + if (hotCornerAction === Constants.HotCornerAction.DEFAULT) { + this._hotCornerManager.restoreDefaultHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.DISABLED) { + this._hotCornerManager.disableHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.TOGGLE_ARCMENU) { + this._hotCornerManager.modifyHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.CUSTOM) { + this._hotCornerManager.modifyHotCorners(); + } + } + } + + _updateHotKeyBinder() { + if (this.isPrimary) { + const RunnerHotKey = this._settings.get_enum('runner-menu-hotkey'); + const HotKey = this._settings.get_enum('menu-hotkey'); + const EnableStandaloneRunnerMenu = this._settings.get_boolean('enable-standlone-runner-menu'); + + this._keybindingManager.unbind('ToggleArcMenu'); + this._keybindingManager.unbind('ToggleRunnerMenu'); + this._menuHotKeybinder.disableHotKey(); + this._menuKeyBindingKey = null; + this._runnerKeyBindingKey = null; + + if(EnableStandaloneRunnerMenu){ + if(!this.runnerMenu){ + this.runnerMenu = new StandaloneRunner(this._settings); + this.runnerMenu.initiate(); + } + + if(RunnerHotKey === Constants.RunnerHotKey.CUSTOM){ + this._keybindingManager.bind('ToggleRunnerMenu', 'toggle-runner-menu', () => this._onHotkey(() => this.toggleStandaloneRunner())); + this._runnerKeyBindingKey = this._settings.get_strv('toggle-runner-menu').toString(); + } + else if(RunnerHotKey === Constants.RunnerHotKey.SUPER_L){ + this._menuHotKeybinder.enableHotKey(() => this.toggleStandaloneRunner()); + } + } + else if(this.runnerMenu){ + this.runnerMenu.destroy(); + this.runnerMenu = null; + } + + if(HotKey === Constants.HotKey.CUSTOM){ + this._keybindingManager.bind('ToggleArcMenu', 'toggle-arcmenu', () => this._onHotkey(() => this.toggleMenus())); + this._menuKeyBindingKey = this._settings.get_strv('toggle-arcmenu').toString(); + } + else if(HotKey === Constants.HotKey.SUPER_L){ + this._menuHotKeybinder.disableHotKey(); + this._menuHotKeybinder.enableHotKey(() => this.toggleMenus()); + } + + if(this._menuKeyBindingKey){ + this._menuKeyBindingKey = Gtk.accelerator_parse(this._menuKeyBindingKey)[0]; + } + if(this._runnerKeyBindingKey){ + this._runnerKeyBindingKey = Gtk.accelerator_parse(this._runnerKeyBindingKey)[0]; + } + } + } + + _onHotkey(callback) { + if(this._settings.get_boolean('disable-hotkey-onkeyrelease')) + callback(); + else + this._onHotkeyRelease(callback); + } + + _onHotkeyRelease(callback) { + let activeMenu = this._settingsControllers[this.currentMonitorIndex]._menuButton.getActiveMenu() || ((this.runnerMenu && this.runnerMenu.arcMenu.isOpen) ? this.runnerMenu.arcMenu : null); + let focusPanel; + + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL) + focusPanel = this.panel; + else + focusPanel = this.panel._allDocks[0].dash; + + let focusTarget = activeMenu ? + (activeMenu.actor || activeMenu) : focusPanel; + + this.disconnectKeyRelease(); + + this.keyInfo = { + pressId: focusTarget.connect('key-press-event', () => this.disconnectKeyRelease()), + releaseId: focusTarget.connect('key-release-event', (actor, event) => { + this.disconnectKeyRelease(); + + if (this._menuKeyBindingKey === event.get_key_symbol()) { + callback(); + } + + if (this._runnerKeyBindingKey === event.get_key_symbol()) { + callback(); + } + }), + target: focusTarget + }; + + focusTarget.grab_key_focus(); + } + + disconnectKeyRelease() { + if (this.keyInfo && this.keyInfo.target) { + this.keyInfo.target.disconnect(this.keyInfo.pressId); + this.keyInfo.target.disconnect(this.keyInfo.releaseId); + this.keyInfo = 0; + } + } + + // Place the menu button to main panel as specified in the settings + _setButtonPosition() { + if (this._isButtonEnabled()) { + this._removeMenuButtonFromMainPanel(); + this._addMenuButtonToMainPanel(); + this._setMenuPositionAlignment(); + } + } + + _setMenuPositionAlignment(){ + this._menuButton.setMenuPositionAlignment(); + } + + // Change the menu button appearance as specified in the settings + _setButtonAppearance() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + this._menuButton.container.set_width(-1); + this._menuButton.container.set_height(-1); + menuButtonWidget.actor.show(); + switch (this._settings.get_enum('menu-button-appearance')) { + case Constants.MenuButtonAppearance.TEXT: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.showPanelText(); + break; + case Constants.MenuButtonAppearance.ICON_TEXT: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelIcon(); + menuButtonWidget.showPanelText(); + menuButtonWidget.setPanelTextStyle('padding-left: 5px;'); + break; + case Constants.MenuButtonAppearance.TEXT_ICON: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelText(); + menuButtonWidget.setPanelTextStyle('padding-right: 5px;'); + menuButtonWidget.showPanelIcon(); + break; + case Constants.MenuButtonAppearance.NONE: + menuButtonWidget.actor.hide(); + this._menuButton.container.set_width(0); + this._menuButton.container.set_height(0); + break; + case Constants.MenuButtonAppearance.ICON: /* falls through */ + default: + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelIcon(); + } + this._setMenuButtonArrow(); + } + } + _setMenuButtonArrow() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + if (this._settings.get_boolean('enable-menu-button-arrow')) { + menuButtonWidget.hideArrowIcon(); + menuButtonWidget.showArrowIcon(); + } else { + menuButtonWidget.hideArrowIcon(); + } + } + } + + // Update the text of the menu button as specified in the settings + _setButtonText() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + // Update the text of the menu button + let menuButtonWidget = this._menuButton.menuButtonWidget; + let label = menuButtonWidget.getPanelLabel(); + + let customTextLabel = this._settings.get_string('custom-menu-button-text'); + label.set_text(customTextLabel); + } + } + + // Update the icon of the menu button as specified in the settings + _setButtonIcon() { + let path = this._settings.get_string('custom-menu-button-icon'); + let menuButtonWidget = this._menuButton.menuButtonWidget; + let stIcon = menuButtonWidget.getPanelIcon(); + + let iconString = Utils.getMenuButtonIcon(this._settings, path); + stIcon.set_gicon(Gio.icon_new_for_string(iconString)); + } + + // Update the icon of the menu button as specified in the settings + _setButtonIconSize() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + let stIcon = menuButtonWidget.getPanelIcon(); + let iconSize = this._settings.get_double('custom-menu-button-icon-size'); + let size = iconSize; + stIcon.icon_size = size; + } + } + + _setButtonIconPadding() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let padding = this._settings.get_int('button-padding'); + if(padding > -1) + this._menuButton.style = "-natural-hpadding: " + (padding * 2 ) + "px; -minimum-hpadding: " + padding + "px;"; + else + this._menuButton.style = null; + + let parent = this._menuButton.get_parent(); + if(!parent) + return; + let children = parent.get_children(); + let actorIndex = 0; + + if (children.length > 1) { + actorIndex = children.indexOf(this._menuButton); + } + + parent.remove_child(this._menuButton); + parent.insert_child_at_index(this._menuButton, actorIndex); + } + } + + // Get the current position of the menu button and its associated position order + _getMenuPosition() { + let offset = this._settings.get_int('menu-button-position-offset'); + switch (this._settings.get_enum('position-in-panel')) { + case Constants.MenuPosition.CENTER: + return [offset, 'center']; + case Constants.MenuPosition.RIGHT: + // get number of childrens in rightBox (without arcmenu) + let n_children = Main.panel._rightBox.get_n_children(); + n_children -= Main.panel.statusArea.ArcMenu !== undefined; + // position where icon should go, + // offset = 0, icon should be last + // offset = 1, icon should be second last + const order = Math.clamp(n_children - offset, 0, n_children); + return [order, 'right']; + case Constants.MenuPosition.LEFT: + default: + return [offset, 'left']; + } + } + + _configureActivitiesButton(){ + let isActivitiesButtonPresent = Main.panel.statusArea.activities && Main.panel.statusArea.activities.container && Main.panel._leftBox.contains(Main.panel.statusArea.activities.container); + let showActivities = this._settings.get_boolean('show-activities-button'); + + let container = Main.panel.statusArea.activities.container; + let parent = container.get_parent(); + let index = 0; + if(this._settings.get_enum('position-in-panel') === Constants.MenuPosition.LEFT && + this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL && + this._settings.get_int('menu-button-position-offset') == 0) + index = 1; + + if(showActivities && !isActivitiesButtonPresent){ + parent ? parent.remove_child(container) : null; + Main.panel._leftBox.insert_child_at_index(this._activitiesButton.container, index); + } + else if(!showActivities && isActivitiesButtonPresent) + Main.panel._leftBox.remove_child(Main.panel.statusArea.activities.container); + } + + // Check if the activities button is present on the main panel + _isActivitiesButtonPresent() { + return (this._activitiesButton && + this._activitiesButton.container && + Main.panel._leftBox.contains(this._activitiesButton.container)); + } + + // Add or restore the activities button on the main panel + _addActivitiesButtonToMainPanel() { + if (!this._isActivitiesButtonPresent()) { + // Retsore the activities button at the default position + let parent = this._activitiesButton.container.get_parent(); + if(!parent) + Main.panel._leftBox.insert_child_at_index(this._activitiesButton.container, 0); + } + } + + // Add the menu button to the main panel + _addMenuButtonToMainPanel() { + let [position, box] = this._getMenuPosition(); + this.panel.addToStatusArea('ArcMenu', this._menuButton, position, box); + } + + // Remove the menu button from the main panel + _removeMenuButtonFromMainPanel() { + this.panel.menuManager.removeMenu(this._menuButton.arcMenu); + this.panel.menuManager.removeMenu(this._menuButton.arcMenuContextMenu); + this.panel.statusArea['ArcMenu'] = null; + } + + // Enable the menu button + enableButton(index) { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.DASH){ + this.dashIndex = index; + this.reEstablishDash(); + } + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + this._addMenuButtonToMainPanel(); + } + + this._menuButton.initiate(); + } + + reEstablishDash(){ + const DashToDock = this.panel._allDocks[this.dashIndex].dash; + if(!DashToDock){ + global.log("ArcMenu Error - Failed to place ArcMenu in Dash-to-Dock"); + return; + } + + const DashContainer = DashToDock._dashContainer; + + DashToDock.arcMenuEnabled = true; + this.oldShowAppsIcon = DashToDock._showAppsIcon; + + DashContainer.remove_child(DashToDock._showAppsIcon); + DashToDock._showAppsIcon = this.menuButtonAdjustedActor; + DashContainer.add_child(DashToDock._showAppsIcon); + + this._setButtonIcon(); + const IconSize = DashToDock.iconSize; + this._menuButton.menuButtonWidget.icon.setIconSize(IconSize); + + DashToDock.updateShowAppsButton(); + + this.hoverID = this.menuButtonAdjustedActor.child.connect('notify::hover', () => { + DashToDock._syncLabel(this.menuButtonAdjustedActor, null); + }); + + this.hidingID = Main.overview.connect('hiding', () => { + DashToDock._labelShowing = false; + this.menuButtonAdjustedActor.hideLabel(); + }); + + if(this.isPrimary){ + this.oldDashOnDestroy = this.panel._deleteDocks; + this.panel._deleteDocks = () => { + if(this.hoverID){ + this.menuButtonAdjustedActor.child.disconnect(this.hoverID); + this.hoverID = null; + } + + if(this.hidingID){ + Main.overview.disconnect(this.hidingID); + this.hidingID = null; + } + + const AllDocks = this.panel._allDocks; + + if(!AllDocks.length) + return; + + AllDocks.forEach(dock => { + let dash = dock.dash; + if(dash._dashContainer.contains(dash._showAppsIcon)) + dash._dashContainer.remove_child(dash._showAppsIcon); + dash._showAppsIcon = this.oldShowAppsIcon; + dash._dashContainer.add_child(dash._showAppsIcon); + dash.arcMenuEnabled = false; + }); + + this.oldDashOnDestroy.call(this.panel, ...arguments); + this.panel._deleteDocks = this.oldDashOnDestroy; + }; + } + } + + _disableButton() { + this._removeMenuButtonFromMainPanel(); + this._addActivitiesButtonToMainPanel(); + this._menuButton.destroy(); + } + + _isButtonEnabled() { + return this.panel.statusArea['ArcMenu'] !== null; + } + + destroy() { + if(this.runnerMenu){ + this.runnerMenu.destroy(); + } + this.settingsChangeIds.forEach(id => this._settings.disconnect(id)); + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(this.panel === null || this.panel._allDocks.length === 0){ + this._menuButton.destroy(); + } + else{ + const DashToDock = this.panel._allDocks[this.dashIndex].dash; + const DashContainer = DashToDock._dashContainer; + if(this.panel._allDocks[this.dashIndex] && DashToDock && DashToDock.arcMenuEnabled){ + if(this.hoverID){ + this.menuButtonAdjustedActor.child.disconnect(this.hoverID); + this.hoverID = null; + } + + if(this.hidingID){ + Main.overview.disconnect(this.hidingID); + this.hidingID = null; + } + + if(this.panel._allDocks[this.dashIndex]){ + DashToDock.arcMenuEnabled = false; + if(DashContainer.contains(DashToDock._showAppsIcon)) + DashContainer.remove_child(DashToDock._showAppsIcon); + DashToDock._showAppsIcon = this.oldShowAppsIcon; + DashContainer.add_child(DashToDock._showAppsIcon); + this.panel._deleteDocks = this.oldDashOnDestroy; + DashToDock.updateShowAppsButton(); + } + } + this._addActivitiesButtonToMainPanel(); + this._menuButton.destroy(); + } + } + else if(this.panel == undefined) + this._menuButton.destroy(); + else if (this._isButtonEnabled()) { + this._disableButton(); + } + + if(this.isPrimary){ + this.disconnectKeyRelease(); + this._menuHotKeybinder.destroy(); + this._keybindingManager.destroy(); + this._hotCornerManager.destroy(); + } + this._settings = null; + this._activitiesButton = null; + this._menuButton = null; + delete global.toggleArcMenu; + } +}; diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/extension.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/extension.js new file mode 100644 index 0000000..d101a31 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/extension.js @@ -0,0 +1,307 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {GLib, Gio, St} = imports.gi; +const Constants = Me.imports.constants; +const Controller = Me.imports.controller; +const Config = imports.misc.config; +const ShellVersion = parseFloat(Config.PACKAGE_VERSION); + +const Main = imports.ui.main; +const Util = imports.misc.util; +const Utils = Me.imports.utils; + +// Initialize panel button variables +let settings; +let settingsControllers; +let extensionChangedId; +let dockToggleID; +let dockExtension; +let enableTimeoutID; + +// Initialize menu language translations +function init() { + ExtensionUtils.initTranslations(Me.metadata['gettext-domain']); +} + +// Enable the extension +function enable() { + if (ShellVersion < 3.39 && ShellVersion >= 3.36) + throw new Error(`ArcMenu v${Me.metadata.version} does not work on GNOME Shell version ${ShellVersion}. Please visit https://extensions.gnome.org/extension/3628/arcmenu/ and download ArcMenu v17`); + else if (ShellVersion < 3.36) + throw new Error(`GNOME Shell version ${ShellVersion} is not supported. Please visit https://extensions.gnome.org/extension/1228/arc-menu/ which supports GNOME Shell versions 3.14 - 3.34`); + + enableTimeoutID = GLib.timeout_add(0, 300, () => { + if(imports.gi.Meta.is_wayland_compositor()) + Me.metadata.isWayland = true; + else + Me.metadata.isWayland = false; + + settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + settings.connect('changed::multi-monitor', () => _multiMonitorChanged()); + settings.connect('changed::arc-menu-placement', () => _placementChanged()); + settingsControllers = []; + + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + Utils.createStylesheet(settings); + let stylesheet = Utils.getStylesheet(); + if(Me.stylesheet) + theme.unload_stylesheet(Me.stylesheet); + Me.stylesheet = stylesheet; + theme.load_stylesheet(Me.stylesheet); + + let avaliablePlacementArray = settings.get_default_value('available-placement').deep_unpack(); + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); + + _enableButtons(); + + // dash to panel might get enabled after Arc-Menu + extensionChangedId = Main.extensionManager.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === 'dash-to-panel@jderose9.github.com') { + _disconnectDtpSignals(); + + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + let isEnabled = extension.state === 1 ? true : false; + + setAvaliablePlacement(Constants.ArcMenuPlacement.DTP, isEnabled); + + if(isEnabled && (arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || arcMenuPlacement === Constants.ArcMenuPlacement.DTP)){ + _connectDtpSignals(); + _enableButtons(); + } + } + + if ((extension.uuid === "dash-to-dock@micxgx.gmail.com" || extension.uuid === "ubuntu-dock@ubuntu.com")) { + _disconnectDtdSignals(); + + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + let isEnabled = extension.state === 1 ? true : false; + + if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!_getDockExtensions() || !isEnabled) + setAvaliablePlacement(Constants.ArcMenuPlacement.DASH, false); + else{ + _connectDtdSignals(); + setAvaliablePlacement(Constants.ArcMenuPlacement.DASH, true); + } + _disableButtons(); + _enableButtons(); + } + } + }); + + // listen to dash to panel / dash to dock if they are compatible and already enabled + _connectDtdSignals(); + _connectDtpSignals(); + enableTimeoutID = null; + return GLib.SOURCE_REMOVE; + }); +} + +function disable() { + if(enableTimeoutID){ + GLib.source_remove(enableTimeoutID); + enableTimeoutID = null; + } + if(extensionChangedId){ + Main.extensionManager.disconnect(extensionChangedId); + extensionChangedId = null; + } + + _disconnectDtpSignals(); + _disconnectDtdSignals(); + + _disableButtons(); + settingsControllers = null; + + settings.run_dispose(); + settings = null; +} + +function setAvaliablePlacement(placement, state){ + let avaliablePlacementArray = settings.get_value('available-placement').deep_unpack(); + if(avaliablePlacementArray[placement] !== state){ + avaliablePlacementArray[placement] = state; + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); + } +} + +function _connectDtpSignals() { + if(global.dashToPanel) + global.dashToPanel._amPanelsCreatedId = global.dashToPanel.connect('panels-created', () => _enableButtons()); +} + +function _disconnectDtpSignals() { + if(global.dashToPanel?._amPanelsCreatedId){ + global.dashToPanel.disconnect(global.dashToPanel._amPanelsCreatedId); + delete global.dashToPanel._amPanelsCreatedId; + } +} + +function _connectDtdSignals(){ + dockExtension = _getDockExtensions(); + if(dockExtension){ + let dock = dockExtension.stateObj.dockManager; + dockToggleID = dock.connect("toggled",() => { + _disableButtons(); + _enableButtons(); + }); + } +} + +function _disconnectDtdSignals() { + if(dockExtension){ + let dock = dockExtension.stateObj.dockManager; + if(dock && dockToggleID){ + dock.disconnect(dockToggleID); + dockToggleID = null; + } + } +} + +function _placementChanged() { + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + + _disconnectDtdSignals(); + _disconnectDtpSignals(); + + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + _connectDtpSignals(); + else if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + _connectDtdSignals(); + + _disableButtons(); + _enableButtons(); +} + +function _multiMonitorChanged() { + _disableButtons(); + _enableButtons(); +} + +function _getDockExtensions(){ + let dashToDock = Main.extensionManager.lookup("dash-to-dock@micxgx.gmail.com"); + let ubuntuDash = Main.extensionManager.lookup("ubuntu-dock@ubuntu.com"); + let dock; + if(dashToDock?.stateObj?.dockManager) + dock = dashToDock; + if(ubuntuDash?.stateObj?.dockManager) + dock = ubuntuDash; + return dock; +} + +function _enableButtons() { + let avaliablePlacementArray = settings.get_value('available-placement').deep_unpack(); + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = false; + + let multiMonitor = settings.get_boolean('multi-monitor'); + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + + dockExtension = _getDockExtensions(); + + if(arcMenuPlacement == Constants.ArcMenuPlacement.DASH && dockExtension){ + avaliablePlacementArray[Constants.ArcMenuPlacement.DASH] = true; + + let dock = dockExtension.stateObj.dockManager; + if(dock?._allDocks.length){ + let docksLength = multiMonitor ? dock._allDocks.length : 1; + for(var index = 0; index < docksLength; index++){ + if(!dock._allDocks[index].dash.arcMenuEnabled){ + let settingsController = new Controller.MenuSettingsController(settings, settingsControllers, dock, + index, Constants.ArcMenuPlacement.DASH); + settingsController.monitorIndex = dock._allDocks[index].dash._monitorIndex; + settingsController.enableButton(index); + settingsController.bindSettingsChanges(); + settingsControllers.push(settingsController); + } + } + } + } + else{ + let isDtPLoaded = false; + let panelArray = [Main.panel]; + if(global.dashToPanel && global.dashToPanel.panels){ + panelArray = global.dashToPanel.panels.map(pw => pw); + isDtPLoaded = true; + } + + let panelLength = multiMonitor ? panelArray.length : 1; + for(var index = 0; index < panelLength; index++){ + let panel = isDtPLoaded ? panelArray[index].panel : panelArray[index]; + let panelParent = panelArray[index]; + + let isPrimaryStandAlone = isDtPLoaded ? ('isPrimary' in panelParent && panelParent.isPrimary) && panelParent.isStandalone : false; + + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL && isPrimaryStandAlone){ + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = true; + panel = Main.panel; + } + + if(isDtPLoaded) + avaliablePlacementArray[Constants.ArcMenuPlacement.DTP] = true; + else + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = true; + + if (panel.statusArea['ArcMenu']) + continue; + else if (settingsControllers[index]) + _disableButton(settingsControllers[index], 1); + + let settingsController = new Controller.MenuSettingsController(settings, settingsControllers, panel, + index, Constants.ArcMenuPlacement.PANEL); + + settingsController.monitorIndex = panelParent.monitor?.index; + + if(isDtPLoaded) + panel._amDestroyId = panel.connect('destroy', () => extensionChangedId ? _disableButton(settingsController, 1) : null); + + settingsController.enableButton(); + settingsController.bindSettingsChanges(); + settingsControllers.push(settingsController); + } + } + + if(!Utils.getArraysEqual(settings.get_value('available-placement').deep_unpack(), avaliablePlacementArray)) + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); +} + +function _disableButtons(){ + for (let i = settingsControllers.length - 1; i >= 0; --i) { + let sc = settingsControllers[i]; + _disableButton(sc, 1); + } +} + +function _disableButton(controller, remove) { + if(controller.panel._amDestroyId){ + controller.panel.disconnect(controller.panel._amDestroyId); + delete controller.panel._amDestroyId; + } + + controller.destroy(); + + if(remove) + settingsControllers.splice(settingsControllers.indexOf(controller), 1); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/helper.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/helper.js new file mode 100644 index 0000000..9dbc4d2 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/helper.js @@ -0,0 +1,227 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Gio, GObject, Gtk, Meta, Shell} = imports.gi; +const Constants = Me.imports.constants; +const Main = imports.ui.main; +const Util = imports.misc.util; + +const MUTTER_SCHEMA = 'org.gnome.mutter'; + +var MenuHotKeybinder = class { + constructor() { + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + + this.hotKeyEnabled = false; + this._ignoreHotKeyChangedEvent = false; + + this._mutterSettings = new Gio.Settings({ 'schema': MUTTER_SCHEMA }); + + this._oldOverlayKey = this._mutterSettings.get_value('overlay-key'); + + this._overlayKeyChangedID = this._mutterSettings.connect('changed::overlay-key', () => { + if(!this._ignoreHotKeyChangedEvent) + this._oldOverlayKey = this._mutterSettings.get_value('overlay-key'); + }); + + this._mainStartUpComplete = Main.layoutManager.connect('startup-complete', () => this._setHotKey()); + } + + enableHotKey(menuToggler){ + this._menuToggler = menuToggler; + + this._ignoreHotKeyChangedEvent = true; + + this._mutterSettings.set_string('overlay-key', Constants.SUPER_L); + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP); + + this.hotKeyEnabled = true; + if(!Main.layoutManager._startingUp) + this._setHotKey(); + this._ignoreHotKeyChangedEvent = false; + } + + disableHotKey(){ + this._ignoreHotKeyChangedEvent = true; + this._mutterSettings.set_value('overlay-key', this._oldOverlayKey); + if(this.overlayKeyID){ + global.display.disconnect(this.overlayKeyID); + this.overlayKeyID = null; + } + if(this.defaultOverlayKeyID){ + GObject.signal_handler_unblock(global.display, this.defaultOverlayKeyID); + this.defaultOverlayKeyID = null; + } + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW); + + this.hotKeyEnabled = false; + this._ignoreHotKeyChangedEvent = false; + } + + _setHotKey(){ + if(this.hotKeyEnabled){ + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP); + + //Find signal ID in Main.js that connects 'overlay-key' to global.display and toggles Main.overview + let [bool,signal_id, detail] = GObject.signal_parse_name('overlay-key', global.display, true); + this.defaultOverlayKeyID = GObject.signal_handler_find(global.display, GObject.SignalMatchType.ID, signal_id, detail, null, null, null); + + //If signal ID found, block it and connect new 'overlay-key' to toggle ArcMenu. + if(this.defaultOverlayKeyID){ + GObject.signal_handler_block(global.display, this.defaultOverlayKeyID); + this.overlayKeyID = global.display.connect('overlay-key', () => { + this._menuToggler(); + }); + } + else + global.log("ArcMenu Error - Failed to set Super_L hotkey"); + } + } + + destroy() { + if(this._overlayKeyChangedID){ + this._mutterSettings.disconnect(this._overlayKeyChangedID); + this._overlayKeyChangedID = null; + } + this.disableHotKey(); + if (this._mainStartUpComplete) { + Main.layoutManager.disconnect(this._mainStartUpComplete); + this._mainStartUpComplete = null; + } + } +}; + +var KeybindingManager = class { + constructor(settings) { + this._settings = settings; + this._keybindings = new Map(); + } + + bind(keybindingNameKey, keybindingValueKey, keybindingHandler) { + if (!this._keybindings.has(keybindingNameKey)) { + this._keybindings.set(keybindingNameKey, keybindingValueKey); + + Main.wm.addKeybinding(keybindingValueKey, ExtensionUtils.getSettings(), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP, + keybindingHandler); + } + } + + unbind(keybindingNameKey) { + if (this._keybindings.has(keybindingNameKey)) { + let keybindingValueKey = this._keybindings.get(keybindingNameKey); + Main.wm.removeKeybinding(keybindingValueKey); + this._keybindings.delete(keybindingNameKey); + } + } + + unbindAll() { + this._keybindings.forEach((value, key) => { + Main.wm.removeKeybinding(value); + this._keybindings.delete(key); + }); + } + + destroy() { + this.unbindAll(); + } +}; + +var HotCornerManager = class { + constructor(settings, menuToggler) { + this._settings = settings; + this._menuToggler = menuToggler; + this._hotCornersChangedId = Main.layoutManager.connect('hot-corners-changed', () => this._setCustomHotCorners()); + } + + _setCustomHotCorners() { + let hotCornerAction = this._settings.get_enum('hot-corners'); + + if(hotCornerAction === Constants.HotCornerAction.DISABLED) + this.disableHotCorners(); + else if(hotCornerAction === Constants.HotCornerAction.TOGGLE_ARCMENU || hotCornerAction === Constants.HotCornerAction.CUSTOM) + this.modifyHotCorners(); + } + + _getHotCorners() { + return Main.layoutManager.hotCorners; + } + + restoreDefaultHotCorners() { + Main.layoutManager._updateHotCorners(); + } + + disableHotCorners() { + let hotCorners = this._getHotCorners(); + hotCorners.forEach((corner) => { + if(corner){ + corner._toggleOverview = () => { }; + corner._pressureBarrier._trigger = () => { }; + } + }); + } + + modifyHotCorners() { + let hotCorners = this._getHotCorners(); + let hotCornerAction = this._settings.get_enum('hot-corners'); + + hotCorners.forEach((corner) => { + if (corner) { + corner._toggleOverview = () => { }; + corner._pressureBarrier._trigger = () => { + corner._pressureBarrier._isTriggered = true; + if(corner._ripples) + corner._ripples.playAnimation(corner._x, corner._y); + else + corner._rippleAnimation(); + if(hotCornerAction == Constants.HotCornerAction.TOGGLE_ARCMENU) + this._menuToggler(); + else if(hotCornerAction == Constants.HotCornerAction.CUSTOM){ + let cmd = this._settings.get_string('custom-hot-corner-cmd'); + if(cmd == "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else if(cmd == "ArcMenu_RunCommand") + Main.openRunDialog(); + else + Util.spawnCommandLine(this._settings.get_string('custom-hot-corner-cmd')); + } + corner._pressureBarrier._reset(); + }; + } + }); + } + + destroy() { + if (this._hotCornersChangedId>0) { + Main.layoutManager.disconnect(this._hotCornersChangedId); + this._hotCornersChangedId = 0; + } + + this.restoreDefaultHotCorners(); + } +}; diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..f06173f8a34144617298f671be8f917e5feaaca6 GIT binary patch literal 3183 zcmai!TWl0n7{`x_s09)5#zp0L2ihqrQOQyZ+Y3->Y13_un3y=bdv-grJG0E3Z7GQ{ zy;3(ZQ6fI*g8@={u?4oJEk)leBb~3 zW`Ewi<{U%YgZ>oy7xyq$53aut540_77`q?b3O)+%04u<~;CiqYd>A|mJ_sHM@ndm3 z9s<+gCh#P<790TAfrXG?f*j)u;M3p_A%6j@F#a1PJ5_K3uk4MG`$4+*AV}-S!ufZ> z4H&;4jx*o`7@q{60DHmh;AbG6n*#A;^LRW0eh=;de*&Ke{|M(d!g-31huj5{-PgdE z!3aok#Y5U4`Fk29KR*VyfS-b--zAXlFNWjq!tsybHss(Ih#&hMmyo}Ifu#2aI6?7k z2Ok4>gXGr%Jjm`5koLtu%I60l+4%^392^8GA76nK-xT-)cndrV-UbhVQ8>2|>;uW( z*>L;~NOrG+Pl7i=9AUqO<3B<2V=W#uzX{w0ZUgs%4d7PrRJeW?Bs*V&RD-i1>G>;I z39f^vo543hOtH5?^1l-_z%)qq&Vf`vS3uf#6C^(s_&RtSr2JMQ81idBNc$T=iZ6}_ zWY;+bmKx=(IvkOHtJ{m1Apa>Bt;#MOcU`B4TkxI7g=ZxNr`hm2 z?a3jt+i@)^Ja)v%3Z}!P2RH2`?;v0G$b+w}S)`uuUR#={BD^NnWu;_o z6|bq6ZiX1m=%Eh07W+IY!n}s>T1_n&J+ypUOg*}jR~Y6XyXdya zg3(|~5#h%hqwPjZtI-hUM_MB-O_lGp9&4;;Objg_XiO37%s%oX*EUn(bZ-97^I!05Lsyj!(#ZyL3tsqZ{W?~0J=)R(w!WHL9(B)*RIhZPjvaN7QjZ#oJ z*%#QFL4Nv15qsgl=VDAm2&nmR8G3 zVfi(vl5&$;SuKRV^(yj-Jci#?P^)*;aS|n4@CUe}7yOZot1DE*L88h^Z-tAc%Vtp) G6YL+~Zh#>G literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..11c483bc8d12d3edd1091dc897c3e76735401a3c GIT binary patch literal 33098 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 bg38J<;1*dio7I~*U4ZTQ-yMhl355Rv7oLyQ literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9cb7eafac41391303fb34b969920f40ec8d065ff GIT binary patch literal 3558 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 PchBtbRycn~jcfiFBWlMC literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..178df95ec02b68b8df26bfe0f766e7b3ba728a46 GIT binary patch literal 22694 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 J8M2@0{6B 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..b9d0c76a4f6ff2a639308eb182b50a59081f93fe GIT binary patch literal 9736 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 tb76(A9cA^w?pF# zM^r|1SRH0m)L|K;JL2NtxH5{5L0esMM_gZwj5E%NvLic-;)7LZ)tT?_JnGi%?tI98 z_I^11t#j%;|L1@H=YLLx@1Azd9|!!_EeL}1;N2$%!Mk`q>2#$ALG$b&I0fDeSHai8 zW8wX9F?Rt@Jv{PDt|j%4c`gR zg`a~<;di0xc@C=FX}mlMUIf+Ndbkk2$faKc)!$uk4crY+fUj}y-vrfn+ddjd)>PeZly8+aT%^?W;?GojiG;c|Edl>A-}x4}E$3iwsn3!iiE zFTNlM_%9gZkK|H^n&&Af`Q8iF?t}0m_<5*&KXmCofs)s;7uxwd9bQFz4g3!zf{#H|FZc$0 zA$$f(&SxyM^(})ce>qh7mqE>M0z-HkycpgGRql&W{rd(~`%gmY>C;f{E7AW}-Ldi3N>*2eh^yqIK zABSfU|0gJYc@CO+VK9h1I322<%U}=O4y6ZesQw;;lJ{pIDjs|jGPS|8P~$!YUL|@qHVr{->eJ9nGYu-z(vK`k^M4UMhIk)T`D>uo z_kc^k32Hs=gVKvS)HrU1>gVln2Yfr!xV{6AgWrQ%hd+dfGB}M%mK-mK>dyd_+c`cN*Fov?UZ{Q~Q1vw6iSSiWa(E-eWCd?^@9&4b z#6J#I-#`0j2*>!S!&#T67d%3NM2dD7}BD<5!^c|EM0T=NqBy$!@6j6R7$# zsD8g5s+~Kb?&V$m+wQw=K8fx5wQ1aOA(r<#2 zdkvlhGxz>BsCl>(YQOk%D7nlyeg{fkKZ9!Tgmrd)&w`4tfh^_V3dj-)BB=h{0Yi8X zyb^vAO1{5@8s7qhxfmYrxD-l0E1=4+gX(8LM5MtGlzd(ZC5N{`stP^pI!_iEZ+B*SC-ix8+z0`3zRQXC>+op!YN&c%2i5Ld zA*MRG8!mx=1+}gpg=+sFp!)TFsQk}B_2=hM4&$;w5xCg4-E1~B5ZYceFFI2zp zhtkJ~q1t&AYW+L~HDAv{jpG+^2|RkEo!=Kg&FgBY{FlL1@M3#H#RcsjfpN^Wm}8sB>yKMd90BT({s5~`gaLrg;Oukb9mn$D`+ zCU_nkgX+i4Q2xeUQ04yuY8;<}8vi$;^i)ow>RAj`ZY9*Z*a}r|3u=CDhnkN+g3{-E zpyc%lsCoUYi+>qPU%w79nZYlh`my3_e1EtVhVboB^Yl^3)CP}3rY2a7kT$^WQ1YLK zlGB^vZuqBg8~h2BJT_iy=VLPri4Qt9p!D=EDES|Pny;_I9q=i*6ZZDo^jjSN5S~x^ zA-D{F4r*Qf0IK{CVF-T<)$a>8*>!b2l)T;sC9n5Evp(U4#J>R5kEfvIb?Ro@@3W!i z;UcJYvjIxqFNdmUvwOeW@%NzQ(SR4g--pU~AJjZQ==f=<_4Q?_dHOr3{yhm*|IeZ9 zQLx3X`%9qoatl;FJK;HSFVwu>3{~GPQ1#pa)$Tn|^YlSD2_J@P@1m_%ZfjsK@pW(o zd^waHZ-=Vy9;or(4=eEF@K$&}lPvkY6Dt3QpyumxE#h%{ksFMh4(?#^O)m5LdpMGsDAzio&Xo2tjEGL;BoLAsBtZW%HQMS zeNg@122X^)%R%t!8@Sp`?yR03{-uOL+R_2Q2Kh*b=Ge7z{`m5fg9i-IDQhU zzGtBH<@^CVzKu}hekoLcZiI_q9co^u9p3^a-+LWD0@o0qfve$KTT5zYj_ut5D;-6>9$94j00Axc7es&m;a3sQx|%&xTJ!l{+lJ<7XA{Bz!gJQ{!>tLz749sZ-kP^yWmOi0T+K5O1~e2s{i}Y$aC2G z0UKc-=?%CDeh^9zJ_e;fpMo0iSD@PaI#j-IL+RTOpxXTn)VwUAlZ)Zm@D#WTs=kfz zRCo=P9*jWM(}a@atDwrg39f{H0yQ6>fs(_wpvLucsCilNQd{prsD3ShYv7qKeKV9? zu7j%gCb$6JLeTGZg!>7pBJTH(aEUUx-|bLiKZUf@OX)X~_HDv92>+Gv2;tudXOrg* zaE;6R49~A8sNrdm-x7=9DHsvHM0h*lVM6)$zlpq$(Btaz?^^ER$Bw^-$GJQ&=J_I? zmlJy3`!~Y>MEEK}cYs4szY}=g3;%&2`=OuoKsxMypX1?V^2v@#hY`J*OAxdP-z6N) z`wIv&JpUQN|9+Q;y9wX%3Gh@xFL^H^yohI(b}&IWgZNjVe$vscgclP23*lVCI|;WE z{(#_rFL4iFgG{aY{Uv`{Ccz&QswM^ffvc(iB*HG9|BCS6+&kfIrRVd=v)09LhD(XB zD82t4&)W(62u~7@BIx%5^69t5A{c<5B%JBem3%JG+u$n*uTla(*`f7>YY1;5==Tdk zOqe9>Civfllz*DY1B43+A8;?U7Op3J(Zv^%?^vE2gvSVLT_4`XGcJ?)JjEW%>? z@VD?}!VQFB!Yc_m;ZB18y^M#m$om}J?-FlKqQNn8p7ZLUl#tHh}MfexO3fj`| zqZYx39fiLj{1IURdAWG;e|Cv?z_Z=+@s!`}o;`lZ!>0&S zKEd(*@GYgZbv(b9a0TIULg@PY8=lYS`D5_!3HrU2u-H7Yzr!BFIpkRbSGsiJUkOb@ zM)*GA41#_q5-uZLO8Ae2kZ=^`PbBQ%`JV~Pcs`Aw-?4BhtPp;W@O8pTgq807y*$5z z@YjU$?+Zl!)Fmt;@8@}5ML61}9e|%89K*X0!Q%-B38xYMgzzK6sl3|+FChGca0=ni z3Htp$;aBF#{<+xo=MtAT3LhkV%f+vTe@FN~im#}I^|Tci><`CUQ6Pb6QJVHihcqEZmXi zB(@rHD^$L;QGPi*6}P66_+ZdqsVIb-+gYC0!_mpKm5-|>(ze9=qjoJ1_hi(uC27Uu zdD^0C^Ky`3sKYiE&09g9hTEbk%H*yP3Dar26^KbW>^m2kY4j#slMZ~K56 zSR3w+>*-XyHbe%4X(ib|T?{r881{xq?q?JyzqPij!Z#Lto6*b0VJ^K0L9g%7KHyodg8WYSx)To46 zoQIA0U^vNqjNAE$+IkOglcV$?uMZqb(yoXpD#eEpQi67Na?Gs;{o9`8yP|z$YNcqE{)YSFEUBO*zGmCisVI+H zR%b^iqh=gzipHzKrZlbAqgFNJsZ~MWtUkNQXmTt0s56Vrnux-2tFMVhzp0()X(J0Z zM|nJ9HMH{>?n<)Uze0tyWXuZdq>Z-sne{{saU+jg4sj*eY~~TU)zEzuwxhTHl@xDW zOD|0KhY`Ax#Z9z>g+gtUX-bEqupZ}=X~pzh`OyTXFq9VfuGpOWTP(pStkGjt*KEa7 zp7FF^N0Blugf{h=6_g%qgmks8nejP%gRYvXh{c*ut0trVH8ZhAx6~7>h{~aukJAbsG}BE9Ba+kjIs0W z1V#tKvB|g|heJ_4?n)Rj(qTA8`ZkkG3wy$?w=}V2>vq-!^3N|85O1Gj(i@_KMC_*ijU!;#3Y*+K0xN4W>JP-l_$g+pQK0AS_9=NONY#XK_Zt zN3TyB6&7b-k==F8HmlSrnR_0z%Q(!hZzh#RZL?|@leu#-V?pdQ7NHn!+2YN8yD~G@ z#?_&6S{Z3O3t85va?Z-yU(^+BiLyz}<`y=iu1Lpxma~Ky&$y9k%Wh!dTkS>z6T7S^ zIid}zJ2tl>lL?z<ReM^}T-{e08zvhR&sIlgg?#p5H{Tr9wC|(tflY8G%EhdqVmr-!!gR*M!sjFx$m$-u?LQTg6Hn5%Qm)RYI z9VzaJ{)EoZ+KsC0)S1mne_RpsID)Uh>IzK6h|D}muZ$aRV&m4KY-*pzL?q}Dy_`07 zkZ3+>REPbmp}K6!@}6wEzAxoG(wj|9EH@4G1%L)IIk}}WtQ7`n{m|ls6^=#w7Gl12Ty1roB~06{PRYPG zV>_Us;4V#vt=KuCyLN?IUgkJvmSFF~G3_!*W4zX`=%|K}ZH}froMImMXA=Xv+0ZdA zBWY$%>A?V=yVhf7o_4dnMp+!}G8P4;_vb<5a%7~N)#eO5YHA0%y%jYllkqIv9JMOJ zE)K5dPdM6c(iTmaXpc3G7+DUpyAll4F04AE)e(7@+>>4DL^#Z0Z7@PeCO419NpvQ| zM~%3$ptE(_2s21~FQdD z`rR1k%YtF`q})*D)f|(b=nYQBuy5+OsENImTW4^pO-$@sdK$ zZNe>cseNc}2#%nY`N|w=L%U_Z|6g0`E_Ar2kk(=3!<#N497Gj{_wNtv!t_UWX3p9{ zL#$A!(~iCQa<;VCdw1(LfOj0Bu$gWX&58td(Q8lH5P8pT{+!;+pDrC%&CmlYfR05n z@h+2uX=Hht%Zc9J-e45_YW`Ty$v#Gzv6ggvltcgcqyuZl6tOzlU#pRB)N}rxyO;BI z*1a0DhhWx#bK>TtyRFcrbIan^rHpCeQ#uRSiI4g#vr$aG4tf5vi5HzkgY&|?X$2ak z?g;HLxn|2&*_@m1ESyq`+X7d;T$EykcV(D;6I62a=(4$JGS^P1ow24Awikh;lL>o| zR}pi`($|TO;8=H}nO+=}XXiILm$D_!aW7qD>n(XJ3hjOdJuycO&7cIQv`=Lc~$0(ZC_I}(qixP`X2STJVYe&6sC7W;7;o&eMiLZ0sDJR(F299n>lxI*yxcw`nV3g zC0~cTmo%=>1$--u^Q-oZZR^?C$;Y*Qwm)w5Y;BD5MWHd#7jE2_pN$>vT>SCaMxb+M5X^0EpnL{&&%8w&) zOZO6-R2pH1+frj~OhvV%T1~_44bCAoreuu!-t<7^DOKw+nbIteg8pirB*>i_s_m($ zTIGHyoSHe*N>Igwn`G{(+OBcoh$YdhJPmHF#YxtfIaHml(=~3@O&1-* zdb`Ss#jLc$W>Q6QI8@Q5f1Pp*)y|?8RWmJNb>`4?p3fXQKy`>L;q2E>y1DvRwSI`z zEa}woJWXV6TyzGN;E)yVRuhKBJx!iZE4@^2DN{W{%^7PIAtFBGUEATU4Y>|Nb|D6i zA*R)86qTgP4OcN%$$eCPuh9LeD2uf(nj5efQSfnUDmFtdXJYy=&sChvm`@m`@@Z0y z=Px}FF~+1b4mMVolujOq83mH$Bh{W-HI1@%Fltq$ig20aoMzAtOUBdAQ@sffL?In! zm~GtO@bD^7=uy#ETDe#9SqIrtVI-zbv71NBaCAs7)V+NqDDP#Rk_^Q9k&}A znqRS&(h)`vP$|{&7e1u}%+qVfVMK!aI ztE|oeK8LV6=(nEif(rIB>y?PfuO+N|n(QpL&JtD|E+gYYcd0mTrT8CpJsSH%wR=?w zhqSUzu;rEdl}An0WV7*Q(KUO3OjYb3CQ6UBwwY5IJhNzPZEkq#QHYMs96|?d&Y~X9 zg=T$YUClT!r(P?JbbNb9Vjz9q^30d)o-DWeOcTXw@I~szI28rasw_E>O3YEz2yU!5 zr_o2YeU^BG!d=Q$mRMu0HLYYZn}T0{ngbd7JdS0R8pysY!HKiMr=i28^G%H}e(Ul! z8meuEQN$dVtx4=Qg9F+*(D4fQB8Xovtu}`F^vpxenTMvak=n2HwxhEpV~Q@BZJ|`J zHS32jfHpJ1>?vpz+eWy2z-!|)XTOdaT;AhVByIGX9$@_@aV3rVrS$~8K}wkOl9YXC zjV6_?*7RfrJ;CnInv~9R()wuOr39PxiEU`QI&JoFqxWVyI%!=q*-7>aX;Wmc(IK3( zoGS`n-7G0~tm;^lOu2ozpXu_Obm=iX65Z~U>{_8*oD@|$i{nzt(&Gb%HQCX;FFTgX zt5dNM*d(+v+1ObOQQ(i-b3e`XbZm1uQ`m!9)SA)9KI*~Mmg|8_AR9dE^IB28y>^?Y zO8Y`vw)~fwhvuo|`C1${j!;P-1DjHqgc0L#aL;1wQfa~1{n82xD?FLx(;ODK%V}Us zaRRIx<;r#Dv}vrr9k;s73h|ZuQIOPeROXbNFE>_|4Wz+#$EM<%^m2F7>j=Ko%-Zk( zmY)?ib4V+O)z)CI!|SkaX42~`E0wWE6QQfQ#AlFT*uvUV2{zGtl!qUl-Fl4uDVORf znzku7kaF7%Eimo6&T@JKu90J0Gt`oudcK0{Y|(WqFaB9p-e$kSQ&5RQi!>!eMx#oW zolSk7H0&a$2JTQp6hBldx%00oC;GgqYpUbb_ zjxA!_E&St1i{I`RhxHSDhOScmxYF!d{$o^_@R=4JLUovdn0=ia0M<%7=?ey&5RD^m z))=mRFpR=^@!C6Qfe-bNr4fb2TeIwVOExokW;c{6onv<7`DFeGB zHdLFk9Ju*1vjWlX3T{`*Mak@Pon=-mB;O6Tu~{Yc?u};=ETMHQn(M`|%U^PRGomqvo`Za2!hlwda){9O!m%qj6sl7GFc~OA%5Q zMHOzLm>yS`yHXfPTTCv)ULn9#Xdt9}JjNiACxD!6ch_ z(|sT9q*y7Naz+{LIj-~G^g?!7-mBe5I9g$P5l188&dc=J%%(jnaAv`PYPp-2a)#aU zAfKKNXMabvJ?27Bj_<6M;x>i(bXoh!?Cgb)QfR!-HLD_5)~_g^t0=FUD{TgA995Y? zdmJ(nNHuyh7u@xr523pY=#dx2-m`G|Fup^#e`eZWZtjYVd69t3jST-@OY&=Lr!EPS z9!XO$!x)9MrK4;((7$tFV5c`0XbM-K{yg5hP<|qItJXFLKxasbjiB2_FTT1;p_2nl zBpSxfWiAS&Q1WT$BFm?oI>iC8t#vkvEyN(rvV|-LtyQyGAQk*d84?7gZM4DdiP~W} zO3+q{8KeK);z$;HY=q{TxQ8O{%ED!sea*vnTJy1%m8A2Vxldx;9B=KJzFleK5pxwg zB16^Wdni{#@(Om)mN|y_`82nAMXH@{b;e#C8UM?fA)m%(%;eaW>C>8ACvl%t@05%y zb932iC@zd$?V3DuJ7N;J1el(dg_+`YuIq`>7*7iC4Y`&c?G~Q!FJAq2?|JxhM#nSg zIsq{W&tDehv=@|Y^g9y%jXH}yYGzguTtYQ9W=@(x4o=d#+2};3Yxs?{lqK5Tf+6fd zpRUa@h`}CRh}q+o_L-b%)173mBK5>C9(W4pH%)9+&`s7V%+oKFe}fccUQN=Hc_ru5v13VKt3CU=!CB$6@MrYeQQ1{3T|$VlGi- zbB?f$+4)DE>6s-FE!5(bkw9q$k4E*n?pU|F`zef|xpLxa-KWV&n>#twrO3s<)?#|h?3;Vd=Sk_@uzTZIxYD-OQhlAgv+i1yb66M9GJNJ?j^Q(@bIl&^ z6L(D763l&^3?I&y@g0i?>xXut-qbY^f0keZt8M<6i!YTg^w+qaMReZbb@J*g+%^Te5Q!>uS<3x5K^en3Gf&Uvul~x=Zc2-Ru{| z_1hc^=4==LpObYgj5^!T&m;bjsFRJ{u|EF&iu;D7q-M&Md{I{VK^v2qxbjN;3 zNa^DgUnJcZK30HRLZe2%W**{D6c!gSQ*N74Hn}Bj`+-FFf?VIS29SQ1XqEcg7`r=8 zXPq9H&!FbOh9*!utK57Y_aDdcWYo0%YrJo!CSk4fzvFOqctB@tdW6Q{`$ki`hhekj XpC-z&6T)eGRd2rV43elV<;C$Y@pPc^I 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..ee7d15e3041bba86b6eb203edad2c7e72837a1ef GIT binary patch literal 26175 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 BwM75` literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..7b2cd8b55f581a4e7994ab40447eae9277aef14e GIT binary patch literal 3965 zcmbW3TWl0n7{`xytrxuD{dVw*!j=V$LPcU*A)wSY-Ngq@NT$1IyCd6~&CF~oMoqye z3K|};m>|U4ED|+Wq&;@jH}_Z^-(q@G|T4cz;J5Hr_&vNG{*m=-f|vc}GcJc>w-4S8ABD27Ama;A z;@t)%&K>YNxEG3kN1*8P6_hx>%ld!F+CNE~T>K6tu0L@m`d>;ASHgMl7I+`L9~R*C za2u4o#PDkP36y<&17-csa6bGCYB(R~Pr$WM^nVAghsR(Q&Lvo}^E{+W?abPHq2%XN zcn?gV*zZCFY2N~6{u(I#!%*s~lJP?*`S>LpKaZeg-Suz-?1!W9Jy?KUh$#APfReun zcpKaam%}4)5&RX39ZeC4ZjZu+@JU#NTcND`9xjD{LD6w3lSS8Icr7##`E8Ct>yj82 zWi8R=WVSZs{c?G5-OIgzTWW_8Y_6of@V<~x_ z$4%%~3(*;w)Y;rQZrSf0+&6HO=GG;8&s6Vq@k&NsYi`MjT;B^-Z&1<$#%t)cCEt@)PFkwZ zDQ#4Jrs|Blej`wQjVSUx?VK>uZ@kC^s=pCN{#d#=dymXBQP%H1YxI~HANj}nN8HdE zsTu8@h_&iRy5t8QW>^9}09j~m5602>6#H!YrN@O3p(5Rb0KV~+mbv{b0^GEd{%37uB zeu%hOa6MgjJX2FcHRFUvho)vq5r(xp=8PH}mKyRWuryeys9|@s8l}%!_6zAEyM>A$ z*!X8@rV0jCQXOPJ`c!l58YDy~SrZ{ts0w~1ns5T63XQOCys|26@*?M%9=)Pabt}=z zg?dGQ6x4*hHQTfsU&*{MGFe`;cdMoqOdeJ~E2eFAimEtaoQ=BZ`!!YER3|e&3OPZk zdVF%9TJM!j#q~^CL8noRv>PglHAL7Rt%d^sX|&9(E$5z?>6|Imu3=O6gD5u;j=JSs zUt=`P75yIFH8hwTHsh{X$UWjjrbjQyFMc4GUzS^(*Grc6EM2l7za*dUTIYmOuE<#k zYfj_`J-Xny+*D813G{$dE;}_>uNZUO+QVVi-R*iSS?G;6NNlcXoG~2Ew0Rv^JFx0R zq>H=rUHv`>#KRF=@6jUOqI%77y$5v(H=&6hT3=k9TXtfe1XM9WZk1Q^rObQuvJp4x zQc3(_5+6$9FOzt85+Ce%x|4XHov3FsYv_LqXDEPj$ zBobsBJ!3fddCAVkDB|Hd6*6W32k3{fE$Z|ivyS1n2~HfOO-v>6yEb56-oyvn#VuL* z3?uD6lUUM140LzU!cJ~(2eUWX+?sa0$wqj~1m^9uj;Oy(ck7Xy9aBmCdD7gD3En!m z@7#-{H`0htPD=+9Oh#fUL@HI@Sc%zGt5?v9k)5;qsCVf*YD+-Q3=PyHb*QJh6et7sV1YZSX`T2dr&_X%{mk zKf7&+ls9#XbvZojk&vazXBC+}9m=cWU!SZbRsRNeA4N)Q^-3@7?hJ|vwBq7vS-ytw$1Qi zTOTA=3Ng(Xu33Sco$Y28-?j^hmTEbA=3igy7=vl(IL^-gslUpc&r{5Ala#Pe+eWVJ zfVS0Z>*L=h{=cfBHg}lskWqHoL4D?;8rn`1G@o_8HGAx*SQ6fr_Z@Vk6~Hw4h<0~( qv&Me7MV0hd?t}CTk|v5_jw^{gVh>;TMN2<&spwO(F5b_-B7Xyk1AXEE literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..04eb49ecf5d1297fcf49e31a5dcb3d4305638d79 GIT binary patch literal 27574 zcmbW937j2Oo$m`F0h(20->k5OK)SO45}VCVx;tr-PGY)~5M-38is zTj$iNQ)l^~|M{Q)sqmc>4ts;guW*Rxoe6I^%JY8A^;=F>s^_gb+w+ct&xhS`2rhuT z;IrW^P|v*vJ_o)J9tuC{;-7Z+AA`q`{%`Okc<6II?|66`JOy3^_55nM1a5;@!du}P z@Z(TbdK~I~zlM7L7~k`bhG#>)_hP7Wmci|C4eWw%hKu04pz?nPsvTd07sGGDBjDj= z(*5J1>UkDC5nck-59^@XaUDDrjziV!Z{P{=E~tLl>-aIK=f42;z9-=6@F(v6q33ws zVZ={@N5a#g-hUosD7+PLA-oEzz5P(-Z-s+!0IBY=O zzXhs2uY~HayP?|iKB#safO_v^Q2p{!HT)d+-X_ zb-u0VAml&qPX6@3eNg$HfQW>5^aZwk7el@8N_Zh0aOoAOdj1Wh3f}9W@_odme-dh3 zz6vEzPr$3-pBz^$Muv$`!OP$W;4=6lco;mHm#O?S;IVL-bLJfs^a|#YCIOvc$L=!^?X0n^93k*nu0#O6VjF5eNfLm z0#(27LB0Q1Q0@JLOF#A^`~I__-n#^9eAYna8;5H5Uqg-aeUL}JhoHv)XHe}uj7g#X zI0^c238d=YwT>}Vz25?lfS-iQ|5@n6Z^I+uUmTBEYUjZTP;$2zs=b#(rm{Bx)gK{L zIWL9X@HJ5K@^Ps4{2VIZLT*YgoCzgAtDy32hib>|Q2p~ZsPf(gRo@5TrSLoOGWZ-G zQhkQtv2X`e`wLL-n}&Msbx`g32wVUka`A_u=Hr)L`uAP>PvJ47{|>6WL+Etz1gP|L zU3`V(YA8K10*{3SsC>KNQSdgGz8fA+{OvCNJrGsmeF&<(k3z}Mx1r?v_fXIO5vraG zmfQ4GU>ET-;n8q0RQoQ4dhgY69ozub-Zwy%|7Iw8`9~N4AlK^LDlCMF8)Wyu9fz^XF%0s2~@sIpyc)%sP}D$D(7Wz3f>9T&ciOT{dOeO z{ZpaRmq4|%$Hkuy)qhvJ^g*cpej$|H+z5|@(@=8uD)?;pHW$Ais$LH}J_6N$--UYa z=TPr`3aZ>g5Vq^#@lfq5LiJ+HPlSI5)z9yMz3^iYRp9*rYJM+zo^9Vn zQ04YQ&A&mo9F9ST(t91G>D~cIRlPqt_FQh~TMlYo-2+dC`=ILcFHrsWRjBs-0O~zI zhZ@g+hbO=zSJ`nn6RQ0yp~_nYrRTOlfg^mz4zPjRQL-QUr1-4 zPyA$f0lX5bUODK)29zCi7t}aB0@aRhLDlaG$KOEpqZVB~-vw3AGvQLW1fB%9LG?!o zE`zU!(!ZaED(?sIIq-K-!QM z>iLgCjn6|+<$ne0`5!>dgP%h6)00s0d^n4^(vO1M;b~Cyy9sWFw?Vz|URo=^?+Ve`Neta!dzK=uoZxc!`z68~- z@4NKhL;n!w|21}e&v}8B|8-F1{WVnmZig4byP@RfA*gyj4%LnyLPXy?qR-Bk7eJ+N zho{3CsCoJZcpCg9^x-!ks?qy1)cu~-)*jgbFDAYVs^0H_8u$HB{e1wc9-oEN@L!?o z^P)9&9h`s~k5@yb-vc+mcS7~sZ{7W;pijK3-`4wLsQRsjdfyFD^)JFR;q6fR;2lu? z_yE*A`5ZhC{s5}qj~uY_dK^^$ErS}TKB#)FgBq7@E}nx6h~ES?-n-!0@YQe&d@p=4 z{13+)25tL42G1b<5vcn93ND0yfhvE&T05UkfU5U}Q2DQcde4iX^h4Eg1}-9g8`Qje zH{1rl4!dE`I%E;v05x9s!JY7NxE1yf+5UVJWNLaJgQza=NvLv{Uu(y63+y5uLW=e# zq5AWq@GSUQ_>?(Kx+zgL^yWr9AR!9@QJE7#@QK)hK9b5tzY_#=W2G1ux4E0~hpFwI1Eog-sQOPq)$bEf^6*0_IeQ9T49{S2m%+7Ar9 z{zZ_k@>aqH@D8Z=-3eK$y*I(-@M}>0yKskXS2t9D_QMhk;BNRucpAL%dRxv6RD14# zs^^=a+WkJL`acLyhF^iFz@I|N+aWKq{dEz%gZMS@Q1~!B9exh#`5!@z*HcjQWZ?}q zejGfO_-Rn-7s4~)3U~(G2vx70Q03hMRlmDk{Jl{9bHJrP3N_w8fqL#KxDX!qSGJxf z!&ef&7^?q1G3r|CttNc-@dWKN%uS1o8J5>4iK#j}Wq1yQ_sDAi> zi+>2JKmQpj-xs0e=BqCKdvGi9Uqh8Y_!7HLT?bJ)-Ysw${5;hAo`Pq>LvOV5=tJK_ z7sE^8^-%d=122c4fGgpXa232Luy%D0s+>1Mjqit``sH&_^6?l{fBqJ#{}+zg_#&ur zy$tI4^-%p(fRevyD0zH4JP&>u>b-w}i{P@HmHQV$jq^6B_t&7xeHGOFc^g!}zZ+^? z_Cv|ZSE1&~x1sv+XHfNg5=ze>m3R6Ls=OVJRjB^G4Ql+}2vz_0y7Y(PYT}Q>HSo;P zuAeu;D~P`u4#9_^>hU|s3IJ_CEoDajD@C#7=u&Q9$2lf7Iq29X#E`T{Gxr?CscN(hSUJI4)tx)~( z9;p6!03Hs%05zUpgKE!@;6nH(sCpa{;X8w;!BgQqkSci}gnG~ER8sX`0o8Bop`N<~ zs=T*BjoUt`e)$Ac{%^SW@1fdrT+z1gY^ZuIhI(!plzd&`(n~JA4%KhBLbc~ED0$us z4}qT`^b(d4iQytBx!eX{2LpnBM-b-`V^b+ULj0S$;CCb8BEshh|AR0@=;QvAa5q7} z+X){esBQYaknk$P4dfdns1JTZIG^ww;)@ASaQ#NYR|zz~?e}jkhFUVev&p}Z@OxtY zgy(TR0#^_;p6?~-cL72D_AH;;qYSazsJQ_as9XM`dY59<@yYWICx#K0hhzAgbLSxBItJl@$(7m2rF%p+2{Nn z*RLdeke^`TsA9)5?w z(&jC2_trR)WPWes@0SSEgdds|`{xxvdO<(wm1B7B{U*ly;1uEOgmo_Mzd3#zt|46R z;yzr#v%~O2!X83EJWtrmb&jClIm9m`yqW7?64rA4VfZhEEnMrjgD^wrQH0;KU3$Oc z)$lCBUG}#5`~UQpw0{5xOp5(ubQPCNUD~;>jMeb32pb3k+`F0(a(yg35$g9+!aE38 z5Pvy*if}mB55U(Fjwa}LBWYiTm%<}V3idnK?{?S1b?*A_;m-(<5SA0ZKzJ_U{}Phl zb9q+3%i*u!g>Vr5FG8O1214>1c6k;57U7=>A0b>q_z>ZK!i!y=i@DbC3=40Oqp;6i zKLp=J*iLv>rtFPepXKuW0e+mYp0vYU+QaY~!o7qGNWaph9}hPXe?I&QA#~|iz{?0f zBCIEDCeOL>6qx*;$Hmqp;&>GI-^%rUgs-`@-#LzP?|WRILpYY}U&HfUc`xBwzk3K{ z<_aGrJks4)(g4?Yz#8E}!WKgI_ZlLX68;Zi8DS;)3xqn?`hC>G{5_k$n_c|3u$%Bd z2`?aQB7BZ;Dk1q@L^%tIoZ=Eb0}F&RNk7J=Ep`;HB>mIyX2Jy5$H7+$4AFtN@wHr4L z4|siJ)kfXx%hjW)&>zZGEB=~lsamrsJR8RTx@w)oS|zOc%2%yqZ*H0jYg19U%j?VM z75p`gxLz&$BZX?Mo>S4J^@rm@qg3~|#+1q)3lOJ^9upv8dUs7g?diW4kHbIT%Rt5e!URX{mEK&D$0|IJkd>!&~Ipz!kZ^U zhNzMYdpv3q2DN}|T_%tIISGih{&}4>*oqVWdd;uDtSK+>wYEN z|6v^E*9M3S}{kxNq7Ms=#-Zw@A?VUmd07DHa1#3kJAF+ba| zY&L%+tks_on)r!>PCJd3Vqi<4f>7gwI-;C6ILa)F8vL3QF05N zAsuO^V=JvS1+4J9ho}9K#+Vrgie}D*HHR?IMXer06{}s6Sz4_yP1cwRg6x&hk0`ZP zmnFBPEXELtiCVS6EXqk!YYdgX7_G{yO4EK+iR+9iC1l2RG0DkvEor)D%S;QBFvQ^` zlbvZz-EECje46E;-i2CFf2uC-rIb~zB8mYGuNSI$vjnLuQ~=Y|*Yr<%*XA6rv5d3? zY|_ZE9feuzQm$GqqgPa8^Om`vO>$`=K*`w^q`Ir(GeBj{WLjy;=_qC@Koi!d)ze0U zyHQJWsTEdxC1YVkrL&UR?1`A0;vJ zM73O_6d+|K6m?6h*uGtA8f%t&-@Vu~;_8nU!gARfBrTN|dz|E5^?aPMB z0(r`l4I|*y%6K%Q+>yUt zW2QE0HCZ5;K}*xzDwkxjra*dkJM)hfpf^o$RkN>E>XfV}E@ZSh%rnO%)U2R3tBgXe zt}bSlFMG{$lr}fJz|Ovl@zn90CR()-`)EL!T(Ra;+I9UwT#!igW7~PzNNcrjOJ%JN zE3taCf|XHgR4T0Ki_#}I%S3CB%`V7fV)-!rk7^Ao!5E6QqZEv#xnJcLGXyvG63b;I zR|~@m(Nb6s9cIso{wOF{5v`G%8UeO_MtHf7Rf+5NGgnia?#IF|_N4iTWh0w1(xffPIy987L+XH*xtQi0L0RPrW7V5| zYs;iJMyu6QJyNH+Y8f-C&zMJPn%1hi%cusn1jRk%hE1y@TF$82z!+bX)yS;LN$Ey` zn>z?gx^$Tb*l=KQXETmj8;qQKEKZt`>-)WJ3j%0(OaoRBAGJ%GjHAf2vwS zNR1dIl0}|mTdvY6Evkh6XrmH(gQaMaWug|%R4cMar@cXhoE$`bvuhcwh3q$p83kz# zlr=#~rVNw9vk685t(>|9t5x0Yj2PS7R=;9H)Lo8|>6l5(&fiQmmpJMyJ{NWJ=3)~e zGtXNaO!{_{u8HZb4RL_5i_7jc*H(QjcePlWa+ed@s6wo4cM9vGd>(DTjvYRZgo4ca zA=Sn#<=#5XIP=GMtAbrsv&OJlA@#>SVlFqcL1UJCCStnMTuHjj7S+U@#Xc#CkMTty zaoT1W1x~bHFha&+i;0fLFe&GB$J6DpDqH-Xc#1FDRZy?zOubIwZWlmjavQlj>cW4~ezc<88oqX8y2$#{J~e zKojk@3kpjU{&?NXaN>E2=NkL&_G9K|`$ z`DfES)?J$nfcC3_bK9u{w_b-QAZ8?xuv#@hZJQnr&_pO%O#y8ij1|tvl2qYf++zP&o4WCO4hI?;NNa*Mr&f4r9)TSQd;s1?hSnu2>bydL~oH zUTvN9h7r-6r@d&ew=t~C%!IoXFaxxW@itbOiZPC4rqsqNOU%Y9)+utmBdjm-HsMtE zhXcG}o5shP$yT_`%q?q?8JqT3Oy1muDLLLK`4OHke*zVc;#Q4HTr!iVqBz31_BKt1 z6@Rc=lDiE7v&wuv1(K$#SCXy$ScvPj8m0c3xqSj{kH!VfFbZ*tY-$@A_t54jCmTHW zu>Q1KCwCQ3ec+poHb9Zd)M4!XsI0ANB;RMEPtqr4HLJ?jMJ1~!G572YI*14KcxKMc ze!^*E&1~PeJP+b6b3JpgFWRD2_CNck_J`(s6}>f2|8S?R6Lujr2%%?nPvTW#=oXIv7|7UuxV*1vzJ>1gjCf=sjS@h62#{DKg^$6W!{#aYvUIwvq zWqWq(=rD%QE1jhF4qCyKV&_304q@w7m8qGokgZC(n{(CQ-5S-bj5Y7vPGDBLHC2-L z;J9>ZLu*vJ!EshxE1u4np-MiynT)Y%pe%aT<#yF8_C3>x*Q z#Cj=bsySn6^CXy>C?9XASf{*PJ)FChQfr5~-|8*ZyuyTJU1rUpT<$uDf{r^!tksh& z@h)m6`by`@&8FGO?@|&&K&Gx;+MOB3-i&3{8UtAqj5?cxhFCAx z^PHDygwv-wz8J)?f!D*x7k^{c!o26UQS>8s?3PL$@1;Ab768@mlV#=^v75w z_VMb(gq&IKP|X{yP7)f}Gf6MmSknBYRd&CxPEPGd)-sMW)jyqcoxo?!oiAj z?wY39R(hk;lg8I(y-QLcTgTXdH|+Xj#Ue?O^_#i&(@D3r!XCt~8ENlg{BQ?K=aMafLN_ppx<|vH zoQe1Pg+|x#(C|R(b>j%<%{rF_FU5Cg_X)Q8Wsz&xqob|*FQf$SJJ@5wBOHJLOCinV*3e5^WGdC z)!c&?$bJUWe9$*8lR|aI+tS=uYE+6|U$Nf2cgi0sqR>ZXn)h;I?vI93&Ar92G95Sf zPK3q{SZnTMpIhSq3LB){+*_Frnb+;vD$Tt!a&fP#&dfCT1o`G3WS>*$nFG5^p*{q_ zsBhj|rz9$nWWYcW$kZ>Id$hY3`>|eWhYhDhE_M4x&5_VEUArdnTIu zYRx^x_L{lbM|USJW_XGie=}jJxtG0r-%O(a$is?MmGg+vlleXo%vAF`wY<*w5u>s* zi1fBT6n@ElG7`@;_u_if=r9rt&{#-cmDIP?PCHMEWg8HXWzR&%-9CS3b!_Y)OQQbR zszIym9y?hju?5wqDf%i!!F+`xISNa-So0wj z=A&YB4-?H_)4aD_LGw4Nqk#QQrF`o%6eUk{dOwE857jk&;Qq`5n%EstG<2qW zjKZb}qXAZD1W7$%7wP0Kowa`|oJf)z{y;6vhxI5)Am6+N47N||^)!s3(9HHWPBZTI zuY|tirDe9rXa!G)LDB)Ho^(`^2^hySfw$h2!g!-+irzY#iz$LCa}ngD#>T0y6gT(r zorwEnhT4u;iQ|;y!0zlEVx;B3ZtgSFJ(2m$;QM2|l*z|yn9ruxEuo1dXGYO!=K7o~ zw5vQ#XE%+WrpS4e4^@+G*W9zSxo5u8nE-Z{&aX*3>Yq`vM%~O=>7-RSc2xYtbcE)~ z_Cts6)slii5Td8hdFf|3W|DhrIRHn()(3nyf)0&PqHPgh-{R0p#y80l_$*e@l$Hfn zmP|4gOQtm<%D89l^|7j;4k^63pTU}p5A4ofu8C31V>+>r1~OT*IxJ)kFc5ktI;qY_ zSMv;upToFn?%j!Q_ZOqtxSl{EmBL8`L5o^ur0thEP7md*9x9-f>WHb4TdOPD1RP8yimiU7Y}bLABHQ2Jp<(=>H590CI#Jo<8HU^2W_l~8 zPc<<@=2p?n6x$Ix_^ae%9Vpj;FWQ}1Tt$zIg+K3JVc^fKr>63KdXD6uEwc}H22VCHC)iC@U0Cs=YvUG z@gha-dJ-?IhSbnTq4vH_b$}%~L)Ntk*)M$xM*B?b5b9W_>3=4;Wh(shRPccd`3# zsroie?>%#&on<13!@=Zakd{;Ah3(~Z4pw`O=21r-s|0)BtR0S`!RBHi$##jUT1HEm z=B8_Lfw^joW87Tksn!%q^Vkk=Ss{#*K5}aA$wlaf0QuCnP3Z6j1INxXBS@Ll4n>o> zlbMj2)V?unfoicglZ3);Z8|#o&uiXUlN#@9>yoxeI)9y2pK2Vr1)gr=KhxN?zoo-6 z%NS*L`j6sPV)2{_#;i(jx5YZ|X0-~-PC4X|8Y`x~jKrHg`-`fq-4 z#!<+{V3IXWhKY8d?fc@{S&*a2fUnW`P#|Nf7(1AibTlg2jhrrGEmld_YB0KSw-%}_ zXW@+I;7qkN!E~z2?8SgNa6hYRekWF$c0t+)R%BiKI6ZBd8=Y;E?6K-*-p^yHphjAz zfnDa)g4WBjJFq)n9mB>QnZb(FXckdO*}fQvXSB@oZPz6C(w24X2JDAkt=oyQ(|R~< zK-qy&Bhec|1e4LD z5Q$$#wWVvDR`{Zuo}o9l*MhNZ&o-2-jP1#N>E}Q)&`_mFw^{!xa z>I<<+ZL2Ku@1C|xO5!%LSz8M%+q_AaaSL8R=@tHkz_d06F4-O#(J~j$Oe&WWTOU)Z zlX!Fs@9%J8HeW8UAex=?i#C_odbbYmllNI`h57Ke!oNV#a!E8hivx^OqyhJmQ?Sjw z+Ei`{cQWL4^e9?dcNlFAzP34N*Kme1G7ghgN@{3y*s$5nvS-Xb(SMMfM?IZTPpy`E692x(~j zQ^^;9PUN0xl2KOM6n3+d6NSwD%ueQ~d0<`z)Aj~CJH~i}Ka^1(NIz9}j_=Nw$TCO^ zVW&T*zThFYV98QVU-Rjpw!avT7^QUP(l&#`$8eF>y;sWsMx4HEHMy}~I~r^?mTGJr zfN53ClX&KAIR#EIhle)y4{VeMm)x}#RPX8POK(UPu!@r-iOdpP#hIhSI{ukgsIwF~ z!PPet)0`$ykMNV z!#9&EE5TU!c>ZRsZxU=2l6xQXG>=~&e;6~3LxpjjgfPGM)aujCJ#=1@aUb)r?Q|ij za5kOcZ0$fX+`ILU{8&U(I2MwO(dPalN5*n0>&Rfr>_F7DY?_R#+3sV_N`;eCn&`m& z>GDdZB6>VApXp{QNZ`vc`5f#g8m*4dE%((6vp6}m@dnU}d^RA1&Z!>ndKzpt5LWL{ zXU>bLmN$4{x7jSr<)v;NDOt^|(<8Y%B%FNh#@}lcNN#@%Wo8OWd3bs_KPj(-TNF%Jr&v0t`^v=|5N!U1k=MFOK4^6!jb{yIZ z9$;1HD_YbS9gGwpXi6A1TOp#u)tL#qQ{-Q*(=mH9Da38k^*T7i;A!ri>h;!XP1rYs z_on%#oeDnZ{~W$-jBw)Wl!W_1ozJ(zayg<)aC>t=T#ooWlYjKr-FyIDgx`Q=d_a2` zq^IR(m*3KKY^V=4yTek~x`2~E9Px~g*0aDj`HlCM#T)Z=TwVkIMIM(Lt$k)+uASTj zN99KDGfNQfLovAxV5)JAs(OY#HWHLQljhTduv9cJxBcE;+z3t4F}+OEwmWWh&Uk0& z+Y;6#wgQJ$E$?F6GGn}L^KIkwFbAD1=kz=$V7S?tIw(w}m0sgtF0k;mmT=D9THV~* zYdIf_=7&z-JIB_?x%52;|493*bhQ1SeOJdb z>7s}9wG}RBL-uA;SvhesJ`ba&84M{%vz(`=5#|mnPiiR0VX%?KQ>XoWGo(>$tzCTR znS3ak(UO^OMKh@^BF3>Lg_dk6%vfP#xMNa;#o0-7`==0aT#c<<^SH5QW#g4*b&@A0 z>zShiP_XuhHd|_2CN06)jc>A`&-Gx3pL~v@uVwH({h4nq*1b6vU#q^Z(j+t$?_6+tE)RY?;XHU^>F4Rx-T>5c| ztk~rAShjq}$&+(KK5ZV=SnmDyU2c-vW``Q<&uJ2zyE5Y1oFF6G^Ry?mrU0YG2du+< zMHG~=X6n8>)7_wzoU=cDvC=jaE#Yp{cAe)29HOR0Xmb7+%NWhN$~t#s*^NWTH$xo< z2CeC8t*VUrGHSZ*HQ19_7RY;YoH+aGma{Uus>@8v)(P|2enXo~3B2x8{6mQ}s>NH2 zV{k82?4V~bc$tx`lv&>+!&eVt{!xj~zn$U#-e4?qeN@?!NK}*E@8Hu* zj-j)+XO)QjGW_Y6wyYU^xBD?QF zE;;*e^@N`udNV=B0z^AC@H3`mCY5>L(zE```R-^{o3ki7mW5zX>lhO+4({KY`Pyu* zJxE#~Q+4Bc=-6)IeZOUmGBB^Ue71C!I%~#d1QV;Bo z{SIp%OV8Xwyc1hKGdfmMJGw_7GMn%7WZTQ$(I!oj$HCA2>23{=2(!k#ROXUB7Ggls zePJ;y_3+gYDnQ3S`XnUtVhr>7Zn5_+vrVKa>0Tt+A)2me`_2smF}bPl8?gs*+*PLe zA0$olIT^MzHaGvj4=lSH6_C{9c@Fsp4U-|8adUKHUAoogb|L literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..25f1be6aa1bfcd2dbb3eb60d344937e594af891b GIT binary patch literal 2833 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 BFFXJM literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9c359746c219c3776714487a2c1006c79b3a6fef GIT binary patch literal 19547 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 ay@THQXDt1n&KaHL(uaKggPs1F>i+>insmDW literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..49572c078b46055af80d5dbb248530b96d660ba3 GIT binary patch literal 27590 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 Fe*n(>K*j(7 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..95fa04fe50318ed33d006752d34b7ad83f00ed24 GIT binary patch literal 28553 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 UKm1$sNk>LmE0fc4fjcw$eHq)$ literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..8a9f45d34e49088e7e7688b88a7689e67bfbd34d GIT binary patch literal 10147 zcmaKw4UipGmB%mN5=7)vzLXXS5p+T(2pfitIGLFw1DRx)HzD9ILeJ}-_d4m<{pjvD zlL67J2n(p-A|HZ$D#{1~OB7L1K}K0|*>%hPfOQMD%*t98E()bplm%7$``^C(W&%pr zocHT{`}V!(-h0lur|0^fHAvMJ{ax|4~OdKSg3J&AyYLgq52(k&(DBrzsWuK zq4a4&^`E=?OQGg*l`DT9s@=`5{wq-Z+z-|Nx1sd>zI*;tD1DxV?}9Ht>H9iVyIoma z>31NMzK6qiz~i9ie=^kjD_#8=Q0>o!>hA(5eYQfizZCLkKFyExz8&iQStvapa(oPG zU7vz_{~4%$cR=a!YsjDZ13%iIy$>qe9|hH}2Wp)@2sMvE$BnLj5~|%4JPcj}HU5oI z>vX3p-wmbbgHZZB0@dG-UHLzu^!pXmy1e3^?}Ad?nggKfmq5LLisK;EJjS5b<)iSu za1u(7E1>kd7HU6kf@*)8E8hb(zXzb&KL+i3LFxYt)cemtwfiNM-oJ-xzsDhEfBV5> zDIWnf&ksYrKMXbQ2B`UsyYl%^`Ub8(hSF==@lq%~u5r(Ah3aS4@jfWMwmW{u)jtlU z*N>q3|0%TdaD2|y{|}V^z6hn)Z=uHjBh)y1Vsx^nec-O}P^f)40&0HCpxU1brN@xt zI;in$Q2L(-rN$`Q-$Au|9ZIhQnT+~9-0>Kw`VT;ja}tyur@H!nsC8Wn_1-wte9wbg&j~2K z+EDxV38;Q9g?jHw$Ln4FolxW54W;k>?)l^H`O}U+gKGCIls^9rKLCH_$_E`@)*lHq z&tqW^=SnY>UgsZCu2TzYAEx2a@G7YO?t@3chag>=e}~$a-$D=W&S9nbEQVUY8`#8wa%LyC!pSMLCyPTa(eKIKfxd^J=r=Z5a21@TQK=pqYRR8xt zwf_OsI{zcoJfDTq=l`I_c?C+3Meiw}AL`fxHO?xi{zjnuD1aKb1NHvLq29j%s{LJ% zshbB}`Dw`3nrEQ&c?HVuUV~cCeb`LBcNEk*oB-8tFVyp4hzpqWpzL7^YWyo*{k2f- z?u8oXF(`e14%Oew5YsTPLcMp8SL*R@sQD~`>VE~)duKt7({#KTYJIPU+RvMz+TR1! zehz9rKZok?*HG*IN2vGq;ti;^&FGI~^ zyW^u!e(*ym{ho)?>m|oMa31;Jkx+UJLydbD)P9@;rSF6*r%?UOK<(?5Q1iMGO21jh zN1*2SG?YC(3)TN~Q2M<9)&EOS{`jhU{uAE@^afNJ+HsD6%s8t)h=yFD4I z-!q{0r{tJ^||eUdKLH zKLGcj{tPI)8+FgmhniQ@l`ny6cR5tM&p^e!FS_~%9Uq2Tm+wLO`BPBq{%=tB@e9Zj zm=~eiy>m&~?~zdDqoLMgDclpD0#Ao4UHv6c{ayxT7oUT>zzqmpTHF6T)b+O|y1(D! z?kQv(`8(uZpdmRUpsypu0c*iv^D{9Iil-)MC);a#?b?ZHQoS>zt%T;x;8FrrwmtAk9~J7ZF~1^FoQNmsWJ z-=W|kOOX#FMfxk&}C-V)Zvbo*Ik)Ybg} z#z+m351xcviJXU=h1`tjdK+@7y(@i5x3aM(UEN{uQRKU>+=5?6zUImo!71bzs zh^~(ySJ^vb{t6z5Jm|{8H{JbZa4qr~SMGt=AU{Ur`}-h&fviUMMszJh8i;&J{&*Df zW#nY!V&or?ZzH-MMy^BlLiRv(J%oG%IT1M+(N!;DZiPecet-BCWIeJNIRp73;v=^p ze~;*TKQf5ik6ehfkxj_q$j1;}BPDEHTEhJ$u6zPqf&3-1+|>zBARCe0kpj69(RFnR z(+7X(?*9h%BioPxMenu position alignment + Menu position alignment 0 = Left, 50 = Center, 100 = Right + + + 'Default' + menu layout + Menu Layout + + + 'Off' + Force the menu to a specific location + Force the menu to a specific location + + + false + disable hotkey on key release + disable hotkey on key release. + + + false + show ArcMenu on primary monitor when using hotkey + show ArcMenu on primary monitor when using hotkey. + + + false + show standalone Runner menu on primary monitor when using hotkey + show standalone Runner menu monitor when using hotkey. + + + 875 + ArcMenu Settings Width + ArcMenu Settings Width. + + + 725 + ArcMenu Settings Height + ArcMenu Settings Height. + + + [true, false, false] + Keeps track of available placement for ArcMenu. [Main Panel, Dash to Panel, Dash to Dock] + false = not avaliable, true = avaliable + + + "Panel" + Embed ArcMenu button into Dash instead of panel + Embed ArcMenu button into Dash instead of panel + + + 'Left' + Raven layout position. 'Left' or 'Right' side of screen + Raven layout position. 'Left' or 'Right' side of screen. + + + true + Enable Weather Widget raven layout + Enable Weather Widget raven layout. + + + true + Enable Clocks Widget raven layout + Enable Clocks Widget raven layout. + + + false + Enable Weather Widget Unity layout + Enable Weather Widget Unity layout. + + + false + Enable Clocks Widget Unity layout + Enable Clocks Widget Unity layout. + + + false + Enable Category Sub Menus + Enable Category Sub Menus. + + + 'Full_Color' + Category icon type. Full_Color or Symbolic + Category icon type. Full_Color or Symbolic + + + 'Symbolic' + Shortcut icon type. Full_Color or Symbolic + Shortcut icon type. Full_Color or Symbolic + + + false + disable the fade effect on scrollviews + ddisable the fade effect on scrollviews (may help improve performace) + + + false + Show a larger icon and extra app details + Show a larger icon and extra app details. + + + 5 + The amount of search results to display. + The amount of search results to display. + + + false + Highlight search results terms + Highlight search results terms. + + + false + Show search result description label + Show search result description label. + + + false + Show custom search provider - open windows + Show custom search provider - open windows. + + + false + Show custom search provider - recent files + Show custom search provider - recent files. + + + false + Show hidden recent files + Show hidden recent files. + + + false + Activate Categories on Hover + Activate Categories on Hover. + + + false + disable recently installed apps + disable recently installed apps. + + + false + disable tooltips + disable tooltips. + + + true + Separate All Programs by a Character Listing + Separate All Programs by a Character Listing. + + + true + Multi-lined labels for large icon application grid layouts + Multi-lined labels for large icon application grid layouts. + + + 'Pinned_Apps' + Set ArcMenu Layout Default View + Set ArcMenu Layout Default View. + + + 'Categories_List' + Set Tognee Layout Default View + Set Tognee Layout Default View. + + + true + Set Unity layout to display "Home Screen" as default + Set Unity layout to display "Home Screen" as default. False = Show all Apps + + + false + Remove the themes menu arrow and displacement + Remove the themes menu arrow and displacement + + + false + Remove border around the searchbox + Remove border around the searchbox + + + false + Disable the user avatar icon from the menu + Disable the user avatar icon from the menu + + + false + Enable an Activitities Overview Shortcut + Enable an Activitities Overview Shortcut + + + 'Bottom' + Searchbar location for layouts with default searchbar on bottom + Searchbar location for layouts with default searchbar on bottom + + + 'Top' + Searchbar location for layouts with default searchbar on top + Searchbar location for layouts with default searchbar on top + + + false + Flip menu horizontally + Flip menu horizontally + + + false + Windows layout - disable frequent apps + Windows layout - disable frequent apps + + + false + Windows layout - disable pinned apps + Windows layout - disable pinned apps + + + false + GNOME Dash Layout - Show Applications + GNOME Dash Layout - Show Applications + + + "rgb(61, 174, 235)" + Plasma Selected Item Color + Plasma Selected Item Color. + + + "rgba(245, 245, 245, .05)" + Plasma Selected Item Background Color + Plasma Selected Item Background Color. + + + true + Plasma Menu Hover to activate item + Plasma Menu Hover to activate item. + + + false + Runner layout - show frequent apps + Runner layout - show frequent apps + + + false + Runner layout - use current shell theme gap + Runner layout - use current shell theme gap + + + 400 + Runner layout - menu height + Runner layout - menu height + + + 500 + Runner layout - menu width + Runner layout - menu width + + + 0 + Runner layout - font size + Runner layout - font size + + + false + Eleven Layout - disable frequent apps + Eleven Layout - disable frequent apps + + + false + Used to reload theme + Used to reload theme. + + + false + Enable a vertical separator + Enable a vertical separator. + + + "rgb(32,32,32)" + Separator Color + Separator Color. + + + "rgba(53,53,53,0.987)" + Menu Background Color + Menu Background Color. + + + "rgb(223,223,223)" + Menu Foreground Color + Menu Foreground Color. + + + "rgb(32,32,32)" + Border Color + Border Color. + + + "rgb(21,83,158)" + Highlight/Active Menu Item Background Color + Highlight/Active Menu Item Background Color. + + + "rgba(255,255,255,1)" + Highlight/Active Menu Item Foreground Color + Highlight/Active Menu Item Foreground Color. + + + 9 + Menu font size + Menu font size. + + + 1 + Menu border size + Menu border size. + + + 5 + Menu corner radius + Menu corner radius. + + + 24 + Menu margin + Menu margin. + + + 12 + Menu arrow size + Menu arrow size. + + + 550 + Menu Height + Menu Height. + + + 290 + Menu width + Menu width. + + + 0 + Menu Width Adjustement. + Menu Width Adjustement. 0 Default. A negative value decreses the default width, positive increases width. + + + 205 + Right Panel width + Right Panel width. + + + 0 + Gap Adjustment + Gap Adjustment + + + "rgb(41, 165, 249)" + Recently Installed Application Inidcator Color + Recently Installed Application Inidcator Color.. + + + "rgba(196, 196, 196, 0.3)" + Recently Installed Application Inidcator Text Background Color + Recently Installed Application Inidcator Text Background Color.. + + + false + Enable Custom ArcMenu Theme + Enable Custom ArcMenu Theme. + + + false + Enable Custom ArcMenu Layout + Enable Custom ArcMenu Layout. + + + false + Show External Devices + Show External Devices. + + + false + Show Bookmarks + Show Bookmarks. + + + [(0, true), (1, true), (2, true), (3, true), (4, false), (5, false), (6, false)] + Power Options + See Constants.js PowerOptions + + + false + Display on all monitors + Display the menu on all monitors when using Dash to Panel. + + + 'Default' + Activities hotcorner action + Activities hotcorner action. + + + false + Override action of activities hot corner + Override action of activities hot corner. + + + false + Show/Hide Activities Button in panel + Show/Hide Activities Button in panel. + + + "sh -c 'notify-send \"$(date)\"'" + Custom hot corner terminal command + Custom hot corner terminal command. + + + 'Undefined' + Set a hotkey to open ArcMenu + Set a hotkey to open ArcMenu. + + + ["<Super>x"] + Custom keybind to open ArcMenu + Custom keybind to open ArcMenu. + + + false + Enable a standalone Runner menu. + Enable a standalone Runner menu. + + + 'Custom' + Set a hotkey to open the standalone Runner menu. + Set a hotkey to open the standalone Runner menu. + + + ["<Alt>1"] + Keybinding to open the standalone runner menu + Keybinding to open the standalone runner menu. + + + 'Left' + The menu position in the panel + The menu position in the panel. + + + 'Top' + Runner Menu Position + Runner Menu Position. + + + 'Icon' + Appearance of the menu button. + Appearance of the menu button. + + + 'Circular' + Appearance of the avatar icon. + Appearance of the avatar icon. + + + false + Enables the default menu button arrow. + Enables the default menu button arrow. + + + 'Default' + Size of the menu items icon. + Size of the menu items icon. Includes all application items, category items, search results. + + + 'Default' + Size of the menu grid icons. + Size of the menu grid icon. + + + 'Default' + Size of the button items in ArcMenu. + Size of the button items in ArcMenu. Includes all buttons inside the menu + + + 'Default' + Size of misc items in ArcMenu. + Size of misc items in ArcMenu. Includes searchbox icons, back menu item, all applications menu item, usermenu item. + + + 'Default' + Size of quicklink items in ArcMenu. + Size of quicklink items in ArcMenu. Includes places, shortcuts, external devices, bookmarks. + + + 'Applications' + Text of the menu button. + Text of the menu button. + + + 'Arc_Menu_Icon' + Icon of the menu button. + Icon of the menu button. + + + 0 + Icon of the menu button. + Icon of the menu button. + + + 0 + Icon of the menu button. + Icon of the menu button. + + + '' + File path of the custom icon for the menu button. + File path of the custom icon for the menu button. + + + 20 + Size of the icon in percentage. + Size of the icon in percentage. + + + -1 + Menu Button Padding. + Menu Button Padding. + + + 0 + Menu button position offset for main panel + Menu button position offset for main panel + + + false + Override border radius styling of the menu button + Override border radius of the menu button. + + + 0 + The border radius size of the menu button + The border radius size of the menu button. + + + 'rgb(240,240,240)' + Color for the menu button icon + Color for the menu button icon. + + + false + Allows changing the menu button icon color + Allows changing the menu button icon color. + + + 'rgb(240,240,240)' + Active color for the menu button icon + Active color for the menu button icon. + + + false + Allows changing the menu button icon active color + Allows changing the menu button icon active color. + + + 'rgb(214,214,214)' + Hover color for the menu button icon + Hover color for the menu button icon. + + + false + Allows changing the menu button icon hover color + Allows changing the menu button icon hover color. + + + 'rgba(238,238,236,0.1)' + Hover background color for the menu button icon + Hover background color for the menu button icon. + + + false + Allows changing the menu button hover background color + Allows changing the menu button hover background color. + + + 'rgba(238,238,236,0.18)' + Active background color for the menu button icon + Active background color for the menu button icon. + + + false + Allows changing the menu button active background color + Allows changing the menu button active background color. + + + [(0, true), (1, true), (2, false), (3, false), (4, false)] + Array of extra categories. See Constants.js - Categories + Array of extra categories. See Constants.js - Categories + + + [(0, false), (1, false), (2, false), (3, false), (4, false)] + Array of extra categories links for ArcMenu layout. See Constants.js - Categories + Array of extra categories for ArcMenu layout. See Constants.js - Categories + + + 'Bottom' + Display extra categories quick links on ArcMenu Layout home page + Display extra categories quick links on ArcMenu Layout home page + + + [] + List of recently installed apps + List of recently installed apps + + + [ "ArcMenu_WebBrowser","WebBrowser", "WebBrowser", + "Files", "", "org.gnome.Nautilus.desktop", + "Terminal", "", "org.gnome.Terminal.desktop", + "ArcMenu Settings", "ArcMenu_ArcMenuIcon", "gnome-extensions prefs arcmenu@arcmenu.com" + ] + + List of Apps Pinned to Menu + List of Apps Pinned to Menu + + + false + Toggle for enabling custom shortcuts. + Toggle for enabling custom shortcuts. + + + [["Home","ArcMenu_Home", "ArcMenu_Home"], ["Documents","ArcMenu_Documents", "ArcMenu_Documents"],["Downloads","ArcMenu_Downloads", "ArcMenu_Downloads"], + ["Music","ArcMenu_Music", "ArcMenu_Music"],["Pictures","ArcMenu_Pictures", "ArcMenu_Pictures"],["Videos","ArcMenu_Videos", "ArcMenu_Videos"]] + List of default directory paths used for links on the right side of ArcMenu + List of default directory paths used for links on the right side of ArcMenu. + + + [["Software","system-software-install-symbolic", "ArcMenu_Software"], ["Settings","preferences-system-symbolic", "gnome-control-center.desktop"], + ["Tweaks","org.gnome.tweaks-symbolic", "org.gnome.tweaks.desktop"],["Terminal","utilities-terminal-symbolic", "org.gnome.Terminal.desktop"], + ["Activities Overview", "view-fullscreen-symbolic", "ArcMenu_ActivitiesOverview"]] + List of default directory paths used for links on the right side of ArcMenu + List of default directory paths used for links on the right side of ArcMenu. + + + [] + List of Unity Layout Pinned Apps + List of Uniity Layout Pinned Apps + + + 5 + Index of Unity Layout Pinned App Separator + Index of Unity Layout Pinned App Separator, 0 = none + + + ["Software","system-software-install-symbolic", "ArcMenu_Software", "Settings","preferences-system-symbolic", "gnome-control-center.desktop"] + List of Brisk Layout Shortcuts + List of Brisk Layout Shortcuts + + + [] + List of Mint Layout Pinned Apps + List of Mint Layout Pinned Apps + + + 5 + Index of Mint Layout Pinned App Separator + Index of Mint Layout Pinned App Separator, 0 = none + + + [['ArcMenu Style', 'rgba(53,53,53,0.987)', 'rgb(223,223,223)', 'rgb(32,32,32)', 'rgb(21,83,158)', 'rgba(255,255,255,1)', 'rgb(32,32,32)', '9', '1', '5', '12', '24', 'false'], + ['Simply Dark', 'rgba(28, 28, 28, 0.98)', 'rgba(211, 218, 227, 1)', 'rgb(63,62,64)', 'rgba(238, 238, 236, 0.1)', 'rgba(255,255,255,1)', 'rgb(63,62,64)', '9', '0', '0', '0', '0', 'false'], + ['Dark Blue Theme', 'rgb(25,31,34)', 'rgb(189,230,251)', 'rgb(41,50,55)', 'rgb(41,50,55)', 'rgba(255,255,255,1)', 'rgb(41,50,55)', '9', '1', '5', '12', '24', 'true'], + ['Light Blue Theme', 'rgb(255,255,255)', 'rgb(51,51,51)', 'rgb(235,235,235)', 'rgba(189,230,251,0.9)', 'rgba(89,89,89,1)', 'rgba(189,230,251,0.9)', '9', '1', '5', '12', '24', 'true']] + List of color-themes + List of color themes. + + + + 0 + Handles which page to open in ArcMenu Settings + See Constants.js PrefsVisiblePage + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/search.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/search.js new file mode 100644 index 0000000..9085c77 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/search.js @@ -0,0 +1,872 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: This file leverages the work from GNOME Shell search.js file + * (https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/master/js/ui/search.js) + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Clutter, Gio, GLib, GObject, Shell, St } = imports.gi; +const AppDisplay = imports.ui.appDisplay; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const { RecentFilesManager } = Me.imports.recentFilesManager; +const RemoteSearch = imports.ui.remoteSearch; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const { OpenWindowSearchProvider } = Me.imports.searchProviders.openWindows; +const { RecentFilesSearchProvider } = Me.imports.searchProviders.recentFiles; + +const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; + +var ListSearchResult = GObject.registerClass(class Arc_Menu_ListSearchResult extends MW.ApplicationMenuItem{ + _init(provider, metaInfo, resultsView) { + let menulayout = resultsView._menuLayout; + let app = appSys.lookup_app(metaInfo['id']); + + super._init(menulayout, app, Constants.DisplayType.LIST, metaInfo) + + this.app = app; + let layoutProperties = this._menuLayout.layoutProperties; + this.searchType = layoutProperties.SearchDisplayType; + this.metaInfo = metaInfo; + this.provider = provider; + this._settings = this._menuLayout._settings; + this.resultsView = resultsView; + this.layout = this._settings.get_enum('menu-layout'); + + if(this.provider.id === 'org.gnome.Nautilus.desktop' || this.provider.id === 'arcmenu.recent-files') + this._path = this.metaInfo['description']; + + let highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + if(highlightSearchResultTerms){ + this._termsChangedId = this.resultsView.connect('terms-changed', this._highlightTerms.bind(this)); + this._highlightTerms(); + } + + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.metaInfo['description'] && this.provider.appInfo.get_id() === 'org.gnome.Calculator.desktop' && !showSearchResultDescriptions) + this.label.text = this.metaInfo['name'] + " " + this.metaInfo['description']; + + if(!this.app && this.metaInfo['description']) + this.description = this.metaInfo['description'].split('\n')[0]; + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._termsChangedId) { + this.resultsView.disconnect(this._termsChangedId); + this._termsChangedId = null; + } + } + + _highlightTerms() { + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.descriptionLabel && showSearchResultDescriptions){ + let descriptionMarkup = this.resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]); + this.descriptionLabel.clutter_text.set_markup(descriptionMarkup); + } + let labelMarkup = this.resultsView.highlightTerms(this.label.text.split('\n')[0]); + this.label.clutter_text.set_markup(labelMarkup); + } +}); + +var AppSearchResult = GObject.registerClass(class Arc_Menu_AppSearchResult extends MW.ApplicationMenuItem{ + _init(provider, metaInfo, resultsView) { + let menulayout = resultsView._menuLayout; + let app = appSys.lookup_app(metaInfo['id']) || appSys.lookup_app(provider.id); + let displayType = menulayout.layoutProperties.SearchDisplayType; + super._init(menulayout, app, displayType, metaInfo); + this.app = app; + this.provider = provider; + this.metaInfo = metaInfo; + this.resultsView = resultsView; + + if(!this.app && this.metaInfo['description']) + this.description = this.metaInfo['description'].split('\n')[0]; + + let highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + if(highlightSearchResultTerms){ + this._termsChangedId = this.resultsView.connect('terms-changed', this._highlightTerms.bind(this)); + this._highlightTerms(); + } + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._termsChangedId) { + this.resultsView.disconnect(this._termsChangedId); + this._termsChangedId = null; + } + } + + _highlightTerms() { + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.descriptionLabel && showSearchResultDescriptions){ + let descriptionMarkup = this.resultsView.highlightTerms(this.descriptionLabel.text.split('\n')[0]); + this.descriptionLabel.clutter_text.set_markup(descriptionMarkup); + } + + let labelMarkup = this.resultsView.highlightTerms(this.label.text.split('\n')[0]); + this.label.clutter_text.set_markup(labelMarkup); + } +}); + +var SearchResultsBase = GObject.registerClass({ + Signals: { 'terms-changed': {}, + 'no-results': {} }, +}, class ArcMenu_SearchResultsBase extends St.BoxLayout { + _init(provider, resultsView) { + super._init({ vertical: true }); + this.provider = provider; + this.resultsView = resultsView; + this._menuLayout = resultsView._menuLayout; + this._terms = []; + + this._resultDisplayBin = new St.Bin({ + x_expand: true, + y_expand: true + }); + + this.add_child(this._resultDisplayBin); + + this._resultDisplays = {}; + this._clipboard = St.Clipboard.get_default(); + + this._cancellable = new Gio.Cancellable(); + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + this._terms = []; + } + + _createResultDisplay(meta) { + if (this.provider.createResultObject) + return this.provider.createResultObject(meta, this.resultsView); + + return null; + } + + clear() { + this._cancellable.cancel(); + for (let resultId in this._resultDisplays) + this._resultDisplays[resultId].destroy(); + this._resultDisplays = {}; + this._clearResultDisplay(); + this.hide(); + } + + _setMoreCount(count) { + } + + _ensureResultActors(results, callback) { + let metasNeeded = results.filter( + resultId => this._resultDisplays[resultId] === undefined + ); + + if (metasNeeded.length === 0) { + callback(true); + } else { + this._cancellable.cancel(); + this._cancellable.reset(); + + this.provider.getResultMetas(metasNeeded, metas => { + if (this._cancellable.is_cancelled()) { + if (metas.length > 0) + log(`Search provider ${this.provider.id} returned results after the request was canceled`); + callback(false); + return; + } + if (metas.length != metasNeeded.length) { + log('Wrong number of result metas returned by search provider ' + this.provider.id + + ': expected ' + metasNeeded.length + ' but got ' + metas.length); + callback(false); + return; + } + if (metas.some(meta => !meta.name || !meta.id)) { + log('Invalid result meta returned from search provider ' + this.provider.id); + callback(false); + return; + } + + metasNeeded.forEach((resultId, i) => { + let meta = metas[i]; + let display = this._createResultDisplay(meta); + this._resultDisplays[resultId] = display; + }); + callback(true); + }, this._cancellable); + } + } + + updateSearch(providerResults, terms, callback) { + this._terms = terms; + if (providerResults.length == 0) { + this._clearResultDisplay(); + this.hide(); + callback(); + } else { + let maxResults = this._getMaxDisplayedResults(); + let results = this.provider.filterResults(providerResults, maxResults); + let moreCount = Math.max(providerResults.length - results.length, 0); + + this._ensureResultActors(results, successful => { + if (!successful) { + this._clearResultDisplay(); + callback(); + return; + } + + // To avoid CSS transitions causing flickering when + // the first search result stays the same, we hide the + // content while filling in the results. + this.hide(); + this._clearResultDisplay(); + results.forEach(resultId => { + this._addItem(this._resultDisplays[resultId]); + }); + + this._setMoreCount(this.provider.canLaunchSearch ? moreCount : 0); + this.show(); + callback(); + }); + } + } +}); + +var ListSearchResults = GObject.registerClass( +class ArcMenu_ListSearchResults extends SearchResultsBase { + _init(provider, resultsView) { + super._init(provider, resultsView); + this._menuLayout = resultsView._menuLayout; + this.searchType = this._menuLayout.layoutProperties.SearchDisplayType; + this._settings = this._menuLayout._settings; + this.layout = this._settings.get_enum('menu-layout'); + + this._container = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + x_expand: true, + y_expand: true, + }); + + if(this.searchType === Constants.DisplayType.GRID){ + this.add_style_class_name('margin-box'); + } + + this.providerInfo = new ArcSearchProviderInfo(provider, this._menuLayout); + this.providerInfo.connect('activate', () => { + if (provider.canLaunchSearch) { + provider.launchSearch(this._terms); + this._menuLayout.arcMenu.toggle(); + } + }); + + this._container.add_child(this.providerInfo); + + this._content = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL + }); + + this._container.add_child(this._content); + this._resultDisplayBin.set_child(this._container); + } + + _setMoreCount(count) { + this.providerInfo.setMoreCount(count); + } + + _getMaxDisplayedResults() { + return this._settings.get_int('max-search-results'); + } + + _clearResultDisplay() { + this._content.remove_all_children(); + } + + _createResultDisplay(meta) { + return super._createResultDisplay(meta, this.resultsView) || + new ListSearchResult(this.provider, meta, this.resultsView); + } + + _addItem(display) { + if(display.get_parent()) + display.get_parent().remove_child(display); + this._content.add_child(display); + } + + getFirstResult() { + if (this._content.get_n_children() > 0) + return this._content.get_child_at_index(0)._delegate; + else + return null; + } +}); + +var AppSearchResults = GObject.registerClass( +class ArcMenu_AppSearchResults extends SearchResultsBase { + _init(provider, resultsView) { + super._init(provider, resultsView); + this._parentContainer = resultsView; + this._menuLayout = resultsView._menuLayout; + this._settings = this._menuLayout._settings; + this.layoutProperties = this._menuLayout.layoutProperties; + this.searchType = this.layoutProperties.SearchDisplayType; + this.layout = this._menuLayout._settings.get_enum('menu-layout'); + + this.itemCount = 0; + this.gridTop = -1; + this.gridLeft = 0; + + this.rtl = this._menuLayout.mainBox.get_text_direction() == Clutter.TextDirection.RTL; + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.searchType === Constants.DisplayType.GRID ? this.layoutProperties.ColumnSpacing : 0, + row_spacing: this.searchType === Constants.DisplayType.GRID ? this.layoutProperties.RowSpacing : 0, + }); + this._grid = new St.Widget({ + x_expand: true, + x_align: this.searchType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this._grid); + + if(this.searchType === Constants.DisplayType.GRID){ + let spacing = this.layoutProperties.ColumnSpacing; + + this._grid.style = "padding: 0px 0px 10px 0px; spacing: " + spacing + "px;"; + this._resultDisplayBin.x_align = Clutter.ActorAlign.CENTER; + } + + this._resultDisplayBin.set_child(this._grid); + } + + _getMaxDisplayedResults() { + let maxDisplayedResults; + if(this.searchType === Constants.DisplayType.GRID) + maxDisplayedResults = this._menuLayout.getColumnsFromGridIconSizeSetting(); + else + maxDisplayedResults = this._settings.get_int('max-search-results'); + return maxDisplayedResults; + } + + _clearResultDisplay() { + this.itemCount = 0; + this.gridTop = -1; + this.gridLeft = 0; + this._grid.remove_all_children(); + } + + _createResultDisplay(meta) { + return new AppSearchResult(this.provider, meta, this.resultsView); + } + + _addItem(display) { + const GridColumns = this.searchType === Constants.DisplayType.LIST ? 1 : this._menuLayout.getColumnsFromGridIconSizeSetting(); + if(!this.rtl && (this.itemCount % GridColumns === 0)){ + this.gridTop++; + this.gridLeft = 0; + } + else if(this.rtl && (this.gridLeft === 0)){ + this.gridTop++; + this.gridLeft = GridColumns; + } + this._grid.layout_manager.attach(display, this.gridLeft, this.gridTop, 1, 1); + display.gridLocation = [this.gridLeft, this.gridTop]; + + if(!this.rtl) + this.gridLeft++; + else if(this.rtl) + this.gridLeft--; + this.itemCount++; + } + + getFirstResult() { + if (this._grid.get_n_children() > 0) + return this._grid.get_child_at_index(0)._delegate; + else + return null; + } +}); + +var SearchResults = GObject.registerClass({ + Signals: { 'terms-changed': {}, + 'have-results': {}, + 'no-results': {} }, +}, class ArcMenu_SearchResults extends St.BoxLayout { + _init(menuLayout) { + super._init({ + vertical: true, + y_expand: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL + }); + this._menuLayout = menuLayout; + this.layoutProperties = this._menuLayout.layoutProperties; + this.searchType = this.layoutProperties.SearchDisplayType; + this._settings = this._menuLayout._settings; + this.layout = this._settings.get_enum('menu-layout'); + + this._content = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.FILL + }); + + this.add_child(this._content); + + this._statusText = new St.Label(); + this._statusBin = new St.Bin({ + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true, + y_expand: true + }); + + if(menuLayout._settings.get_boolean('enable-custom-arc-menu')) + this._statusText.style_class = 'arc-menu-status-text'; + else + this._statusText.style_class = ''; + + this.add_child(this._statusBin); + this._statusBin.set_child(this._statusText); + + this._highlightDefault = true; + this._defaultResult = null; + this._startingSearch = false; + + this._terms = []; + this._results = {}; + + this._providers = []; + + this._highlightRegex = null; + + this.recentFilesManager = new RecentFilesManager(); + + this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA }); + this.disabledID = this._searchSettings.connect('changed::disabled', this._reloadRemoteProviders.bind(this)); + this.enabledID = this._searchSettings.connect('changed::enabled', this._reloadRemoteProviders.bind(this)); + this.disablExternalID = this._searchSettings.connect('changed::disable-external', this._reloadRemoteProviders.bind(this)); + this.sortOrderID = this._searchSettings.connect('changed::sort-order', this._reloadRemoteProviders.bind(this)); + + this._searchTimeoutId = null; + this._cancellable = new Gio.Cancellable(); + + this._registerProvider(new AppDisplay.AppSearchProvider()); + + this.installChangedID = appSys.connect('installed-changed', this._reloadRemoteProviders.bind(this)); + + this._reloadRemoteProviders(); + + this.connect('destroy', this._onDestroy.bind(this)); + } + + get terms() { + return this._terms; + } + + setStyle(style){ + if(this._statusText){ + this._statusText.style_class = style; + } + } + + _onDestroy(){ + this._terms = []; + this._results = {}; + this._clearDisplay(); + this._clearSearchTimeout(); + this._defaultResult = null; + this._startingSearch = false; + if(this.disabledID){ + this._searchSettings.disconnect(this.disabledID); + this.disabledID = null; + } + if(this.enabledID){ + this._searchSettings.disconnect(this.enabledID); + this.enabledID = null; + } + if(this.disablExternalID){ + this._searchSettings.disconnect(this.disablExternalID); + this.disablExternalID = null; + } + if(this.sortOrderID){ + this._searchSettings.disconnect(this.sortOrderID); + this.sortOrderID = null; + } + if(this.installChangedID){ + appSys.disconnect(this.installChangedID); + this.installChangedID = null; + } + let remoteProviders = this._providers.filter(p => p.isRemoteProvider); + remoteProviders.forEach(provider => { + this._unregisterProvider(provider); + }); + + this.recentFilesManager.destroy(); + this.recentFilesManager = null; + + this._content.destroy_all_children(); + } + + _reloadRemoteProviders() { + let currentTerms = this._terms; + //cancel any active search + if (this._terms.length !== 0) + this._reset(); + + this._oldProviders = null; + let remoteProviders = this._providers.filter(p => p.isRemoteProvider); + + remoteProviders.forEach(provider => { + this._unregisterProvider(provider); + }); + + if(this._settings.get_boolean('search-provider-open-windows')) + this._registerProvider(new OpenWindowSearchProvider()); + if(this._settings.get_boolean('search-provider-recent-files')) + this._registerProvider(new RecentFilesSearchProvider(this.recentFilesManager)); + + RemoteSearch.loadRemoteSearchProviders(this._searchSettings, providers => { + providers.forEach(this._registerProvider.bind(this)); + }); + + //restart any active search + if(currentTerms.length > 0) + this.setTerms(currentTerms); + } + + _registerProvider(provider) { + provider.searchInProgress = false; + this._providers.push(provider); + this._ensureProviderDisplay(provider); + } + + _unregisterProvider(provider) { + let index = this._providers.indexOf(provider); + this._providers.splice(index, 1); + + if (provider.display){ + provider.display.destroy(); + } + } + + _gotResults(results, provider) { + this._results[provider.id] = results; + this._updateResults(provider, results); + } + + _clearSearchTimeout() { + if (this._searchTimeoutId) { + GLib.source_remove(this._searchTimeoutId); + this._searchTimeoutId = null; + } + } + + _reset() { + this._terms = []; + this._results = {}; + this._clearDisplay(); + this._clearSearchTimeout(); + this._defaultResult = null; + this._startingSearch = false; + + this._updateSearchProgress(); + } + + _doSearch() { + this._startingSearch = false; + + let previousResults = this._results; + this._results = {}; + + this._providers.forEach(provider => { + provider.searchInProgress = true; + + let previousProviderResults = previousResults[provider.id]; + if (this._isSubSearch && previousProviderResults) + provider.getSubsearchResultSet(previousProviderResults, + this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + else + provider.getInitialResultSet(this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + }); + + this._updateSearchProgress(); + + this._clearSearchTimeout(); + } + + _onSearchTimeout() { + this._searchTimeoutId = null; + this._doSearch(); + return GLib.SOURCE_REMOVE; + } + + setTerms(terms) { + // Check for the case of making a duplicate previous search before + // setting state of the current search or cancelling the search. + // This will prevent incorrect state being as a result of a duplicate + // search while the previous search is still active. + let searchString = terms.join(' '); + let previousSearchString = this._terms.join(' '); + if (searchString == previousSearchString) + return; + + this._startingSearch = true; + + this.recentFilesManager.cancelCurrentQueries(); + + this._cancellable.cancel(); + this._cancellable.reset(); + + if (terms.length == 0) { + this._reset(); + return; + } + + let isSubSearch = false; + if (this._terms.length > 0) + isSubSearch = searchString.indexOf(previousSearchString) == 0; + + this._terms = terms; + this._isSubSearch = isSubSearch; + this._updateSearchProgress(); + + if (this._searchTimeoutId === null) + this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, this._onSearchTimeout.bind(this)); + + + + const escapedTerms = terms + .map(term => Shell.util_regex_escape(term)) + .filter(term => term.length > 0); + + if (escapedTerms.length === 0) + return; + + this._highlightRegex = new RegExp('(%s)'.format( + escapedTerms.join('|')), 'gi'); + + this.emit('terms-changed'); + } + + _ensureProviderDisplay(provider) { + if (provider.display) + return; + + let providerDisplay; + if (provider.appInfo) + providerDisplay = new ListSearchResults(provider, this); + else + providerDisplay = new AppSearchResults(provider, this); + providerDisplay.hide(); + this._content.add_child(providerDisplay); + provider.display = providerDisplay; + } + + _clearDisplay() { + this._providers.forEach(provider => { + provider.display.clear(); + }); + } + + _maybeSetInitialSelection() { + let newDefaultResult = null; + + let providers = this._providers; + for (let i = 0; i < providers.length; i++) { + let provider = providers[i]; + let display = provider.display; + + if (!display.visible) + continue; + + let firstResult = display.getFirstResult(); + if (firstResult) { + newDefaultResult = firstResult; + break; // select this one! + } + } + + if (newDefaultResult !== this._defaultResult) { + this._setSelected(this._defaultResult, false); + this._setSelected(newDefaultResult, this._highlightDefault); + + this._defaultResult = newDefaultResult; + } + } + + get searchInProgress() { + if (this._startingSearch) + return true; + + return this._providers.some(p => p.searchInProgress); + } + + _updateSearchProgress() { + let haveResults = this._providers.some(provider => { + let display = provider.display; + return (display.getFirstResult() != null); + }); + + this._statusBin.visible = !haveResults; + if (haveResults) + this.emit("have-results") + else if (!haveResults) { + if (this.searchInProgress) + this._statusText.set_text(_("Searching...")); + else + this._statusText.set_text(_("No results.")); + + this.emit("no-results") + } + } + + _updateResults(provider, results) { + let terms = this._terms; + let display = provider.display; + display.updateSearch(results, terms, () => { + provider.searchInProgress = false; + + this._maybeSetInitialSelection(); + this._updateSearchProgress(); + }); + } + + highlightDefault(highlight) { + this._highlightDefault = highlight; + this._setSelected(this._defaultResult, highlight); + } + + getTopResult(){ + return this._defaultResult; + } + + getProviders(){ + return this._providers; + } + + setProvider(providerID){ + if(!this._oldProviders) + this._oldProviders = this._providers; + this._clearDisplay(); + this._providers = this._oldProviders; + if(providerID === Constants.CategoryType.ALL_PROGRAMS){ + this._providers = this._providers.filter(p => (p.appInfo ? false : true)); + } + else if(providerID !== Constants.CategoryType.SEARCH_RESULTS){ + this._providers = this._providers.filter(p => (p.appInfo ? p.appInfo.get_id() : p) === providerID); + } + } + + _setSelected(result, selected) { + if(!result) + return; + + if(selected) + result.add_style_pseudo_class('active'); + else + result.remove_style_pseudo_class('active'); + } + + hasActiveResult(){ + return (this._defaultResult ? true : false) && this._highlightDefault; + } + + highlightTerms(text) { + if (!this._highlightRegex) + return GLib.markup_escape_text(text, -1); + + let escaped = []; + let lastMatchEnd = 0; + let match; + while ((match = this._highlightRegex.exec(text))) { + if (match.index > lastMatchEnd) { + let unmatched = GLib.markup_escape_text( + text.slice(lastMatchEnd, match.index), -1); + escaped.push(unmatched); + } + let matched = GLib.markup_escape_text(match[0], -1); + escaped.push('%s'.format(matched)); + lastMatchEnd = match.index + match[0].length; + } + let unmatched = GLib.markup_escape_text( + text.slice(lastMatchEnd), -1); + escaped.push(unmatched); + + return escaped.join(''); + } +}); + +var ArcSearchProviderInfo = GObject.registerClass(class Arc_Menu_ArcSearchProviderInfo extends MW.ArcMenuPopupBaseMenuItem{ + _init(provider, menuLayout) { + super._init(menuLayout); + this.provider = provider; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this.description = this.provider.appInfo.get_description(); + if(this.description) + this.description = this.description.split('\n')[0]; + + this.label = new St.Label({ + text: provider.appInfo.get_name(), + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + style: 'text-align: left;' + }); + + this.label.style = 'font-weight: bold;'; + this.style = "padding: 10px 0px;"; + this.add_child(this.label); + + this._moreText = ""; + } + + setMoreCount(count) { + this._moreText = ngettext("%d more", "%d more", count).format(count); + + if(count > 0) + this.label.text = this.provider.appInfo.get_name() + " (" + this._moreText + ")"; + else + this.label.text = this.provider.appInfo.get_name(); + } +}); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js new file mode 100644 index 0000000..933a1e6 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js @@ -0,0 +1,93 @@ +const { Meta, Gio, St, Shell } = imports.gi; + +const Main = imports.ui.main; +const { getWindows } = imports.ui.altTab; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +function createIcon(app, size) { + return app + ? app.create_icon_texture(size) + : new St.Icon({ icon_name: 'icon-missing', icon_size: size }); +} + +var OpenWindowSearchProvider = class { + constructor() { + this.id = 'arcmenu.open-windows'; + this.isRemoteProvider = true; + this.canLaunchSearch = false; + + this._appWindows = []; + this._windowTracker = Shell.WindowTracker.get_default(); + + this.appInfo = { + get_description: () => _('List of open windows across all workspaces'), + get_name: () => _('Open Windows'), + get_id: () => 'arcmenu.open-windows', + get_icon: () => Gio.icon_new_for_string('focus-windows-symbolic'), + } + } + + getResultMetas(winIds, callback) { + const metas = winIds.map(winId => { + const aw = this._getAppWindow(winId); + return aw ? { + id: winId, + name: aw.window.title ?? aw.app.get_name(), + description: aw.window.get_workspace() ? _("'%s' on Workspace %d").format(aw.app.get_name(), aw.window.get_workspace().index() + 1) : aw.app.get_name(), + createIcon: (size) => createIcon(aw.app, size), + } : undefined; + }).filter(m => m?.name !== undefined && m?.name !== null); + + callback(metas); + } + + filterResults(results, maxNumber) { + return results.slice(0, maxNumber); + } + + getInitialResultSet(terms, callback, _cancellable) { + this._appWindows = getWindows(null).map(window => { + return { + window, + app: this._windowTracker.get_window_app(window), + } + }); + + callback(this._getFilteredWindowIds(terms, this._appWindows)); + } + + getSubsearchResultSet(previousResults, terms, callback, _cancellable) { + const appWindows = previousResults.map(winId => this._getAppWindow(winId)).filter(aw => aw !== undefined); + callback(this._getFilteredWindowIds(terms, appWindows)); + } + + activateResult(winId, _terms) { + const window = this._getAppWindow(winId)?.window; + if (window) + Main.activateWindow(window); + } + + launchSearch() { + + } + + _getFilteredWindowIds(terms, appWindows) { + terms = terms.map(term => term.toLowerCase()); + appWindows = appWindows.filter(aw => { + const title = aw.window.title?.toLowerCase(); + const appName = aw.app.get_name()?.toLowerCase(); + const appDescription = aw.app.get_description()?.toLowerCase(); + return terms.some(term => title?.includes(term) || appName?.includes(term) || appDescription?.includes(term)); + }); + + return appWindows.map(aw => aw.window.get_id().toString()); + } + + _getAppWindow(winId) { + winId = typeof winId === "string" ? parseInt(winId) : winId; + return this._appWindows.find(aw => aw.window.get_id() === winId); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js new file mode 100644 index 0000000..fb595e4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js @@ -0,0 +1,100 @@ +const { Meta, Gtk, Gio, GLib, St, Shell } = imports.gi; + +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +function createIcon(mimeType, size) { + let symbolicIcon = mimeType ? Gio.content_type_get_symbolic_icon(mimeType)?.to_string() : null; + return symbolicIcon + ? new St.Icon({ gicon: Gio.icon_new_for_string(symbolicIcon), icon_size: size }) + : new St.Icon({ icon_name: 'icon-missing', icon_size: size }); +} + +var RecentFilesSearchProvider = class { + constructor(recentFilesManager) { + this.id = 'arcmenu.recent-files'; + this.isRemoteProvider = true; + this.canLaunchSearch = false; + this.recentFilesManager = recentFilesManager; + this._recentFiles = []; + + this.appInfo = { + get_description: () => _('Recent Files'), + get_name: () => _('Recent Files'), + get_id: () => 'arcmenu.recent-files', + get_icon: () => Gio.icon_new_for_string('document-open-recent-symbolic'), + } + } + + getResultMetas(fileUris, callback) { + const metas = fileUris.map(fileUri => { + const rf = this._getRecentFile(fileUri); + const file = Gio.File.new_for_uri(rf.get_uri()); + return rf ? { + id: fileUri, + name: rf.get_display_name(), + description: file.get_parent()?.get_path(), // can be null + createIcon: (size) => createIcon(rf.get_mime_type(), size), + } : undefined; + }).filter(m => m?.name !== undefined && m?.name !== null); + + callback(metas); + } + + filterResults(results, maxNumber) { + return results.slice(0, maxNumber); + } + + getInitialResultSet(terms, callback, _cancellable) { + this.recentFilesManager.cancelCurrentQueries(); + this._recentFiles = []; + this.recentFilesManager.filterRecentFiles(recentFile => { + this._recentFiles.push(recentFile); + callback(this._getFilteredFileUris(terms, this._recentFiles)); + }); + } + + getSubsearchResultSet(previousResults, terms, callback, _cancellable) { + const recentFiles = previousResults.map(fileUri => this._getRecentFile(fileUri)).filter(rf => rf !== undefined); + callback(this._getFilteredFileUris(terms, recentFiles)); + } + + activateResult(fileUri, _terms) { + const recentFile = this._getRecentFile(fileUri); + if (recentFile){ + let context = global.create_app_launch_context(0, -1); + + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(recentFile.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + Main.notifyError(_('Failed to open “%s”').format(recentFile.get_display_name()), e.message); + reject(e); + } + }); + }); + } + } + + launchSearch() { + } + + _getFilteredFileUris(terms, recentFiles) { + terms = terms.map(term => term.toLowerCase()); + recentFiles = recentFiles.filter(rf => { + const fileName = rf.get_display_name()?.toLowerCase(); + return terms.some(term => fileName?.includes(term)); + }); + + return recentFiles.map(rf => rf.get_uri()); + } + + _getRecentFile(fileUri) { + return this._recentFiles.find(rf => rf.get_uri() === fileUri); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js new file mode 100644 index 0000000..6c0613d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js @@ -0,0 +1,376 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var StandaloneRunner = class Arc_Menu_StandaloneRunner{ + constructor(settings) { + this._settings = settings; + + this.tooltipShowing = false; + this.tooltipHidingID = null; + this.tooltipShowingID = null; + this.dtpNeedsRelease = false; + + this.dummyWidget = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyWidget); + + //Create Main Menus - ArcMenu and arcMenu's context menu + this.arcMenu = new ArcMenu(this.dummyWidget, 0.5, St.Side.TOP, this); + this.arcMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.menuManager = new PopupMenu.PopupMenuManager(Main.panel); + this.menuManager._changeMenu = (menu) => {}; + this.menuManager.addMenu(this.arcMenu); + + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + + let rect = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryMonitor.index); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY = rect.y + this.rise; + this.dummyWidget.set_position(positionX, positionY); + + //Context Menus for applications and other menu items + this.contextMenuManager = new PopupMenu.PopupMenuManager(this.dummyWidget); + this.contextMenuManager._changeMenu = (menu) => {}; + this.contextMenuManager._onMenuSourceEnter = (menu) =>{ + if (this.contextMenuManager.activeMenu && this.contextMenuManager.activeMenu != menu) + return Clutter.EVENT_STOP; + + return Clutter.EVENT_PROPAGATE; + } + + //Sub Menu Manager - Control all other popup menus + this.subMenuManager = new PopupMenu.PopupMenuManager(this.dummyWidget); + this.subMenuManager._changeMenu = (menu) => {}; + } + + initiate(){ + this.initiateRecentlyInstalledApps(); + + //Create Basic Layout + this.createLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.createLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + initiateRecentlyInstalledApps(){ + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this._settings.get_boolean('disable-recently-installed-apps')) + return; + + this._appList = this.listAllApps(); + //Update Categories on 'installed-changed' event------------------------------------- + this._installedChangedId = appSys.connect('installed-changed', () => { + this._newAppList = this.listAllApps(); + + //Filter to find if a new application has been installed + let newApps = this._newAppList.filter(app => !this._appList.includes(app)); + + //A New Application has been installed + //Save it in settings + if(newApps.length){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + let newRecentApps = [...new Set(recentApps.concat(newApps))]; + this._settings.set_strv('recently-installed-apps', newRecentApps); + this.MenuLayout.reloadApplications(); + } + + this._appList = this._newAppList; + }); + } + + listAllApps(){ + let appList = appSys.get_installed().filter(appInfo => { + try { + appInfo.get_id(); // catch invalid file encodings + } catch (e) { + return false; + } + return appInfo.should_show(); + }); + return appList.map(app => app.get_id()); + } + + createMenuLayout(){ + this._forcedMenuLocation = false; + this.arcMenu.actor.style = null; + this.arcMenu.removeAll(); + this.section = new PopupMenu.PopupMenuSection(); + this.arcMenu.addMenuItem(this.section); + this.mainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL + }); + this.mainBox._delegate = this.mainBox; + this.section.actor.add_child(this.mainBox); + + const StandaloneRunner = true; + this.MenuLayout = Utils.getMenuLayout(this, Constants.MenuLayout.RUNNER, StandaloneRunner); + this.updateStyle(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + reloadMenuLayout(){ + this._forcedMenuLocation = false; + + this.MenuLayout.destroy(); + this.MenuLayout = null; + + this.arcMenu.actor.style = null; + + const StandaloneRunner = true; + this.MenuLayout = Utils.getMenuLayout(this, Constants.MenuLayout.RUNNER, StandaloneRunner); + + this.updateStyle(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + + this.arcMenu.actor.set_style_class_name(null); + this.arcMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + if(this.MenuLayout) + this.MenuLayout.updateStyle(); + } + + toggleMenu(){ + if(this.contextMenuManager.activeMenu) + this.contextMenuManager.activeMenu.toggle(); + if(this.subMenuManager.activeMenu) + this.subMenuManager.activeMenu.toggle(); + + if(!this.arcMenu.isOpen){ + this.MenuLayout.updateLocation(); + this.arcMenu.toggle(); + if(this.arcMenu.isOpen) + this.mainBox.grab_key_focus(); + } + else if(this.arcMenu.isOpen){ + this.arcMenu.toggle(); + } + } + + getActiveMenu(){ + if(this.contextMenuManager.activeMenu) + return this.contextMenuManager.activeMenu; + else if(this.subMenuManager.activeMenu) + return this.subMenuManager.activeMenu; + else if(this.arcMenu.isOpen) + return this.arcMenu; + else + return null; + } + + destroy(){ + if(this.createLayoutID){ + GLib.source_remove(this.createLayoutID); + this.createLayoutID = null; + } + + if(this.updateMenuLayoutID){ + GLib.source_remove(this.updateMenuLayoutID); + this.updateMenuLayoutID = null; + } + + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this.MenuLayout) + this.MenuLayout.destroy(); + if(this.arcMenu) + this.arcMenu.destroy(); + if(this.dummyWidget){ + Main.uiGroup.remove_child(this.dummyWidget); + this.dummyWidget.destroy(); + } + } + + updateMenuLayout(){ + this.tooltipShowing = false; + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.MenuLayout){ + this.MenuLayout.destroy(); + this.MenuLayout = null; + } + this.updateMenuLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.updateMenuLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + loadExtraPinnedApps(){ + if(this.MenuLayout) + this.MenuLayout.loadExtraPinnedApps(); + } + + updateLocation(){ + if(this.MenuLayout) + this.MenuLayout.updateLocation(); + } + + displayPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.displayPinnedApps(); + } + + loadPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.loadPinnedApps(); + } + + reload(){ + if(this.MenuLayout){ + this.reloadMenuLayout(); + } + } + + shouldLoadPinnedApps(){ + if(this.MenuLayout) + return this.MenuLayout.shouldLoadPinnedApps; + } + + setDefaultMenuView(){ + if(this.MenuLayout) + this.MenuLayout.setDefaultMenuView(); + } + + _onOpenStateChanged(menu, open) { + if(open){ + if(Main.panel.menuManager && Main.panel.menuManager.activeMenu) + Main.panel.menuManager.activeMenu.toggle(); + } + else{ + if(!this.arcMenu.isOpen){ + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + this.tooltipShowing = false; + if(this.activeTooltip){ + this.activeTooltip.hide(); + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + } + } + } +}; + +var ArcMenu = class Arc_Menu_ArcMenu extends PopupMenu.PopupMenu{ + constructor(sourceActor, arrowAlignment, arrowSide, standaloneRunner) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this.standaloneRunner = standaloneRunner; + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + this._boxPointer.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this._menuClosedID = this.connect('menu-closed', () => this.standaloneRunner.setDefaultMenuView()); + this.connect('destroy', () => this._onDestroy()); + } + + open(animate){ + if(!this.isOpen) + this.standaloneRunner.arcMenu.actor._muteInput = false; + super.open(animate); + } + + close(animate){ + if(this.isOpen){ + if(this.standaloneRunner.contextMenuManager.activeMenu) + this.standaloneRunner.contextMenuManager.activeMenu.toggle(); + if(this.standaloneRunner.subMenuManager.activeMenu) + this.standaloneRunner.subMenuManager.activeMenu.toggle(); + } + + super.close(animate); + } + + _onDestroy(){ + if(this._menuClosedID){ + this.disconnect(this._menuClosedID) + this._menuClosedID = null; + } + } +}; diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/utils.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/utils.js new file mode 100644 index 0000000..92207b5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/utils.js @@ -0,0 +1,687 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Constants = Me.imports.constants; +const {Gio, GLib} = imports.gi; + +const PowerManagerInterface = ` + + + + + + + + + + + + + + +`; +const PowerManager = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface); + +function canHibernate(asyncCallback){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHibernateRemote((result, error) => { + if(error) + asyncCallback(false, false); + else{ + let needsAuth = result[0] === 'challenge'; + let canHibernate = needsAuth || result[0] === 'yes'; + asyncCallback(canHibernate, needsAuth); + } + }); +} + +function activateHibernate(){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHibernateRemote((result, error) => { + if(error || result[0] !== 'yes') + imports.ui.main.notifyError(_("ArcMenu - Hibernate Error!"), _("System unable to hibernate.")); + else{ + proxy.HibernateRemote(true); + } + }); +} + +function canHybridSleep(asyncCallback){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHybridSleepRemote((result, error) => { + if(error) + asyncCallback(false, false); + else{ + let needsAuth = result[0] === 'challenge'; + let canHybridSleep = needsAuth || result[0] === 'yes'; + asyncCallback(canHybridSleep, needsAuth); + } + }); +} + +function activateHybridSleep(){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHybridSleepRemote((result, error) => { + if(error || result[0] !== 'yes') + imports.ui.main.notifyError(_("ArcMenu - Hybrid Sleep Error!"), _("System unable to hybrid sleep.")); + else{ + proxy.HybridSleepRemote(true); + } + }); +} + +function getMenuLayout(menuButton, layout, isStandaloneRunner){ + let MenuLayout = Me.imports.menulayouts; + switch(layout){ + case Constants.MenuLayout.ARCMENU: + return new MenuLayout.arcmenu.createMenu(menuButton); + case Constants.MenuLayout.BRISK: + return new MenuLayout.brisk.createMenu(menuButton); + case Constants.MenuLayout.WHISKER: + return new MenuLayout.whisker.createMenu(menuButton); + case Constants.MenuLayout.GNOME_MENU: + return new MenuLayout.gnomemenu.createMenu(menuButton); + case Constants.MenuLayout.MINT: + return new MenuLayout.mint.createMenu(menuButton); + case Constants.MenuLayout.GNOME_OVERVIEW: + return null; + case Constants.MenuLayout.ELEMENTARY: + return new MenuLayout.elementary.createMenu(menuButton); + case Constants.MenuLayout.REDMOND: + return new MenuLayout.redmond.createMenu(menuButton); + case Constants.MenuLayout.SIMPLE: + return new MenuLayout.simple.createMenu(menuButton); + case Constants.MenuLayout.SIMPLE_2: + return new MenuLayout.simple2.createMenu(menuButton); + case Constants.MenuLayout.UNITY: + return new MenuLayout.unity.createMenu(menuButton); + case Constants.MenuLayout.BUDGIE: + return new MenuLayout.budgie.createMenu(menuButton); + case Constants.MenuLayout.INSIDER: + return new MenuLayout.insider.createMenu(menuButton); + case Constants.MenuLayout.RUNNER: + return new MenuLayout.runner.createMenu(menuButton, isStandaloneRunner); + case Constants.MenuLayout.CHROMEBOOK: + return new MenuLayout.chromebook.createMenu(menuButton); + case Constants.MenuLayout.RAVEN: + return new MenuLayout.raven.createMenu(menuButton); + case Constants.MenuLayout.TOGNEE: + return new MenuLayout.tognee.createMenu(menuButton); + case Constants.MenuLayout.PLASMA: + return new MenuLayout.plasma.createMenu(menuButton); + case Constants.MenuLayout.WINDOWS: + return new MenuLayout.windows.createMenu(menuButton); + case Constants.MenuLayout.LAUNCHER: + return new MenuLayout.launcher.createMenu(menuButton); + case Constants.MenuLayout.ELEVEN: + return new MenuLayout.eleven.createMenu(menuButton); + case Constants.MenuLayout.AZ: + return new MenuLayout.az.createMenu(menuButton); + default: + return new MenuLayout.arcmenu.createMenu(menuButton); + } +} + +function getSettings(schema, extensionUUID) { + let extension = imports.ui.main.extensionManager.lookup(extensionUUID); + + if (!extension) + throw new Error('ArcMenu - getSettings() unable to find extension'); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Expect USER extensions to have a schemas/ subfolder, otherwise assume a + // SYSTEM extension that has been installed in the same prefix as the shell + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) { + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + } else { + schemaSource = GioSSS.get_default(); + } + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error(`Schema ${schema} could not be found for extension ${extension.metadata.uuid}. Please check your installation`); + + return new Gio.Settings({ settings_schema: schemaObj }); +} + +function convertToGridLayout(item){ + const Clutter = imports.gi.Clutter; + const settings = item._settings; + const layoutProperties = item._menuLayout.layoutProperties; + + let icon = item._icon ? item._icon : item._iconBin; + + item.vertical = true; + if(item._ornamentLabel) + item.remove_child(item._ornamentLabel); + + item.tooltipLocation = Constants.TooltipLocation.BOTTOM_CENTERED; + item.label.x_align = item.label.y_align = Clutter.ActorAlign.CENTER; + item.label.y_expand = true; + + icon.y_align = Clutter.ActorAlign.CENTER; + icon.y_expand = true; + if(settings.get_boolean('multi-lined-labels')){ + icon.y_align = Clutter.ActorAlign.TOP; + icon.y_expand = false; + + let clutterText = item.label.get_clutter_text(); + clutterText.set({ + line_wrap: true, + line_wrap_mode: imports.gi.Pango.WrapMode.WORD_CHAR, + }); + } + + if(item._indicator){ + item.remove_child(item._indicator); + item.insert_child_at_index(item._indicator, 0); + item._indicator.x_align = Clutter.ActorAlign.CENTER; + item._indicator.y_align = Clutter.ActorAlign.START; + item._indicator.y_expand = false; + } + + const iconSizeEnum = settings.get_enum('menu-item-grid-icon-size'); + let defaultIconStyle = layoutProperties.DefaultIconGridStyle; + + iconSize = getGridIconStyle(iconSizeEnum, defaultIconStyle); + item.name = iconSize; +} + +function getIconSize(iconSizeEnum, defaultIconSize){ + const IconSizeEnum = iconSizeEnum; + let iconSize = defaultIconSize; + if(IconSizeEnum === Constants.IconSize.DEFAULT) + iconSize = defaultIconSize; + else if(IconSizeEnum === Constants.IconSize.EXTRA_SMALL) + iconSize = Constants.EXTRA_SMALL_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.SMALL) + iconSize = Constants.SMALL_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.MEDIUM) + iconSize = Constants.MEDIUM_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.LARGE) + iconSize = Constants.LARGE_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.EXTRA_LARGE) + iconSize = Constants.EXTRA_LARGE_ICON_SIZE; + + return iconSize; +} + +function getGridIconSize(iconSizeEnum, defaultIconStyle){ + let iconSize; + if(iconSizeEnum === Constants.GridIconSize.DEFAULT){ + Constants.GridIconInfo.forEach((info) => { + if(info.NAME === defaultIconStyle){ + iconSize = info.ICON_SIZE; + } + }); + } + else + iconSize = Constants.GridIconInfo[iconSizeEnum - 1].ICON_SIZE; + + return iconSize; +} + +function getGridIconStyle(iconSizeEnum, defaultIconStyle){ + const IconSizeEnum = iconSizeEnum; + let iconStyle = defaultIconStyle; + if(IconSizeEnum === Constants.GridIconSize.DEFAULT) + iconStyle = defaultIconStyle; + else if(IconSizeEnum === Constants.GridIconSize.SMALL) + iconStyle = 'SmallIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.MEDIUM) + iconStyle = 'MediumIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.LARGE) + iconStyle = 'LargeIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.SMALL_RECT) + iconStyle = 'SmallRectIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.MEDIUM_RECT) + iconStyle = 'MediumRectIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.LARGE_RECT) + iconStyle = 'LargeRectIconGrid'; + + return iconStyle; +} + +function getCategoryDetails(currentCategory, categoryIconType){ + let name, gicon, iconName, fallbackIconName; + for(let entry of Constants.Categories){ + if(entry.CATEGORY === currentCategory){ + name = entry.NAME; + if(categoryIconType === Constants.CategoryIconType.FULL_COLOR) + iconName = entry.FULL_COLOR_ICON; + else + iconName = entry.ICON; + return [name, gicon, iconName, fallbackIconName]; + } + } + if(currentCategory === Constants.CategoryType.HOME_SCREEN){ + name = _("Home Screen"); + gicon = Gio.icon_new_for_string(Me.path + '/media/icons/menu_icons/homescreen-symbolic.svg'); + return [name, gicon, iconName, fallbackIconName]; + } + else{ + name = currentCategory.get_name(); + if(categoryIconType === Constants.CategoryIconType.FULL_COLOR) + gicon = currentCategory.get_icon() ? currentCategory.get_icon() : null; + else + iconName = currentCategory.get_icon().to_string() + "-symbolic"; + fallbackIconName = currentCategory.get_icon() ? currentCategory.get_icon().to_string() : null; + return [name, gicon, iconName, fallbackIconName]; + } +} + +function activateCategory(currentCategory, menuLayout, menuItem, extraParams = false){ + if(currentCategory === Constants.CategoryType.HOME_SCREEN){ + menuLayout.activeCategory = _("Pinned Apps"); + menuLayout.displayPinnedApps(); + } + else if(currentCategory === Constants.CategoryType.PINNED_APPS) + menuLayout.displayPinnedApps(); + else if(currentCategory === Constants.CategoryType.FREQUENT_APPS){ + menuLayout.setFrequentAppsList(menuItem); + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + } + else if(currentCategory === Constants.CategoryType.ALL_PROGRAMS) + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + else if(currentCategory === Constants.CategoryType.RECENT_FILES) + menuLayout.displayRecentFiles(); + else + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + + menuLayout.activeCategoryType = currentCategory; +} + +function getMenuButtonIcon(settings, path){ + let iconType = settings.get_enum('menu-button-icon'); + + if(iconType === Constants.MenuIcon.CUSTOM){ + if(path && GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + else if(iconType === Constants.MenuIcon.DISTRO_ICON){ + let iconEnum = settings.get_int('distro-icon'); + path = Me.path + Constants.DistroIcons[iconEnum].PATH; + if(Constants.DistroIcons[iconEnum].PATH === 'start-here-symbolic') + return 'start-here-symbolic'; + else if(GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + else{ + let iconEnum = settings.get_int('arc-menu-icon'); + path = Me.path + Constants.MenuIcons[iconEnum].PATH; + if(GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + + global.log("ArcMenu Error - Failed to set menu button icon. Set to System Default."); + return 'start-here-symbolic'; +} + +function findSoftwareManager(){ + let softwareManager = null; + let appSys = imports.gi.Shell.AppSystem.get_default(); + + for(let softwareManagerID of Constants.SoftwareManagerIDs){ + if(appSys.lookup_app(softwareManagerID)){ + softwareManager = softwareManagerID; + break; + } + } + + return softwareManager; +} + +function createXpmImage(color1, color2, color3, color4){ + let width = 42; + let height = 14; + let colors = 5; + let xpm = [width + " " + height + " " + colors + " " + 1, "1 c " + rgbStringToHex(color1), "2 c " + rgbStringToHex(color2), + "3 c " + rgbStringToHex(color3), "4 c " + rgbStringToHex(color4), "x c #AAAAAA"]; + xpm.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + for(let i = 0; i < height - 2; i++) + xpm.push("x1111111111222222222233333333334444444444x"); + xpm.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + return xpm; +} + +function areaOfTriangle(p1, p2, p3){ + return Math.abs((p1[0] * (p2[1] - p3[1]) + p2[0] * (p3[1] - p1[1]) + p3[0] * (p1[1] - p2[1])) / 2.0); +} + +function ensureActorVisibleInScrollView(actor) { + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2; + + let parent = actor.get_parent(); + while (!(parent instanceof imports.gi.St.ScrollView)) { + if (!parent) + return; + + box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + parent = parent.get_parent(); + } + + let adjustment = parent.vscroll.adjustment; + let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values(); + + let offset = 0; + let vfade = parent.get_effect("fade"); + if (vfade) + offset = vfade.fade_margins.top; + + if (y1 < value + offset) + value = Math.max(0, y1 - offset); + else if (y2 > value + pageSize - offset) + value = Math.min(upper, y2 + offset - pageSize); + else + return; + adjustment.set_value(value); +} + +function getArraysEqual(a, b) { + if(a instanceof Array && b instanceof Array){ + if (a.length !== b.length) + return false; + for(let i = 0; i < a.length; i++) + if (!getArraysEqual(a[i], b[i])) + return false; + return true; + } + else + return a === b; +} + +function createTooltip(button, widget, titleLabel, description, displayType){ + let lbl = titleLabel.clutter_text; + lbl.get_allocation_box(); + let isEllipsized = lbl.get_layout().is_ellipsized(); + if(displayType !== Constants.DisplayType.BUTTON && (isEllipsized || description)){ + let titleText, descriptionText; + if(isEllipsized && description){ + titleText = titleLabel.text.replace(/\n/g, " "); + descriptionText = description; + } + else if(isEllipsized && !description) + titleText = titleLabel.text.replace(/\n/g, " "); + else if(!isEllipsized && description) + descriptionText = description; + widget.tooltip = new Me.imports.menuWidgets.Tooltip(button, widget.actor, titleText, descriptionText); + widget.tooltip._onHover(); + } + else if(displayType === Constants.DisplayType.BUTTON){ + let titleText = titleLabel.text.replace(/\n/g, " "); + widget.tooltip = new Me.imports.menuWidgets.Tooltip(button, widget.actor, titleText, null); + widget.tooltip.location = Constants.TooltipLocation.TOP_CENTERED; + widget.tooltip._onHover(); + } +} + +function getDashToPanelPosition(settings, index){ + var positions = null; + var side; + + try{ + positions = JSON.parse(settings.get_string('panel-positions')) + } catch(e){ + log('Error parsing Dash to Panel positions: ' + e.message); + } + + if(!positions) + side = settings.get_string('panel-position'); + else{ + side = positions[index]; + } + + if (side === 'TOP') + return imports.gi.St.Side.TOP; + else if (side === 'RIGHT') + return imports.gi.St.Side.RIGHT; + else if (side === 'BOTTOM') + return imports.gi.St.Side.BOTTOM; + else if (side === 'LEFT') + return imports.gi.St.Side.LEFT; + else + return imports.gi.St.Side.BOTTOM; +} + +function getStylesheet(){ + let stylesheet = Gio.File.new_for_path(GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + + if(!stylesheet.query_exists(null)){ + GLib.spawn_command_line_sync("mkdir " + GLib.get_home_dir() + "/.local/share/arcmenu"); + GLib.spawn_command_line_sync("touch " + GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + stylesheet = Gio.File.new_for_path(GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + } + + return stylesheet; +} + +function rgbStringToHex(colorString) { + let [r, g, b, a_] = parseRgbString(colorString) + return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); +} + +function clutterColorToRGBA(color) { + return `rgba(${color.red}, ${color.green}, ${color.blue}, ${color.alpha})`; +} + +function parseRgbString(colorString){ + if(colorString.includes('rgba')) + colorString = colorString.replace('rgba(',''); + if(colorString.includes('rgb')) + colorString = colorString.replace('rgb(',''); + colorString = colorString.replace(')',''); + let rgbaColor = colorString.split(","); + + let r = parseFloat(rgbaColor[0]); + let g = parseFloat(rgbaColor[1]); + let b = parseFloat(rgbaColor[2]); + let a; + if(rgbaColor[3] != undefined) + a = parseFloat(rgbaColor[3]); + else + a = 1; + return [r, g, b, a]; +} + +function modifyColorLuminance(colorString, luminanceFactor, overrideAlpha){ + let Clutter = imports.gi.Clutter; + let color = Clutter.color_from_string(colorString)[1]; + let [hue, lum, sat] = color.to_hls(); + let modifiedLum = lum; + + if(lum >= .85) //if lum is too light, force darken + modifiedLum = Math.min((1 - Math.abs(luminanceFactor)) * modifiedLum, 1); + else if(lum <= .15) //if lum is too dark, force lighten + modifiedLum = Math.max((1 - Math.abs(luminanceFactor)) * modifiedLum, 0); + else if(luminanceFactor >= 0) //otherwise, darken or lighten based on luminanceFactor + modifiedLum = Math.min((1 + luminanceFactor) * modifiedLum, 1); + else + modifiedLum = Math.max((1 + luminanceFactor) * modifiedLum, 0); + + let alpha = (color.alpha / 255).toPrecision(3); + if(overrideAlpha) + alpha = overrideAlpha; + + let modifiedColor = Clutter.color_from_hls(hue, modifiedLum, sat); + + return `rgba(${modifiedColor.red}, ${modifiedColor.green}, ${modifiedColor.blue}, ${alpha})` +} + +function createStylesheet(settings){ + let customarcMenu = settings.get_boolean('enable-custom-arc-menu'); + let separatorColor = settings.get_string('separator-color'); + let menuColor = settings.get_string('menu-color'); + let menuForegroundColor = settings.get_string('menu-foreground-color'); + let borderColor = settings.get_string('border-color'); + let highlightColor = settings.get_string('highlight-color'); + let highlightForegroundColor = settings.get_string('highlight-foreground-color'); + let fontSize = settings.get_int('menu-font-size'); + let borderSize = settings.get_int('menu-border-size'); + let cornerRadius = settings.get_int('menu-corner-radius'); + let menuMargin = settings.get_int('menu-margin'); + let menuArrowSize = settings.get_int('menu-arrow-size'); + let leftPanelWidth = settings.get_int('menu-width'); + let leftPanelWidthSmall = settings.get_int('menu-width') - 65; + let rightPanelWidth = settings.get_int('right-panel-width'); + let rightPanelWidthPlus45 = settings.get_int('right-panel-width') + 45; + let rightPanelWidthPlus70 = settings.get_int('right-panel-width') + 70; + let avatarStyle = settings.get_enum('avatar-style'); + let avatarRadius = avatarStyle == 0 ? 999 : 0; + let menuButtonColor = settings.get_string('menu-button-color'); + let menuButtonHoverColor = settings.get_string('menu-button-hover-color'); + let menuButtonActiveColor = settings.get_string('menu-button-active-color'); + let menuButtonHoverBackgroundcolor = settings.get_string('menu-button-hover-backgroundcolor'); + let menuButtonActiveBackgroundcolor = settings.get_string('menu-button-active-backgroundcolor'); + let gapAdjustment = settings.get_int('gap-adjustment'); + let indicatorColor = settings.get_string('indicator-color'); + let indicatorTextBackgroundColor = settings.get_string('indicator-text-color'); + let plasmaSelectedItemColor = settings.get_string('plasma-selected-color'); + let plasmaSelectedItemBackgroundColor = settings.get_string('plasma-selected-background-color'); + let plasmaSearchBarTop = settings.get_enum('searchbar-default-top-location'); + let menuButtonBorderRadius = settings.get_int('menu-button-border-radius'); + let tooltipStyle, separatorColorStyle = "\n", smallButtonHoverStyle = "\n"; + let plasmaButtonStyle = plasmaSearchBarTop === Constants.SearchbarLocation.TOP ? 'border-top-width: 2px;' : 'border-bottom-width: 2px;'; + if(customarcMenu){ + tooltipStyle = ".tooltip-menu-item{\nborder-radius: 8px;\nbox-shadow: 0 0 1px 0px " + separatorColor + ";\nfont-size:" + fontSize + "pt;\npadding: 3px 8px;\nmin-height: 0px;" + + "\ncolor:" + menuForegroundColor+ ";\nbackground-color:" + modifyColorLuminance(menuColor, 0.05, 1) + ";\nmax-width:550px;\n}\n\n"; + separatorColorStyle = ".separator-color-style{\nbackground-color: " + separatorColor + ";\n}\n\n"; + smallButtonHoverStyle = ".arc-menu .popup-menu-item .arcmenu-small-button.selected{\nbackground-color: " + modifyColorLuminance(highlightColor, -0.25) + "\n}\n\n"; + } + else + tooltipStyle = ".tooltip-menu-item{\nborder-radius: 8px;\npadding: 3px 8px;\nmax-width:550px;\nmin-height: 0px;\n}\n\n"; + + let menuButtonStyle = ''; + if(settings.get_boolean('override-menu-button-color')) + menuButtonStyle += ".arc-menu-icon, .arc-menu-text, .arc-menu-arrow{\ncolor: " + menuButtonColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-hover-background-color')) + menuButtonStyle += ".arc-menu-panel-menu:hover{\nbackground-color: " + menuButtonHoverBackgroundcolor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-hover-color')) + menuButtonStyle += ".arc-menu-panel-menu:hover .arc-menu-icon, .arc-menu-panel-menu:hover .arc-menu-text" + +", .arc-menu-panel-menu:hover .arc-menu-arrow{\ncolor: " + menuButtonHoverColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-active-color')) + menuButtonStyle += ".arc-menu-icon:active, .arc-menu-text:active, .arc-menu-arrow:active{\ncolor: " + menuButtonActiveColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-active-background-color')) + menuButtonStyle += ".arc-menu-panel-menu:active{\nbackground-color: " + menuButtonActiveBackgroundcolor + ";\n}\n\n"; + if(settings.get_boolean('menu-button-override-border-radius')){ + let border = menuButtonBorderRadius === 0 ? 1 : 3; + menuButtonStyle += ".arc-menu-panel-menu{\nborder-radius: " + menuButtonBorderRadius + "px;\nborder: " + border + "px solid transparent;\n}\n\n"; + } + + let iconGridStyle = "\ntext-align: center;\n border-radius: 8px;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\n"; + + let stylesheetCSS = "#arc-search{\nwidth: " + leftPanelWidth + "px;\n}\n\n" + +".arc-menu-status-text{\ncolor:" + menuForegroundColor + ";\nfont-size:" + fontSize + "pt;\n}\n\n" + +".search-statustext{\nfont-size:11pt;\n}\n\n" + + +"#ExtraLargeIconGrid{\nwidth: 150px;\n height: 150px;" + iconGridStyle + "}\n\n" + + +"#LargeIconGrid{\nwidth: 95px;\n height: 95px;" + iconGridStyle + "}\n\n" + + +"#MediumIconGrid{\nwidth: 87px;\n height: 87px;" + iconGridStyle + "}\n\n" + + +"#SmallIconGrid{\nwidth: 80px;\n height: 80px;" + iconGridStyle + "}\n\n" + + +"#LargeRectIconGrid{\nwidth: 95px;\n height: 85px;" + iconGridStyle + "}\n\n" + + +"#MediumRectIconGrid{\nwidth: 92px;\n height: 78px;" + iconGridStyle + "}\n\n" + + +"#SmallRectIconGrid{\nwidth: 85px;\n height: 70px;" + iconGridStyle + "}\n\n" + + +".left-panel{\nwidth:" + leftPanelWidth + "px;\n}\n\n" + +".left-panel-small{\nwidth:" + leftPanelWidthSmall + "px;\n}\n\n" + +".right-panel{\nwidth:" + rightPanelWidth + "px;\n}\n\n" + +".right-panel-plus45{\nwidth:" + rightPanelWidthPlus45 + "px;\n}\n\n" + +".right-panel-plus70{\nwidth:" + rightPanelWidthPlus70 + "px;\n}\n\n" + +".default-search-entry{\nmax-width: 17.667em;\n}\n\n" + +".arc-search-entry{\nmax-width: 17.667em;\nfont-size:" + fontSize + "pt;\nborder-color:" + separatorColor + ";\nborder-width: 1px;\n" + +"color:" + menuForegroundColor + ";\nbackground-color:" + modifyColorLuminance(menuColor, -0.1, 1) + ";\n}\n\n" + +".arc-search-entry:focus{\nborder-color:" + highlightColor + ";\nborder-width: 1px;\nbox-shadow: inset 0 0 0 1px " + modifyColorLuminance(highlightColor, 0.05) + ";\n}\n\n" + +".arc-search-entry StLabel.hint-text{\ncolor: " + modifyColorLuminance(menuForegroundColor, 0, 0.6) + ";\n}\n\n" + +"#ArcSearchEntry{\nmin-height: 0px;\nborder-radius: 8px;\nborder-width: 1px;\npadding: 7px 9px;\n}\n\n" + +"#ArcSearchEntryRound{\nmin-height: 0px;\nborder-radius: 18px;\nborder-width: 1px;\npadding: 7px 12px;\n}\n\n" + + menuButtonStyle + +".symbolic-icons{\n-st-icon-style: symbolic;\n}\n\n" + +".regular-icons{\n-st-icon-style: regular;\n}\n\n" + +".arcmenu-menu-item{\nborder-radius: 8px;\n}\n\n" + +".margin-box{\nmargin: 0px 4px;\n}\n\n" + +"#arc-menu-launcher-button{\nmax-width: 90px;\nborder-radius: 0px;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\nborder-color: transparent;\nborder-bottom-width: 3px;\n}\n\n" + +"#arc-menu-launcher-button.active-item, #arc-menu-launcher-button:active{\nbackground-color: " + plasmaSelectedItemBackgroundColor + ";\n" + +"\nborder-color: " + plasmaSelectedItemColor + ";\nborder-bottom-width: 3px;\n}\n\n" + + +"#arc-menu-plasma-button{\nwidth: 90px;\n height: 65px;\nborder-radius: 8px;\n text-align: center;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\n\n" + plasmaButtonStyle + ";\nborder-color: transparent;\n}\n\n" + +"#arc-menu-plasma-button:active-item, .arc-menu-plasma-button:active{\nbackground-color: " + plasmaSelectedItemBackgroundColor + ";\n" + + plasmaButtonStyle + "\nborder-color: " + plasmaSelectedItemColor + ";\n}\n\n" + + +"StScrollView .small-vfade{\n-st-vfade-offset: 44px;\n}\n\n" + + +".arc-menu-button{\n-st-icon-style: symbolic;\nborder-width: 1px;\nborder-radius: 8px;\npadding: 8px;\n}\n\n" + +".arcmenu-small-button{\n-st-icon-style: symbolic;\nborder-radius: 8px;\npadding: 3px 8px;\n}\n\n" + +smallButtonHoverStyle + + +".arc-menu-menu-item-indicator{\ncolor: " + indicatorColor + ";\n}\n\n" + +".arc-menu-menu-item-text-indicator{\nbackground-color: " + indicatorTextBackgroundColor + ";\n}\n\n" + + +tooltipStyle + + +".arc-menu{\n-boxpointer-gap: " + gapAdjustment + "px;\nmin-width: 15em;\ncolor: #D3DAE3;\nborder-image: none;\n" + +"box-shadow: none;\nfont-size:" + fontSize + "pt;\n}\n\n" + +".arc-menu .popup-sub-menu{\npadding-bottom: 1px;\nbackground-color: " + modifyColorLuminance(menuColor, 0.04) + ";\n}\n\n" + +".arc-menu .popup-menu-item{\nspacing: 6px; \nborder: none;\ncolor:" + menuForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:active{\nbackground-color:" + modifyColorLuminance(highlightColor, -0.15) + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item.selected{\nbackground-color:" + highlightColor + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:checked{\nbackground-color:" + highlightColor + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:insensitive{\ncolor:" + modifyColorLuminance(menuForegroundColor, 0, 0.6) + ";\n}\n\n" + +".arc-menu-boxpointer{ \n-arrow-border-radius:" + cornerRadius + "px;\n" + +"-arrow-background-color:" + menuColor + ";\n" + +"-arrow-border-color:" + borderColor + ";\n" + +"-arrow-border-width:" + borderSize + "px;\n" + +"-arrow-base:" + menuMargin + "px;\n" + +"-arrow-rise:" + menuArrowSize + "px;\n}\n\n" + +".arc-menu .popup-menu-content{\npadding: 16px 0px;\nmargin: 0;\nbackground-color: transparent;\nborder-radius: 0px;\nbox-shadow: 0;\n}\n\n" + + +".arcmenu-separator{\npadding: 0px;\nheight: 1px;\nmargin: 0px 20px;\n}\n\n" + + separatorColorStyle + +".menu-user-avatar{\nbackground-size: contain;\nborder-radius: " + avatarRadius + "px;\n}\n\n"; + + let stylesheet = getStylesheet(); + if(stylesheet){ + try{ + stylesheet.replace_contents(stylesheetCSS, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null); + } + catch(e){ + global.log("ArcMenu Error - Failed to update stylesheet. " + e.message); + } + } + else + global.log("ArcMenu Error - Failed to find stylesheet."); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/appfolders.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/appfolders.js new file mode 100644 index 0000000..9548559 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/appfolders.js @@ -0,0 +1,225 @@ +'use strict'; + +const { Shell, GLib, Clutter } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +const transparent = Clutter.Color.from_pixel(0x00000000); +const FOLDER_DIALOG_ANIMATION_TIME = 200; +const FRAME_UPDATE_PERIOD = 16; + +let original_zoomAndFadeIn = null; +let original_zoomAndFadeOut = null; +let sigma = 30; +let brightness = 0.6; + +let _zoomAndFadeIn = function () { + let [sourceX, sourceY] = + this._source.get_transformed_position(); + let [dialogX, dialogY] = + this.child.get_transformed_position(); + + this.child.set({ + translation_x: sourceX - dialogX, + translation_y: sourceY - dialogY, + scale_x: this._source.width / this.child.width, + scale_y: this._source.height / this.child.height, + opacity: 0, + }); + + this.set_background_color(transparent); + + let effect = this.get_effect("appfolder-blur"); + + effect.sigma = 0; + Utils.ease_property(effect, 'sigma', 0, sigma, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + effect.brightness = 1.0; + Utils.ease_property(effect, 'brightness', 1.0, brightness, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + this.child.ease({ + translation_x: 0, + translation_y: 0, + scale_x: 1, + scale_y: 1, + opacity: 255, + duration: FOLDER_DIALOG_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + }); + + this._needsZoomAndFade = false; + + if (this._sourceMappedId === 0) { + this._sourceMappedId = this._source.connect( + 'notify::mapped', this._zoomAndFadeOut.bind(this)); + } +} + +let _zoomAndFadeOut = function () { + if (!this._isOpen) + return; + + if (!this._source.mapped) { + this.hide(); + return; + } + + let [sourceX, sourceY] = + this._source.get_transformed_position(); + let [dialogX, dialogY] = + this.child.get_transformed_position(); + + this.set_background_color(transparent); + + let effect = this.get_effect("appfolder-blur"); + + Utils.ease_property(effect, 'sigma', effect.sigma, 0, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + Utils.ease_property(effect, 'brightness', effect.brightness, 1.0, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + this.child.ease({ + translation_x: sourceX - dialogX, + translation_y: sourceY - dialogY, + scale_x: this._source.width / this.child.width, + scale_y: this._source.height / this.child.height, + opacity: 0, + duration: FOLDER_DIALOG_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => { + this.child.set({ + translation_x: 0, + translation_y: 0, + scale_x: 1, + scale_y: 1, + opacity: 255, + }); + this.hide(); + + this._popdownCallbacks.forEach(func => func()); + this._popdownCallbacks = []; + }, + }); + + this._needsZoomAndFade = false; +} + + +var AppFoldersBlur = class AppFoldersBlur { + constructor(connections, prefs) { + this.connections = connections; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.prefs = prefs; + } + + enable() { + this._log("blurring appfolders"); + + if (Main.overview._overview.controls._appDisplay._folderIcons.length > 0) { + this.blur_appfolders(); + } + this.connections.connect(Main.overview._overview.controls._appDisplay, 'view-loaded', () => { + this.blur_appfolders(); + }) + } + + blur_appfolders() { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + icon._ensureFolderDialog(); + + if (original_zoomAndFadeIn == null) { + original_zoomAndFadeIn = icon._dialog._zoomAndFadeIn; + } + if (original_zoomAndFadeOut == null) { + original_zoomAndFadeOut = icon._dialog._zoomAndFadeOut; + } + + let effect = new Shell.BlurEffect({ + name: "appfolder-blur", + sigma: sigma, + brightness: brightness, + mode: 1 + }); + icon._dialog.remove_effect_by_name("appfolder-blur"); + icon._dialog.add_effect(effect); + + // HACK + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("appfolders hack level 1"); + this.paint_signals.disconnect_all(); + + Utils.setTimeout(() => { + this.paint_signals.connect(Main.overview._overview, effect); + this.paint_signals.connect(icon._dialog, effect); + }, 100); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("appfolders hack level 2"); + this.paint_signals.disconnect_all(); + + Utils.setTimeout(() => { + this.paint_signals.connect(Main.overview._overview, effect); + this.paint_signals.connect(icon._dialog, effect); + }, 100); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + + icon._dialog._viewBox.set_style_class_name('app-folder-dialog transparent-app-folder-dialogs-' + 100 * this.prefs.APPFOLDER_DIALOG_OPACITY.get()); + + icon._dialog._zoomAndFadeIn = _zoomAndFadeIn; + icon._dialog._zoomAndFadeOut = _zoomAndFadeOut; + }); + } + + set_sigma(s) { + sigma = s; + if (this.prefs.BLUR_APPFOLDERS.get()) + this.blur_appfolders(); + } + + set_brightness(b) { + brightness = b; + if (this.prefs.BLUR_APPFOLDERS.get()) + this.blur_appfolders(); + } + + disable() { + this._log("removing blur from appfolders"); + + if (original_zoomAndFadeIn != null) { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) + icon._dialog._zoomAndFadeIn = original_zoomAndFadeIn; + }); + } + if (original_zoomAndFadeOut != null) { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) + icon._dialog._zoomAndFadeOut = original_zoomAndFadeOut; + }); + } + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) { + icon._dialog.remove_effect_by_name("appfolder-blur") + icon._dialog._viewBox.remove_style_class_name('transparent-app-folder-dialogs-' + 100 * this.prefs.APPFOLDER_DIALOG_OPACITY.get()); + } + }); + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/applications.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/applications.js new file mode 100644 index 0000000..e044464 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/applications.js @@ -0,0 +1,274 @@ +'use strict'; + +const { Shell, Clutter, Meta, GLib } = imports.gi; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; +const BlurMode = Shell.BlurMode; + +var ApplicationsBlur = class ApplicationsBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + + this.windowMap = new Map(); + this.blurActorMap = new Map(); + } + + enable() { + this._log("blurring applications..."); + + // iterate through existing windows and add blur as needed + for (let workspace = 0; workspace < global.workspace_manager.get_n_workspaces(); ++workspace) { + let metaWorkspace = global.workspace_manager.get_workspace_by_index(workspace); + let windows = metaWorkspace.list_windows(); + windows.forEach((meta_window) => { + let window_actor = meta_window.get_compositor_private(); + this.track_new(window_actor, meta_window); + }) + } + + // blur every new window + this.connections.connect(global.display, 'window-created', (meta_display, meta_window) => { + this._log("window created"); + if (meta_window) { + let window_actor = meta_window.get_compositor_private(); + this.track_new(window_actor, meta_window); + } + }); + + // workaround for blur being in front of target windows + this.connections.connect(global.display, 'notify::focus-window', () => { + if (this.blurActorMap.size > 0) { + let callbackId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this.blurActorMap.forEach((blurActor, pid) => { + let actor = this.windowMap.get(pid).get_compositor_private(); + if (actor !== null && actor.get_parent() === blurActor.get_parent()) { + global.window_group.set_child_below_sibling(blurActor, actor); + } + }) + }) + } + }) + } + + // Blurs and add the needed signals to every new tracked window + track_new(window_actor, meta_window) { + // TODO change the pid to a more unique one, to prevent collisions? + let pid = Date.now(); + + window_actor['blur_provider_pid'] = pid; + meta_window['blur_provider_pid'] = pid; + + // remove the blur when the window is destroyed + this.connections.connect(window_actor, 'destroy', (window_actor) => { + let pid = window_actor.blur_provider_pid; + if (this.blurActorMap.has(pid)) { + this.remove_blur(pid) + } + }); + + // update the blur when the mutter-hint is changed + this.connections.connect(meta_window, 'notify::mutter-hints', (meta_window) => { + this._log("mutter-hint changed"); + let pid = meta_window.blur_provider_pid; + let window_actor = meta_window.get_compositor_private(); + this.update_blur(window_actor, meta_window, pid) + }); + + this.update_blur(window_actor, meta_window, pid); + } + + // This method is basically a catch-all for blurring windows. It handles the decisions + // to call different methods that handle removing, setting, and updating blur + update_blur(window_actor, meta_window, pid) { + let mutter_hint = meta_window.get_mutter_hints(); + + // check if the window wants blur and update it accordingly + if (mutter_hint != null && mutter_hint.includes("blur-provider")) { + // get blur effect parameters + let sigma = this.parse_sigma_value(mutter_hint); + let brightness = this.prefs.BRIGHTNESS.get(); + + // if the provided sigma value is incorrect + if (sigma == null || sigma < 0 || sigma > 111) { + this._log("sigma value is null or outside of range (0-111), defaulting to extension setting") + sigma = this.prefs.SIGMA.get(); + } + + // check wether the actor is already blurred and act consequently + if (this.blurActorMap.has(pid)) { + if (sigma == 0) { + // actor already blurred, should not be anymore + this.remove_blur(pid); + } else { + // actor already blurred, update it + this.update_blur_effect( + this.blurActorMap.get(pid), + sigma, + brightness + ); + } + } else if (sigma != 0) { + // actor not blurred, blur it + this.set_blur( + pid, + window_actor, + meta_window, + this.create_blur_effect(sigma, brightness) + ) + } + } else if (this.blurActorMap.has(pid)) { + // remove blur if the mutter_hint no longer contains our blur-provider value + this.remove_blur(pid); + } + } + + // Returns a new blur effect + create_blur_effect(sigma, brightness) { + return new Shell.BlurEffect({ + sigma: sigma, + brightness: brightness, + mode: BlurMode.BACKGROUND + }); + } + + // Add the blur effect to the actor + set_blur(pid, window_actor, meta_window, blurEffect) { + let blurActor = this.create_blur_actor(meta_window, window_actor, blurEffect); + + // if hacks are selected, force the repaint the window to prevent artifacts + if (this.prefs.HACKS_LEVEL.get() >= 1) { + this._log("applications hack level 1 or 2"); + this.paint_signals.disconnect_all(); + this.paint_signals.connect(blurActor, blurEffect); + } else { + this.paint_signals.disconnect_all(); + } + + global.window_group.insert_child_below(blurActor, window_actor); + + // registed the blur actor/effect + blurActor['blur_provider_pid'] = pid; + this.blurActorMap.set(pid, blurActor); + this.windowMap.set(pid, meta_window); + + // hide if window become invisible + this.connections.connect(window_actor, 'notify::visible', (window_actor) => { + let pid = window_actor.blur_provider_pid; + if (window_actor.visible) { + this.blurActorMap.get(pid).show(); + } else { + this.blurActorMap.get(pid).hide(); + } + }); + } + + // Returns a new already blurred widget, configured to follow the size and + // position of its target window + create_blur_actor(meta_window, window_actor, blurEffect) { + // create the constraints in size and position to its target window + let frame = meta_window.get_frame_rect(); + let buffer = meta_window.get_buffer_rect(); + + const offsetX = frame.x - buffer.x; + const offsetY = frame.y - buffer.y; + const offsetWidth = buffer.width - frame.width; + const offsetHeight = buffer.height - frame.height; + + let constraintPosX = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.X, + offset: offsetX + }); + let constraintPosY = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.Y, + offset: offsetY + }); + + let constraintSizeX = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.WIDTH, + offset: -offsetWidth + }); + let constraintSizeY = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.HEIGHT, + offset: -offsetHeight + }); + + // create the actor and add the constraints + let blurActor = new Clutter.Actor(); + blurActor.add_constraint(constraintPosX); + blurActor.add_constraint(constraintPosY); + blurActor.add_constraint(constraintSizeX); + blurActor.add_constraint(constraintSizeY); + + // add the effect + blurActor.add_effect_with_name('blur-effect', blurEffect); + + return blurActor; + } + + // Updates the blur effect by overwriting its sigma and brightness values + update_blur_effect(blur_actor, sigma, brightness) { + let effect = blur_actor.get_effect('blur-effect'); + effect.sigma = sigma; + effect.brightness = brightness; + } + + // Removes the blur actor from the shell and unregister it + remove_blur(pid) { + // global.window_group is null when restarting the shell, causing an innocent crash crash + if (global.window_group == null) + return + + global.window_group.remove_actor(this.blurActorMap.get(pid)); + this.blurActorMap.delete(pid); + this.windowMap.delete(pid); + } + + // When given the xprop property, returns either a valid sigma value between 0 and 111 + // or null if the parsing is incorrect + parse_sigma_value(property) { + let result = property.match("(blur-provider=)(\\d{1,3})") + if (result == null) { + return null; + } else { + return result[2]; + } + } + + disable() { + this._log("removing blur from applications..."); + + this.blurActorMap.forEach(((value, key) => { + this.remove_blur(key) + })); + this.connections.disconnect_all(); + this.paint_signals.disconnect_all(); + } + + // Updates each blur effect to use new sigma value + set_sigma(s) { + this.blurActorMap.forEach((actor, _) => { + actor.get_effect('blur-effect').set_sigma(s) + }) + } + + // Updates each blur effect to use new brightness value + set_brightness(b) { + this.blurActorMap.forEach((actor, _) => { + actor.get_effect('blur-effect').set_brightness(b) + }) + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/connections.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/connections.js new file mode 100644 index 0000000..3517a27 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/connections.js @@ -0,0 +1,81 @@ +'use strict'; + +const GObject = imports.gi.GObject; + + +var Connections = class Connections { + constructor() { + this.buffer = []; + } + + process_connection(actor, id) { + let infos = { + actor: actor, + id: id + }; + + if (actor.connect && (!(actor instanceof GObject.Object) || GObject.signal_lookup('destroy', actor))) { + let destroy_id = actor.connect('destroy', () => { + actor.disconnect(id); + actor.disconnect(destroy_id); + + let index = this.buffer.indexOf(infos); + if (index >= 0) { + this.buffer.splice(index, 1) + } + }) + } + + this.buffer.push(infos) + } + + connect(actor, signal, handler) { + let id = actor.connect(signal, handler); + this.process_connection(actor, id); + } + + connect_after(actor, signal, handler) { + let id = actor.connect_after(signal, handler); + + this.process_connection(actor, id); + } + + disconnect_all_for(actor) { + let actor_connections = [] + + this.buffer.forEach((infos) => { + if (infos.actor == actor) { + actor_connections.push(infos) + } + }); + + actor_connections.forEach((connection) => { + // disconnect + try { + connection.actor.disconnect(connection.id) + } catch (e) { + this._log(`error removing connection: ${e}; continuing`) + } + + // remove from buffer + let index = this.buffer.indexOf(connection); + this.buffer.splice(index, 1); + }) + } + + disconnect_all() { + this.buffer.forEach((connection) => { + try { + connection.actor.disconnect(connection.id) + } catch (e) { + this._log(`error removing connection: ${e}; continuing`) + } + }) + this.buffer = []; + } + + // no need to check if DEBUG here, the log function is only used on error + _log(str) { + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash.js new file mode 100644 index 0000000..650bf69 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash.js @@ -0,0 +1,51 @@ +'use strict'; + +const { St, Shell, Meta } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; + + +var DashBlur = class DashBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + } + + enable() { + this._log("blurring dash"); + this.update(); + } + + update() { + if (Main.overview.dash.constructor.name == "Dash") { + Main.overview.dash.get_child_at_index(0).style = "background-color:rgba(0,0,0," + this.prefs.DASH_OPACITY.get() + ")"; + } + + // set search entry the same opacity as the dash + Main.overview._overview._controls._searchEntry.style = "background-color:rgba(0,0,0," + this.prefs.DASH_OPACITY.get() + ")"; + } + + disable() { + this._log("removing blur from dash"); + + if (Main.overview.dash.constructor.name == "Dash") { + if (Main.screenShield && !Main.screenShield.locked) { + try { + Main.overview.dash.get_child_at_index(0).style = null; + } catch (e) { + this._log(e); + } + } + } + Main.overview._overview._controls._searchEntry.style = null; + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`); + } +}; \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js new file mode 100644 index 0000000..166f147 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js @@ -0,0 +1,235 @@ +'use strict'; + +const { St, Shell, GLib } = imports.gi; +const Main = imports.ui.main; +const Signals = imports.signals; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +// This type of object is created for every dash found, and talks to the main DashBlur thanks +// to signals. This allows to dynamically track the created dashes for each screen. +class DashInfos { + constructor(dash_blur, dash, dash_box, background_parent, effect, prefs) { + // the parent DashBlur object, to communicate + this.dash_blur = dash_blur; + // the blurred dash + this.dash = dash; + // the actually blurred box + this.dash_box = dash_box; + this.background_parent = background_parent; + this.effect = effect; + this.prefs = prefs; + + dash_blur.connections.connect(dash_blur, 'remove-dashes', () => { + this._log("removing blur from dash"); + this.dash.get_parent().remove_child(this.background_parent); + this.dash.remove_style_class_name('blurred-dash'); + }); + + dash_blur.connections.connect(dash_blur, 'update-sigma', () => { + this.effect.sigma = this.dash_blur.sigma; + }); + + dash_blur.connections.connect(dash_blur, 'update-brightness', () => { + this.effect.brightness = this.dash_blur.brightness; + }); + + dash_blur.connections.connect(dash_blur, 'show', () => { + this.effect.sigma = this.dash_blur.sigma; + }); + + dash_blur.connections.connect(dash_blur, 'hide', () => { + this.effect.sigma = 0; + }); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + +var DashBlur = class DashBlur { + constructor(connections, prefs) { + this.dashes = []; + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.sigma = prefs.SIGMA.get(); + this.brightness = prefs.BRIGHTNESS.get(); + } + + enable() { + this.connections.connect(Main.uiGroup, 'actor-added', (_, actor) => { + if ((actor.get_name() == "dashtodockContainer") && (actor.constructor.name == 'DashToDock')) + this.try_blur(actor); + }); + + this.blur_existing_dashes(); + } + + // Finds all existing dashes on every monitor, and call `try_blur` on them + // We cannot only blur `Main.overview.dash`, as there could be multiple screens + blur_existing_dashes() { + this._log("searching for dash"); + // blur every dash found + Main.uiGroup.get_children().filter((child) => { + // filter by name + return (child.get_name() == "dashtodockContainer") && (child.constructor.name == 'DashToDock') + }).forEach(this.try_blur.bind(this)); + } + + // Tries to blur the dash contained in the given actor + try_blur(dash_container) { + let dash_box = dash_container._slider.get_child(); + // verify that we did not already blur that dash + if (!dash_box.get_children().some((c) => { + return c.get_name() == "dash-blurred-background-parent" + })) { + // finally blur the dash + this._log("dash to dock found, blurring it"); + let dash = dash_box.get_children().find(c => { return c.get_name() == 'dash' }) + this.dashes.push(this.blur_dash_from(dash, dash_container)); + } + } + + // Blurs the dash and returns a `DashInfos` containing its informations + blur_dash_from(dash, dash_container) { + // the effect to be applied + let effect = new Shell.BlurEffect({ + brightness: this.brightness, + sigma: this.sigma, + mode: 1 + }); + + // dash background parent, not visible + let background_parent = new St.Widget({ + name: 'dash-blurred-background-parent', + style_class: 'dash-blurred-background-parent', + width: 0, + height: 0 + }); + + // dash background widget + let background = new St.Widget({ + name: 'dash-blurred-background', + style_class: 'dash-blurred-background', + x: 0, + y: dash_container._slider.y, + width: dash.width, + height: dash.height, + }); + + // updates size and position on change + this.connections.connect(dash_container._slider, 'notify::y', _ => { + background.y = dash_container._slider.y; + }); + this.connections.connect(dash, 'notify::width', _ => { + background.width = dash.width; + }); + this.connections.connect(dash, 'notify::height', _ => { + background.height = dash.height; + }); + + + // HACK + { + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the dash buttons to cause artefacts on the dash itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("dash hack level 1"); + this.paint_signals.disconnect_all(); + + let rp = () => { + effect.queue_repaint() + }; + + dash._box.get_children().forEach((icon) => { + try { + let zone = icon.get_child_at_index(0); + this.connections.connect(zone, 'enter-event', rp); + this.connections.connect(zone, 'leave-event', rp); + this.connections.connect(zone, 'button-press-event', rp); + } catch (e) { + this._log(`${e}, continuing`); + } + }) + + this.connections.connect(dash._box, 'actor-added', (_, actor) => { + try { + let zone = actor.get_child_at_index(0); + this.connections.connect(zone, 'enter-event', rp); + this.connections.connect(zone, 'leave-event', rp); + this.connections.connect(zone, 'button-press-event', rp); + } catch (e) { + this._log(`${e}, continuing`); + } + }) + + this.connections.connect(dash._showAppsIcon, 'enter-event', rp); + this.connections.connect(dash._showAppsIcon, 'leave-event', rp); + this.connections.connect(dash._showAppsIcon, 'button-press-event', rp); + + this.connections.connect(dash, 'leave-event', rp); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("dash hack level 2"); + + this.paint_signals.connect(background, effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + } + + // add the widget to the dash + background.add_effect(effect); + background_parent.add_child(background); + dash.get_parent().insert_child_at_index(background_parent, 0); + + // remove background color + dash.set_style_class_name('blurred-dash'); + + // returns infos + return new DashInfos(this, dash, dash._background, background_parent, effect, this.prefs); + } + + set_sigma(sigma) { + this.sigma = sigma; + this.emit('update-sigma', true); + } + + set_brightness(brightness) { + this.brightness = brightness; + this.emit('update-brightness', true); + } + + disable() { + this._log("removing blur from dashes"); + + this.emit('remove-dashes', true); + + this.dashes = []; + this.connections.disconnect_all(); + } + + show() { + this.emit('show', true); + } + hide() { + this.emit('hide', true); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + +Signals.addSignalMethods(DashBlur.prototype); \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/extension.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/extension.js new file mode 100644 index 0000000..4d5c4c9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/extension.js @@ -0,0 +1,224 @@ +'use strict'; + +const { St, Shell } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const Settings = Me.imports.settings; +const Connections = Me.imports.connections; + +const Panel = Me.imports.panel; +const Dash = Me.imports.dash; +const Overview = Me.imports.overview; +const DashToDock = Me.imports.dash_to_dock; +const Lockscreen = Me.imports.lockscreen; +const AppFolders = Me.imports.appfolders; +const WindowList = Me.imports.window_list; +const Applications = Me.imports.applications; + + +class Extension { + constructor() { } + + enable() { + this._prefs = new Settings.Prefs; + + this._log("enabling extension..."); + this._connections = []; + + this._panel_blur = new Panel.PanelBlur(new Connections.Connections, this._prefs); + this._dash_blur = new Dash.DashBlur(new Connections.Connections, this._prefs); + this._dash_to_dock_blur = new DashToDock.DashBlur(new Connections.Connections, this._prefs); + this._overview_blur = new Overview.OverviewBlur(new Connections.Connections, this._prefs); + this._lockscreen_blur = new Lockscreen.LockscreenBlur(new Connections.Connections, this._prefs); + this._appfolders_blur = new AppFolders.AppFoldersBlur(new Connections.Connections, this._prefs); + this._window_list_blur = new WindowList.WindowListBlur(new Connections.Connections, this._prefs); + this._applications_blur = new Applications.ApplicationsBlur(new Connections.Connections, this._prefs); + + + this._connections.push(this._panel_blur.connections, this._dash_blur.connections, + this._dash_to_dock_blur.connections, this._overview_blur.connections, + this._lockscreen_blur.connections, this._appfolders_blur.connections, + this._window_list_blur.connections, this._applications_blur.connections); + + this._connect_to_settings(); + + if (this._prefs.BLUR_PANEL.get()) { + this._panel_blur.enable(); + } + if (this._prefs.BLUR_DASH.get()) { + this._dash_blur.enable(); + this._dash_to_dock_blur.enable(); + } + if (this._prefs.BLUR_OVERVIEW.get()) { + this._overview_blur.enable(); + } + if (this._prefs.BLUR_LOCKSCREEN.get()) { + this._lockscreen_blur.enable(); + } + if (this._prefs.BLUR_APPFOLDERS.get()) { + this._appfolders_blur.enable(); + } + if (this._prefs.BLUR_WINDOW_LIST.get()) { + this._window_list_blur.enable(); + } + if (this._prefs.BLUR_APPLICATIONS.get()) { + this._applications_blur.enable(); + } + + this._update_sigma(); + this._update_brightness(); + + this._log("extension enabled."); + } + + disable() { + this._log("disabling extension..."); + + this._panel_blur.disable(); + this._dash_blur.disable(); + this._dash_to_dock_blur.disable(); + this._overview_blur.disable(); + this._lockscreen_blur.disable(); + this._appfolders_blur.disable(); + this._window_list_blur.disable(); + this._applications_blur.disable(); + + this._panel_blur = null; + this._dash_blur = null; + this._dash_to_dock_blur = null; + this._overview_blur = null; + this._lockscreen_blur = null; + this._appfolders_blur = null; + this._window_list_blur = null; + this._applications_blur = null; + + this._disconnect_settings(); + + // in theory, this shouldn't be needed if we switch to making modules responsible for disconnecting their own + // signals. For now, I will leave this small bit of code in. Calling disable on all modules has already + // done the same thing + this._connections.forEach((connections) => { + connections.disconnect_all(); + }) + this._connections = []; + + this._log("extension disabled."); + + this._prefs = null; + } + + _connect_to_settings() { + this._prefs.SIGMA.changed(() => { + this._update_sigma(); + }); + this._prefs.BRIGHTNESS.changed(() => { + this._update_brightness(); + }); + + this._prefs.BLUR_DASH.changed(() => { + if (this._prefs.BLUR_DASH.get()) { + this._dash_blur.enable(); + this._dash_to_dock_blur.enable(); + } else { + this._dash_blur.disable(); + this._dash_to_dock_blur.disable(); + } + }); + this._prefs.BLUR_PANEL.changed(() => { + if (this._prefs.BLUR_PANEL.get()) { + this._panel_blur.enable(); + } else { + this._panel_blur.disable(); + } + }); + this._prefs.BLUR_OVERVIEW.changed(() => { + if (this._prefs.BLUR_OVERVIEW.get()) { + this._overview_blur.enable(); + } else { + this._overview_blur.disable(); + } + }); + this._prefs.BLUR_LOCKSCREEN.changed(() => { + if (this._prefs.BLUR_LOCKSCREEN.get()) { + this._lockscreen_blur.enable(); + } else { + this._lockscreen_blur.disable(); + } + }); + this._prefs.BLUR_APPFOLDERS.changed(() => { + if (this._prefs.BLUR_APPFOLDERS.get()) { + this._appfolders_blur.enable(); + } else { + this._appfolders_blur.disable(); + } + }); + this._prefs.BLUR_WINDOW_LIST.changed(() => { + if (this._prefs.BLUR_WINDOW_LIST.get()) { + this._window_list_blur.enable(); + } else { + this._window_list_blur.disable(); + } + }); + this._prefs.BLUR_APPLICATIONS.changed(() => { + if (this._prefs.BLUR_APPLICATIONS.get()) { + this._applications_blur.enable(); + } else { + this._applications_blur.disable(); + } + }) + this._prefs.DASH_OPACITY.changed(() => { + this._dash_blur.update(); + }); + this._prefs.APPFOLDER_DIALOG_OPACITY.changed(() => { + this._appfolders_blur.blur_appfolders(); + }); + this._prefs.STATIC_BLUR.changed(() => { + this._panel_blur.change_blur_type(); + }); + this._prefs.HIDETOPBAR.changed(() => { + this._panel_blur.connect_to_overview(); + }); + } + + _disconnect_settings() { + this._prefs.SIGMA.disconnect(); + this._prefs.BRIGHTNESS.disconnect(); + } + + _update_sigma() { + let sigma = this._prefs.SIGMA.get(); + + this._panel_blur.set_sigma(sigma); + this._dash_to_dock_blur.set_sigma(sigma); + this._overview_blur.set_sigma(sigma); + this._lockscreen_blur.set_sigma(sigma); + this._appfolders_blur.set_sigma(sigma); + this._window_list_blur.set_sigma(sigma); + this._applications_blur.set_sigma(sigma); + } + + _update_brightness() { + let brightness = this._prefs.BRIGHTNESS.get(); + + this._panel_blur.set_brightness(brightness); + this._dash_to_dock_blur.set_brightness(brightness); + this._overview_blur.set_brightness(brightness); + this._lockscreen_blur.set_brightness(brightness); + this._appfolders_blur.set_brightness(brightness); + this._window_list_blur.set_brightness(brightness); + this._applications_blur.set_brightness(brightness); + } + + _log(str) { + if (this._prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + + +// Called on gnome-shell loading, even if extension is deactivated +function init() { + return new Extension(); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/lockscreen.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/lockscreen.js new file mode 100644 index 0000000..e6d39b5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/lockscreen.js @@ -0,0 +1,64 @@ +'use strict'; + +const { St, Shell } = imports.gi; +const Main = imports.ui.main; +const Background = imports.ui.background; + +let sigma = 30; +let brightness = 0.6; + +const original_createBackground = imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects; + + +var LockscreenBlur = class LockscreenBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + } + + enable() { + this._log("blurring lockscreen"); + + this.update_lockscreen(); + } + + update_lockscreen() { + imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects = this._createBackground; + } + + _createBackground() { + for (const widget of this._backgroundGroup) { + const effect = widget.get_effect('blur'); + + if (effect) { + effect.set({ + brightness: brightness, + sigma: sigma, + }); + } + } + } + + set_sigma(s) { + sigma = s; + this.update_lockscreen(); + } + + set_brightness(b) { + brightness = b; + this.update_lockscreen(); + } + + disable() { + this._log("removing blur from lockscreen"); + + imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects = original_createBackground; + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/metadata.json b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/metadata.json new file mode 100644 index 0000000..820fa02 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/metadata.json @@ -0,0 +1,12 @@ +{ + "_generated": "Generated by SweetTooth, do not edit", + "description": "Adds a blur look to different parts of the GNOME Shell, including the top panel, dash and overview.\n\nYou can support my work by sponsoring me on:\n- github: https://github.com/sponsors/aunetx\n- ko-fi: https://ko-fi.com/aunetx\n\nNote: if the extension shows an error after updating, please make sure to restart your session to see if it persists. This is due to a bug in gnome shell, which I can't fix by myself.", + "name": "Blur my Shell", + "shell-version": [ + "40", + "41" + ], + "url": "https://github.com/aunetx/gnome-shell-extension-blur-my-shell", + "uuid": "blur-my-shell@aunetx", + "version": 29 +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/overview.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/overview.js new file mode 100644 index 0000000..ffd86f9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/overview.js @@ -0,0 +1,161 @@ +'use strict'; + +const { Shell, Gio, Meta } = imports.gi; +const Main = imports.ui.main; +const WorkspaceAnimationController = imports.ui.workspaceAnimation.WorkspaceAnimationController; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; + + +var OverviewBlur = class OverviewBlur { + constructor(connections, prefs) { + this.connections = connections; + this.effects = []; + this.prefs = prefs; + this._workspace_switch_bg_actors = []; + } + + enable() { + this._log("blurring overview"); + + // connect to every background change (even without changing image) + this.connections.connect(Main.layoutManager._backgroundGroup, 'notify', () => { + this._log("updated background"); + this.update_backgrounds(); + }); + + // connect to monitors change + this.connections.connect(Main.layoutManager, 'monitors-changed', () => { + if (Main.screenShield && !Main.screenShield.locked) { + this._log("changed monitors"); + this.update_backgrounds(); + } + }); + + // add css class names, to change folders and workspace-switch background + Main.uiGroup.add_style_class_name("blurred-overview"); + + // update background on extension activation + // the try/catch behaviour is used to prevent bugs like #136 and #137 + try { + this.update_backgrounds(); + } catch (error) { this._log(`could not blur overview: ${error}`); } + + // store original methods for restoring them on disable() + this._origPrepareSwitch = WorkspaceAnimationController.prototype._prepareWorkspaceSwitch; + this._origFinishSwitch = WorkspaceAnimationController.prototype._finishWorkspaceSwitch; + + const outerThis = this; + + // create blurred background actors for each monitor during a workspace switch + WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = function (...params) { + outerThis._log("prepare workspace switch"); + outerThis._origPrepareSwitch.apply(this, params); + + Main.layoutManager.monitors.forEach(monitor => { + if (!(Meta.prefs_get_workspaces_only_on_primary() && (monitor != Main.layoutManager.primaryMonitor))) { + const bg_actor = outerThis.create_background_actor(monitor); + Main.uiGroup.insert_child_above(bg_actor, global.window_group); + + // store the actors so that we can delete them later + outerThis._workspace_switch_bg_actors.push(bg_actor); + } + }); + }; + + // remove the workspace-switch actors when the switch is done + WorkspaceAnimationController.prototype._finishWorkspaceSwitch = function (...params) { + outerThis._log("finish workspace switch"); + outerThis._origFinishSwitch.apply(this, params); + + outerThis._workspace_switch_bg_actors.forEach(actor => { + actor.destroy(); + }); + outerThis._workspace_switch_bg_actors = []; + }; + } + + update_backgrounds() { + // remove every old background + Main.layoutManager.overviewGroup.get_children().forEach(actor => { + if (actor.constructor.name == 'Meta_BackgroundActor') { + Main.layoutManager.overviewGroup.remove_child(actor); + actor.destroy(); + } + }); + this.effects = []; + + // add new backgrounds + Main.layoutManager.monitors.forEach(monitor => { + const bg_actor = this.create_background_actor(monitor); + Main.layoutManager.overviewGroup.insert_child_at_index(bg_actor, monitor.index); + }); + } + + create_background_actor(monitor) { + let bg_actor = new Meta.BackgroundActor; + + let background = Main.layoutManager._backgroundGroup.get_child_at_index(Main.layoutManager.monitors.length - monitor.index - 1); + + if (!background) { + this._log("could not get background for overview"); + return bg_actor; + } + + bg_actor.set_content(background.get_content()); + + let effect = new Shell.BlurEffect({ + brightness: this.prefs.BRIGHTNESS.get(), + sigma: this.prefs.SIGMA.get(), + mode: 0 + }); + bg_actor.add_effect(effect); + this.effects.push(effect); + + bg_actor.set_x(monitor.x); + bg_actor.set_y(monitor.y); + + return bg_actor; + } + + set_sigma(s) { + this.effects.forEach(effect => { + effect.sigma = s; + }); + } + + set_brightness(b) { + this.effects.forEach(effect => { + effect.brightness = b; + }); + } + + disable() { + this._log("removing blur from overview"); + Main.layoutManager.overviewGroup.get_children().forEach(actor => { + if (actor.constructor.name == 'Meta_BackgroundActor') { + Main.layoutManager.overviewGroup.remove_child(actor); + } + }); + Main.uiGroup.remove_style_class_name("blurred-overview"); + + this.effects = []; + this.connections.disconnect_all(); + + // restore original behavior + if (this._origPrepareSwitch) { + WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = this._origPrepareSwitch; + } + + if (this._origFinishSwitch) { + WorkspaceAnimationController.prototype._finishWorkspaceSwitch = this._origFinishSwitch; + } + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`); + } +}; diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/paint_signals.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/paint_signals.js new file mode 100644 index 0000000..0c3dc4f --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/paint_signals.js @@ -0,0 +1,59 @@ +'use strict' + +const { GObject, Clutter } = imports.gi; + + +var PaintSignals = class PaintSignals { + constructor(connections) { + this.buffer = []; + this.connections = connections + } + + connect(actor, blur_effect) { + let paint_effect = new EmitPaintSignal(); + let infos = { + actor: actor, + paint_effect: paint_effect + }; + let counter = 0; + + actor.add_effect(paint_effect); + this.connections.connect(paint_effect, 'update-blur', () => { + try { + // checking if blur_effect.queue_repaint() has been recently called + if (counter === 0) { + counter = 2; + blur_effect.queue_repaint(); + } + else counter--; + } catch (e) { } + }); + + this.buffer.push(infos) + } + + disconnect_all() { + this.buffer.forEach((infos) => { + this.connections.disconnect_all_for(infos.paint_effect); + infos.actor.remove_effect(infos.paint_effect); + }); + + this.buffer = [] + } +} + +var EmitPaintSignal = GObject.registerClass({ + GTypeName: 'EmitPaintSignal', + Signals: { + 'update-blur': { + param_types: [] + }, + } +}, + class EmitPaintSignal extends Clutter.Effect { + vfunc_paint(node, paint_context, paint_flags) { + this.emit("update-blur"); + super.vfunc_paint(node, paint_context, paint_flags); + } + } +); \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/panel.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/panel.js new file mode 100644 index 0000000..930ca4d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/panel.js @@ -0,0 +1,245 @@ +'use strict'; + +const { St, Shell, Meta, Gio, GLib } = imports.gi; +const Main = imports.ui.main; +const Config = imports.misc.config; +const backgroundSettings = new Gio.Settings({ schema: 'org.gnome.desktop.background' }) + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +const [GS_MAJOR, GS_MINOR] = Config.PACKAGE_VERSION.split('.'); + + +var PanelBlur = class PanelBlur { + constructor(connections, prefs) { + this.connections = connections; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.prefs = prefs; + this.effect = new Shell.BlurEffect({ + brightness: prefs.BRIGHTNESS.get(), + sigma: prefs.SIGMA.get(), + mode: prefs.STATIC_BLUR.get() ? 0 : 1 + }); + this.background_parent = new St.Widget({ + name: 'topbar-blurred-background-parent', + style_class: 'topbar-blurred-background-parent', + x: this.monitor.x, + y: this.monitor.y, + width: this.monitor.width, + height: 0, + }); + this.background = prefs.STATIC_BLUR.get() ? new Meta.BackgroundActor : new St.Widget({ + style_class: 'topbar-blurred-background', + x: 0, + y: 0, + width: this.monitor.width, + height: Main.panel.height, + }); + this.background_parent.add_child(this.background); + } + + enable() { + this._log("blurring top panel"); + + if (GS_MAJOR < 42) { + // hide corners, can't style them + Main.panel._leftCorner.hide(); + Main.panel._rightCorner.hide(); + this.connections.connect(Main.panel._leftCorner, 'show', () => { Main.panel._leftCorner.hide(); }); + this.connections.connect(Main.panel._rightCorner, 'show', () => { Main.panel._rightCorner.hide(); }); + } + + // insert background parent + let children = Main.layoutManager.panelBox.get_children(); + for (let i = 0; i < children.length; ++i) + if (children[i].name == 'topbar-blurred-background-parent') + Main.layoutManager.panelBox.remove_child(children[i]); + Main.layoutManager.panelBox.insert_child_at_index(this.background_parent, 0); + + // remove background + Main.panel.add_style_class_name('transparent-panel'); + + // perform updates + this.change_blur_type(); + Utils.setTimeout(() => { this.change_blur_type() }, 500); + + // connect to panel size change + this.connections.connect(Main.panel, 'notify::height', () => { + this.update_size(this.prefs.STATIC_BLUR.get()); + }); + + // connect to every background change (even without changing image) + this.connections.connect(Main.layoutManager._backgroundGroup, 'notify', () => { + this.update_wallpaper(this.prefs.STATIC_BLUR.get()); + }) + + // connect to monitors change + this.connections.connect(Main.layoutManager, 'monitors-changed', () => { + if (Main.screenShield && !Main.screenShield.locked) { + this.update_wallpaper(this.prefs.STATIC_BLUR.get()); + this.update_size(this.prefs.STATIC_BLUR.get()); + } + }); + + this.connect_to_overview(); + } + + change_blur_type() { + let is_static = this.prefs.STATIC_BLUR.get(); + + // reset widgets to right state + this.background_parent.remove_child(this.background); + this.background.remove_effect(this.effect); + this.background = is_static ? new Meta.BackgroundActor : new St.Widget({ + style_class: 'topbar-blurred-background', + x: 0, + y: 0, + width: this.monitor.width, + height: Main.panel.height, + }); + this.effect.set_mode(is_static ? 0 : 1); + this.background.add_effect(this.effect); + this.background_parent.add_child(this.background); + + // perform updates + this.update_wallpaper(is_static); + this.update_size(is_static); + + // HACK + if (!is_static) { + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("panel hack level 1"); + this.paint_signals.disconnect_all(); + + let rp = () => { this.effect.queue_repaint() }; + + this.connections.connect(Main.panel, 'enter-event', rp); + this.connections.connect(Main.panel, 'leave-event', rp); + this.connections.connect(Main.panel, 'button-press-event', rp); + + Main.panel.get_children().forEach(child => { + this.connections.connect(child, 'enter-event', rp); + this.connections.connect(child, 'leave-event', rp); + this.connections.connect(child, 'button-press-event', rp); + }); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("panel hack level 2"); + this.paint_signals.disconnect_all(); + + this.paint_signals.connect(this.background, this.effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + } + } + + update_wallpaper(is_static) { + // if static blur, get right wallpaper and update blur with it + if (is_static) { + // the try/catch behaviour is used to prevent bugs like #136 and #137 + try { + let bg = Main.layoutManager._backgroundGroup.get_child_at_index(Main.layoutManager.monitors.length - this.monitor.index - 1); + this.background.set_content(bg.get_content()); + } catch (error) { this._log(`could not blur panel: ${error}`) } + } + } + + update_size(is_static) { + this.background_parent.width = Main.panel.width; + this.background.width = Main.panel.width; + let panel_box = Main.layoutManager.panelBox; + this.background.height = panel_box.height; + let clip_box = panel_box.get_parent(); + if (is_static) { + this.background.set_clip( + clip_box.x, + clip_box.y, + panel_box.width, + panel_box.height + ); + this.background.x = -clip_box.x; + this.background.y = -clip_box.y; + } + } + + // returns either the primary monitor, or a dummy one if none is connected + get monitor() { + if (Main.layoutManager.primaryMonitor != null) { + return Main.layoutManager.primaryMonitor + } else { + return { x: 0, y: 0, width: 0, index: 0 } + } + } + + // connect when overview if opened/closed to hide/show the blur in consequence + // if HIDETOPBAR set, we need just to hide the blur when showing appgrid (so no shadow is cropped) + connect_to_overview() { + this.connections.disconnect_all_for(Main.overview._overview._controls._appDisplay); + this.connections.disconnect_all_for(Main.overview); + + if (!this.prefs.HIDETOPBAR.get()) { + this.connections.connect(Main.overview, 'showing', () => { + this.hide(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } else { + this.connections.connect(Main.overview._overview._controls._appDisplay, 'show', () => { + this.hide(); + }); + this.connections.connect(Main.overview._overview._controls._appDisplay, 'hide', () => { + this.show(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } + } + + set_sigma(s) { + this.effect.sigma = s; + } + + set_brightness(b) { + this.effect.brightness = b; + } + + disable() { + this._log("removing blur from top panel"); + Main.panel.remove_style_class_name('transparent-panel'); + + if (GS_MAJOR < 42) { + Main.panel._leftCorner.show(); + Main.panel._rightCorner.show(); + } + + try { + Main.layoutManager.panelBox.remove_child(this.background_parent); + } catch (e) { } + + this.connections.disconnect_all(); + } + + show() { + this.background_parent.show(); + } + hide() { + this.background_parent.hide(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.js new file mode 100644 index 0000000..b8c1c41 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.js @@ -0,0 +1,187 @@ +'use strict'; + +const { GObject, Gtk } = imports.gi; + +const ExtensionUtils = imports.misc.extensionUtils; +const Extension = ExtensionUtils.getCurrentExtension(); +let Settings = Extension.imports.settings; +let config = new Settings.Prefs(); + + +const BlurMyShellPrefsWidget = GObject.registerClass({ + GTypeName: 'BlurMyShellPrefsWidget', + Template: Extension.dir.get_child('prefs.ui').get_uri(), + InternalChildren: [ + 'sigma_scale', + 'brightness_scale', + 'blur_dash', + 'blur_panel', + 'blur_overview', + 'blur_applications', + 'blur_lockscreen', + 'blur_appfolders', + 'blur_window_list', + 'hacks_level0', + 'hacks_level1', + 'hacks_level2', + 'dash_opacity_scale', + 'appfolder_dialog_opacity_scale', + 'static_blur', + 'hidetopbar', + 'debug_mode' + ], +}, class BlurMyShellPrefsWidget extends Gtk.Box { + _init(params = {}) { + super._init(params); + + // ! sigma + this._sigma_scale.set_value(config.SIGMA.get()); + + // ! brightness + this._brightness_scale.set_value(config.BRIGHTNESS.get()); + + // ! blur dash + this._blur_dash.set_active(config.BLUR_DASH.get()); + + // ! blur panel + this._blur_panel.set_active(config.BLUR_PANEL.get()); + + // ! blur overview + this._blur_overview.set_active(config.BLUR_OVERVIEW.get()); + + // ! blur applications + this._blur_applications.set_active(config.BLUR_APPLICATIONS.get()); + + // ! blur lockscreen + this._blur_lockscreen.set_active(config.BLUR_LOCKSCREEN.get()); + + // ! blur appfolders + this._blur_appfolders.set_active(config.BLUR_APPFOLDERS.get()); + + // ! blur window list + this._blur_window_list.set_active(config.BLUR_WINDOW_LIST.get()); + + // ! dash hacks + if (config.HACKS_LEVEL.get() == 0) { + this._hacks_level0.set_active(true); + } else if (config.HACKS_LEVEL.get() == 1) { + this._hacks_level1.set_active(true); + } else if (config.HACKS_LEVEL.get() == 2) { + this._hacks_level2.set_active(true); + } else { + this._log(`hack level out-of-bound: ${hack_level}, defaulting to 1.`); + this._hacks_level0.set_active(true); + } + + // ! dash opacity + this._dash_opacity_scale.set_value(config.DASH_OPACITY.get()); + + // ! appfolder dialog opacity + this._appfolder_dialog_opacity_scale.set_value(config.APPFOLDER_DIALOG_OPACITY.get()); + + // ! static panel blur + this._static_blur.set_active(config.STATIC_BLUR.get()); + + // ! hidetopbar compatibility + this._hidetopbar.set_active(config.HIDETOPBAR.get()); + + // ! debug mode + this._debug_mode.set_active(config.DEBUG.get()); + } + + sigma_changed(w) { + let value = w.get_value(); + config.SIGMA.set(value); + } + + brightness_changed(w) { + let value = w.get_value(); + config.BRIGHTNESS.set(value); + } + + blur_dash_toggled(w) { + let value = w.get_active(); + config.BLUR_DASH.set(value); + } + + blur_panel_toggled(w) { + let value = w.get_active(); + config.BLUR_PANEL.set(value); + } + + blur_overview_toggled(w) { + let value = w.get_active(); + config.BLUR_OVERVIEW.set(value); + } + + blur_applications_toggled(w) { + let value = w.get_active(); + config.BLUR_APPLICATIONS.set(value); + } + + blur_lockscreen_toggled(w) { + let value = w.get_active(); + config.BLUR_LOCKSCREEN.set(value); + } + + blur_appfolders_toggled(w) { + let value = w.get_active(); + config.BLUR_APPFOLDERS.set(value); + } + + blur_window_list_toggled(w) { + let value = w.get_active(); + config.BLUR_WINDOW_LIST.set(value); + } + + hacks_level0_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(0) } + } + + hacks_level1_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(1) } + } + + hacks_level2_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(2) } + } + + dash_opacity_changed(w) { + let value = w.get_value(); + config.DASH_OPACITY.set(value); + } + + appfolder_dialog_opacity_changed(w) { + let value = w.get_value(); + config.APPFOLDER_DIALOG_OPACITY.set(value); + } + + static_blur_toggled(w) { + let value = w.get_active(); + config.STATIC_BLUR.set(value); + } + + hidetopbar_toggled(w) { + let value = w.get_active(); + config.HIDETOPBAR.set(value); + } + + debug_mode_toggled(w) { + let value = w.get_active(); + config.DEBUG.set(value); + } + + _log(str) { + if (config.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +}); + +function init() { } + +function buildPrefsWidget() { + return new BlurMyShellPrefsWidget(); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.ui b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.ui new file mode 100644 index 0000000..a5d30c7 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/prefs.ui @@ -0,0 +1,410 @@ + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..ca00e0c1e8f8d52f8e95fc81aade8ebd4d10af00 GIT binary patch literal 1064 zcmY*YJ!lj`7#)93P44uPLOd)|gcKXd-WGyrA=*ezuuzag6eM%EjrO&U!Z-<#WbX5jJOzMc7I_M5l!bs1|Jq#_>` z@XevN4(8qg@b=c9S7g4kL`^J#T}&vP6k-=+<}eI#Rgf(pjJ>KCgdJ5)TFUpU>VB$% zM2A6AZTQ{T?kw8o1r}M8T$&H=u?Ox?9LjM7d<+=NQ3RjJQ3kKR`&d5;=DCU@6A`!z z%-7D|qfb2se+j%yKb&5mPdyI*Dfk&M*S}JxPhEh&2JQnJ^=}{OQ%}GjfZqUj;`gic zsgJ||1pWeKw{B0+r)Hf^@D_F6GivsXJcEzCcK)R~Cv_R~&w(!hZy!D?vd7e{Qv-K_ zofmC~^{F|31^gIzvb$h>>Ph%(;68BU(r;6rn*DhV9sup_l~b%kU4p*>{tWEMug~dI zvp<{QpTOm5>ok4p3Veb4E&=Ov-yhJY=KKnnc}P;3>ZZ+m$K6_uS(5-)CN17Io?F^g zX&5zRjMaE{Rio=cnz1*(rvo?a*}hH~)=`}>Q*owMZ#didiS{~j_&i0j^epo+4lpy! z7jskqm>(Pw_sP2(W~~I~)i7@y=D2>?Y$wfFsla$)w%3cRx~ z@DBQ63>igtL*G?#!u6x?f$!@kI);CRZ`dD+y=`A*%IDenJ?x$xMzX2XMOuTYlcOP4%-{aK>2yye_PqEmVW5{w{YLOSbMEBPzm-uW5y3tkM;ioejD3L literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml new file mode 100644 index 0000000..4417dce --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml @@ -0,0 +1,95 @@ + + + + + + 30 + Global sigma (gaussian blur radius) to use + + + + + 0.6 + Global brightness to use + + + + + true + Boolean, whether to blur the dash or not + + + + + true + Boolean, whether to blur the panel or not + + + + + true + Boolean, whether to blur the overview or not + + + + + true + Boolean, whether to blur lockscreen or not + + + + + true + Boolean, whether to blur appfolders or not + + + + + true + Boolean, whether to blur window list extension or not + + + + + false + Boolean, whether to blur applications that request it or not + + + + + 1 + Level of hacks to use (from 0 to 2) + + + + + 0.12 + Opacity of dash to use + + + + + 0.12 + Opacity of appfolder dialog to use + + + + + true + Boolean, whether to have a static blur on panel or a dynamic one + + + + + false + Boolean, whether to try compatibility with hidetopbar@mathieu.bidon.ca or not + + + + + false + Boolean, set to true to activate debug mode (more verbose journalctl logs) + + + + \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/settings.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/settings.js new file mode 100644 index 0000000..69a0093 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/settings.js @@ -0,0 +1,274 @@ +'use strict'; + +const Gio = imports.gi.Gio; +const Extension = imports.misc.extensionUtils.getCurrentExtension(); + +const SCHEMA_PATH = 'org.gnome.shell.extensions.blur-my-shell'; + +function get_local_gsettings(schema_path) { + const GioSSS = Gio.SettingsSchemaSource; + let schemaDir = Extension.dir.get_child('schemas'); + let schemaSource = GioSSS.get_default(); + + if (schemaDir.query_exists(null)) { + schemaSource = GioSSS.new_from_directory( + schemaDir.get_path(), + schemaSource, + false); + } + + let schemaObj = schemaSource.lookup(schema_path, true); + if (!schemaObj) { + throw new Error( + `Schema ${schema_path} could not be found for extension ${Extension.metadata.uuid}` + ); + } + return new Gio.Settings({ + settings_schema: schemaObj + }); +}; + +var Prefs = class Prefs { + constructor() { + var settings = this.settings = get_local_gsettings(SCHEMA_PATH); + this.SIGMA = { + key: 'sigma', + get: function () { + return settings.get_int(this.key); + }, + set: function (v) { + settings.set_int(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.BRIGHTNESS = { + key: 'brightness', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.BLUR_DASH = { + key: 'blur-dash', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_PANEL = { + key: 'blur-panel', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_OVERVIEW = { + key: 'blur-overview', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_LOCKSCREEN = { + key: 'blur-lockscreen', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_APPLICATIONS = { + key: 'blur-applications', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_APPFOLDERS = { + key: 'blur-appfolders', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_WINDOW_LIST = { + key: 'blur-window-list', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.HACKS_LEVEL = { + key: 'hacks-level', + get: function () { + return settings.get_int(this.key); + }, + set: function (v) { + settings.set_int(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.DASH_OPACITY = { + key: 'dash-opacity', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.APPFOLDER_DIALOG_OPACITY = { + key: 'appfolder-dialog-opacity', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.STATIC_BLUR = { + key: 'static-blur', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.HIDETOPBAR = { + key: 'hidetopbar', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.DEBUG = { + key: 'debug', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + } +}; \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/stylesheet.css b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/stylesheet.css new file mode 100644 index 0000000..a094537 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/stylesheet.css @@ -0,0 +1,436 @@ +#panel.transparent-panel { + background: transparent; + transition-duration: 500ms; +} + +.blurred-overview .app-folder { + background-color: rgba(0, 0, 0, 0.12); +} + + +.blurred-overview .workspace-animation { + background-color: transparent !important; +} + +.transparent-app-folder-dialogs .edit-folder-button { + background: transparent; + border-radius: 19px; +} + +.blurred-dash .dash-background { + background: transparent; +} + +/* +! TRANSPARENT APPFOLDER DIALOGS + +python generator: + +```py +for e in range(0,101):print(".transparent-app-folder-dialogs-"+str(e)+"\n{background-color: rgba(0, 0, 0, "+str(round(e/100,2))+");}") +``` +*/ + +.transparent-app-folder-dialogs-0 { + background-color: rgba(0, 0, 0, 0.0); +} + +.transparent-app-folder-dialogs-1 { + background-color: rgba(0, 0, 0, 0.01); +} + +.transparent-app-folder-dialogs-2 { + background-color: rgba(0, 0, 0, 0.02); +} + +.transparent-app-folder-dialogs-3 { + background-color: rgba(0, 0, 0, 0.03); +} + +.transparent-app-folder-dialogs-4 { + background-color: rgba(0, 0, 0, 0.04); +} + +.transparent-app-folder-dialogs-5 { + background-color: rgba(0, 0, 0, 0.05); +} + +.transparent-app-folder-dialogs-6 { + background-color: rgba(0, 0, 0, 0.06); +} + +.transparent-app-folder-dialogs-7 { + background-color: rgba(0, 0, 0, 0.07); +} + +.transparent-app-folder-dialogs-8 { + background-color: rgba(0, 0, 0, 0.08); +} + +.transparent-app-folder-dialogs-9 { + background-color: rgba(0, 0, 0, 0.09); +} + +.transparent-app-folder-dialogs-10 { + background-color: rgba(0, 0, 0, 0.1); +} + +.transparent-app-folder-dialogs-11 { + background-color: rgba(0, 0, 0, 0.11); +} + +.transparent-app-folder-dialogs-12 { + background-color: rgba(0, 0, 0, 0.12); +} + +.transparent-app-folder-dialogs-13 { + background-color: rgba(0, 0, 0, 0.13); +} + +.transparent-app-folder-dialogs-14 { + background-color: rgba(0, 0, 0, 0.14); +} + +.transparent-app-folder-dialogs-15 { + background-color: rgba(0, 0, 0, 0.15); +} + +.transparent-app-folder-dialogs-16 { + background-color: rgba(0, 0, 0, 0.16); +} + +.transparent-app-folder-dialogs-17 { + background-color: rgba(0, 0, 0, 0.17); +} + +.transparent-app-folder-dialogs-18 { + background-color: rgba(0, 0, 0, 0.18); +} + +.transparent-app-folder-dialogs-19 { + background-color: rgba(0, 0, 0, 0.19); +} + +.transparent-app-folder-dialogs-20 { + background-color: rgba(0, 0, 0, 0.2); +} + +.transparent-app-folder-dialogs-21 { + background-color: rgba(0, 0, 0, 0.21); +} + +.transparent-app-folder-dialogs-22 { + background-color: rgba(0, 0, 0, 0.22); +} + +.transparent-app-folder-dialogs-23 { + background-color: rgba(0, 0, 0, 0.23); +} + +.transparent-app-folder-dialogs-24 { + background-color: rgba(0, 0, 0, 0.24); +} + +.transparent-app-folder-dialogs-25 { + background-color: rgba(0, 0, 0, 0.25); +} + +.transparent-app-folder-dialogs-26 { + background-color: rgba(0, 0, 0, 0.26); +} + +.transparent-app-folder-dialogs-27 { + background-color: rgba(0, 0, 0, 0.27); +} + +.transparent-app-folder-dialogs-28 { + background-color: rgba(0, 0, 0, 0.28); +} + +.transparent-app-folder-dialogs-29 { + background-color: rgba(0, 0, 0, 0.29); +} + +.transparent-app-folder-dialogs-30 { + background-color: rgba(0, 0, 0, 0.3); +} + +.transparent-app-folder-dialogs-31 { + background-color: rgba(0, 0, 0, 0.31); +} + +.transparent-app-folder-dialogs-32 { + background-color: rgba(0, 0, 0, 0.32); +} + +.transparent-app-folder-dialogs-33 { + background-color: rgba(0, 0, 0, 0.33); +} + +.transparent-app-folder-dialogs-34 { + background-color: rgba(0, 0, 0, 0.34); +} + +.transparent-app-folder-dialogs-35 { + background-color: rgba(0, 0, 0, 0.35); +} + +.transparent-app-folder-dialogs-36 { + background-color: rgba(0, 0, 0, 0.36); +} + +.transparent-app-folder-dialogs-37 { + background-color: rgba(0, 0, 0, 0.37); +} + +.transparent-app-folder-dialogs-38 { + background-color: rgba(0, 0, 0, 0.38); +} + +.transparent-app-folder-dialogs-39 { + background-color: rgba(0, 0, 0, 0.39); +} + +.transparent-app-folder-dialogs-40 { + background-color: rgba(0, 0, 0, 0.4); +} + +.transparent-app-folder-dialogs-41 { + background-color: rgba(0, 0, 0, 0.41); +} + +.transparent-app-folder-dialogs-42 { + background-color: rgba(0, 0, 0, 0.42); +} + +.transparent-app-folder-dialogs-43 { + background-color: rgba(0, 0, 0, 0.43); +} + +.transparent-app-folder-dialogs-44 { + background-color: rgba(0, 0, 0, 0.44); +} + +.transparent-app-folder-dialogs-45 { + background-color: rgba(0, 0, 0, 0.45); +} + +.transparent-app-folder-dialogs-46 { + background-color: rgba(0, 0, 0, 0.46); +} + +.transparent-app-folder-dialogs-47 { + background-color: rgba(0, 0, 0, 0.47); +} + +.transparent-app-folder-dialogs-48 { + background-color: rgba(0, 0, 0, 0.48); +} + +.transparent-app-folder-dialogs-49 { + background-color: rgba(0, 0, 0, 0.49); +} + +.transparent-app-folder-dialogs-50 { + background-color: rgba(0, 0, 0, 0.5); +} + +.transparent-app-folder-dialogs-51 { + background-color: rgba(0, 0, 0, 0.51); +} + +.transparent-app-folder-dialogs-52 { + background-color: rgba(0, 0, 0, 0.52); +} + +.transparent-app-folder-dialogs-53 { + background-color: rgba(0, 0, 0, 0.53); +} + +.transparent-app-folder-dialogs-54 { + background-color: rgba(0, 0, 0, 0.54); +} + +.transparent-app-folder-dialogs-55 { + background-color: rgba(0, 0, 0, 0.55); +} + +.transparent-app-folder-dialogs-56 { + background-color: rgba(0, 0, 0, 0.56); +} + +.transparent-app-folder-dialogs-57 { + background-color: rgba(0, 0, 0, 0.57); +} + +.transparent-app-folder-dialogs-58 { + background-color: rgba(0, 0, 0, 0.58); +} + +.transparent-app-folder-dialogs-59 { + background-color: rgba(0, 0, 0, 0.59); +} + +.transparent-app-folder-dialogs-60 { + background-color: rgba(0, 0, 0, 0.6); +} + +.transparent-app-folder-dialogs-61 { + background-color: rgba(0, 0, 0, 0.61); +} + +.transparent-app-folder-dialogs-62 { + background-color: rgba(0, 0, 0, 0.62); +} + +.transparent-app-folder-dialogs-63 { + background-color: rgba(0, 0, 0, 0.63); +} + +.transparent-app-folder-dialogs-64 { + background-color: rgba(0, 0, 0, 0.64); +} + +.transparent-app-folder-dialogs-65 { + background-color: rgba(0, 0, 0, 0.65); +} + +.transparent-app-folder-dialogs-66 { + background-color: rgba(0, 0, 0, 0.66); +} + +.transparent-app-folder-dialogs-67 { + background-color: rgba(0, 0, 0, 0.67); +} + +.transparent-app-folder-dialogs-68 { + background-color: rgba(0, 0, 0, 0.68); +} + +.transparent-app-folder-dialogs-69 { + background-color: rgba(0, 0, 0, 0.69); +} + +.transparent-app-folder-dialogs-70 { + background-color: rgba(0, 0, 0, 0.7); +} + +.transparent-app-folder-dialogs-71 { + background-color: rgba(0, 0, 0, 0.71); +} + +.transparent-app-folder-dialogs-72 { + background-color: rgba(0, 0, 0, 0.72); +} + +.transparent-app-folder-dialogs-73 { + background-color: rgba(0, 0, 0, 0.73); +} + +.transparent-app-folder-dialogs-74 { + background-color: rgba(0, 0, 0, 0.74); +} + +.transparent-app-folder-dialogs-75 { + background-color: rgba(0, 0, 0, 0.75); +} + +.transparent-app-folder-dialogs-76 { + background-color: rgba(0, 0, 0, 0.76); +} + +.transparent-app-folder-dialogs-77 { + background-color: rgba(0, 0, 0, 0.77); +} + +.transparent-app-folder-dialogs-78 { + background-color: rgba(0, 0, 0, 0.78); +} + +.transparent-app-folder-dialogs-79 { + background-color: rgba(0, 0, 0, 0.79); +} + +.transparent-app-folder-dialogs-80 { + background-color: rgba(0, 0, 0, 0.8); +} + +.transparent-app-folder-dialogs-81 { + background-color: rgba(0, 0, 0, 0.81); +} + +.transparent-app-folder-dialogs-82 { + background-color: rgba(0, 0, 0, 0.82); +} + +.transparent-app-folder-dialogs-83 { + background-color: rgba(0, 0, 0, 0.83); +} + +.transparent-app-folder-dialogs-84 { + background-color: rgba(0, 0, 0, 0.84); +} + +.transparent-app-folder-dialogs-85 { + background-color: rgba(0, 0, 0, 0.85); +} + +.transparent-app-folder-dialogs-86 { + background-color: rgba(0, 0, 0, 0.86); +} + +.transparent-app-folder-dialogs-87 { + background-color: rgba(0, 0, 0, 0.87); +} + +.transparent-app-folder-dialogs-88 { + background-color: rgba(0, 0, 0, 0.88); +} + +.transparent-app-folder-dialogs-89 { + background-color: rgba(0, 0, 0, 0.89); +} + +.transparent-app-folder-dialogs-90 { + background-color: rgba(0, 0, 0, 0.9); +} + +.transparent-app-folder-dialogs-91 { + background-color: rgba(0, 0, 0, 0.91); +} + +.transparent-app-folder-dialogs-92 { + background-color: rgba(0, 0, 0, 0.92); +} + +.transparent-app-folder-dialogs-93 { + background-color: rgba(0, 0, 0, 0.93); +} + +.transparent-app-folder-dialogs-94 { + background-color: rgba(0, 0, 0, 0.94); +} + +.transparent-app-folder-dialogs-95 { + background-color: rgba(0, 0, 0, 0.95); +} + +.transparent-app-folder-dialogs-96 { + background-color: rgba(0, 0, 0, 0.96); +} + +.transparent-app-folder-dialogs-97 { + background-color: rgba(0, 0, 0, 0.97); +} + +.transparent-app-folder-dialogs-98 { + background-color: rgba(0, 0, 0, 0.98); +} + +.transparent-app-folder-dialogs-99 { + background-color: rgba(0, 0, 0, 0.99); +} + +.transparent-app-folder-dialogs-100 { + background-color: rgba(0, 0, 0, 1.0); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/utilities.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/utilities.js new file mode 100644 index 0000000..5dbc319 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/utilities.js @@ -0,0 +1,39 @@ +'use strict' + +const GLib = imports.gi.GLib; + +let clearTimeout, clearInterval; +clearInterval = clearTimeout = GLib.Source.remove; + +var setTimeout = function(func, delay, ...args) { + return GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { + func(...args); + return GLib.SOURCE_REMOVE; + }); +}; + +var setInterval = function(func, delay, ...args) { + return GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { + func(...args); + return GLib.SOURCE_CONTINUE; + }); +}; + +var easeOutQuad = function(t, begin, end, duration) { + t /= duration + return begin + (t * (2 - t) * (end - begin)) +}; + +var ease_property = function(object, property, begin, end, duration, update) { + let start = Date.now(); + GLib.timeout_add(GLib.PRIORITY_DEFAULT, update, () => { + let time = Date.now() - start; + if (time < duration) { + object[property] = easeOutQuad(time, begin, end, duration); + return GLib.SOURCE_CONTINUE; + } else { + object[property] = end; + return GLib.SOURCE_REMOVE; + } + }); +}; \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/window_list.js b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/window_list.js new file mode 100644 index 0000000..ca8708d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/blur-my-shell@aunetx/window_list.js @@ -0,0 +1,128 @@ +'use strict'; + +const { St, Shell, Meta, Gio } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + + +var WindowListBlur = class WindowListBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.blur_effects = []; + } + + enable() { + this._log("blurring window list"); + + // add the blur if window-list found + Main.layoutManager.uiGroup.get_children().forEach(child => this.try_blur(child)); + + // listen to new actors in `Main.layoutManager.uiGroup` and blur if window-list + this.connections.connect(Main.layoutManager.uiGroup, 'actor-added', (_, child) => this.try_blur(child)); + + // connect to overview + this.connections.connect(Main.overview, 'showing', () => { + this.hide(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } + + try_blur(child) { + if (child.constructor.name == "WindowList" && child.style != "background:transparent;") { + this._log("found window list to blur"); + + child.style = "background:transparent;"; + let effect = new Shell.BlurEffect({ + name: 'window-list-blur', + sigma: this.prefs.SIGMA.get(), + brightness: this.prefs.BRIGHTNESS.get(), + mode: 1 + }); + child.add_effect(effect); + this.blur_effects.push(effect); + + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("window list hack level 1"); + + child._windowList.get_children().forEach(child => { + this.connections.connect(child, 'button-press-event', () => { effect.queue_repaint(); }); + }); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("window list hack level 2"); + + this.paint_signals.connect(child, effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + + child._windowList.get_children().forEach(window => this.blur_window_button(window)); + this.connections.connect(child._windowList, 'actor-added', (_, window) => { + this.blur_window_button(window); + }) + } + } + + blur_window_button(window) { + window.get_child_at_index(0).style = "box-shadow:none;background-color:rgba(0,0,0,0.2);border-radius:5px;"; + } + + try_remove_blur(child) { + if (child.constructor.name == "WindowList" && child.style == "background:transparent;") { + child.style = null; + child.remove_effect_by_name('window-list-blur'); + + child._windowList.get_children().forEach(child => { + child.get_child_at_index(0).style = null; + }); + } + } + + set_sigma(s) { + this.blur_effects.forEach(effect => { + effect.sigma = s; + }); + } + + set_brightness(b) { + this.blur_effects.forEach(effect => { + effect.brightness = b; + }); + } + + hide() { + this.set_sigma(0); + } + + show() { + this.set_sigma(this.prefs.SIGMA.get()); + } + + disable() { + this._log("removing blur from window list"); + + Main.layoutManager.uiGroup.get_children().forEach(child => this.try_remove_blur(child)) + + this.blur_effects = []; + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING new file mode 100644 index 0000000..8d61b15 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/README.md b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/README.md new file mode 100644 index 0000000..5000de1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/README.md @@ -0,0 +1,189 @@ +

      + +

      +
      + +![](media/design/png/dtp-main-p2.png) + +### Introduction + +Dash to Panel is an icon taskbar for Gnome Shell. This extension moves the dash into the gnome main panel so that the application launchers and system tray are combined into a single panel, similar to that found in KDE Plasma and Windows 7+. A separate dock is no longer needed for easy access to running and favorited applications. + +Beyond that, just about every aspect of the panel is fully customizable. From positioning and scaling panel elements to running indicators to multi-monitor display, to window previews and even intellihide, Dash to Panel has everything you need to make your workspace feel like home. + +### Features + +|Customizable appearance| +|:-----:| +|![screenshot](media/design/gif/customizable.gif)| +|Hide & show panel elements and set their positions, sizes & colors| + +## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Customizable running indicators
      MetroCiliora/Dashes
      CilioraSquares/Segmented
      DashesDots/Solid
      Set position, style, weight & color of running indicators to easily and quickly identify focused and unfocused applications
      + +## + +|Live Previews on Hover| +|:-----:| +|![screenshot](media/design/gif/previews.gif)| +|Hover over the launcher icon for an open application to get a live window preview| + +## +|Launch by Number| +|:-----:| +|![](media/design/png/indicators-num.png.png)| +|Optionally launch your favorite applications via keyboard| + +## + +|Panel Intellihide| +|:-----:| +|![Intellihide](media/design/gif/Intellihide.gif)| +|Hide and reveal the panel according to your set preferences| + +## +|Additional Features|Feature Implemented| +|:-----|:-----:| +|Add "Show Desktop" button to panel|![](media/design/png/done.png)| +|Isolate running apps by workspaces and/or monitors|![](media/design/png/done.png)| +|Custom click behaviors (launch new window, cycle open windows, minimize, etc)|![](media/design/png/done.png)| +|Integrate native Gnome appMenu into right-click secondary menu|![](media/design/png/done.png)| +|Multi-monitor support|![](media/design/png/done.png)| +|Dynamic transparency|![](media/design/png/done.png)| +|Ungroup application windows|![](media/design/png/done.png)| +|Export and import settings|![](media/design/png/done.png)| +## + +### Installation + +**To install the most recent official release: +[Visit Dash-to-Panel at GNOME Extensions](https://extensions.gnome.org/extension/1160/dash-to-panel/)** + +To install a development version from source, please see the [Installation wiki page](https://github.com/jderose9/dash-to-panel/wiki/Installation). + +## +### FAQ + +How do I customize the panel? [See the Wiki](https://github.com/home-sweet-gnome/dash-to-panel/wiki/Enable-and-Customize#customize-it) + +How do I embed my bottom left notification drawer into the panel like a system tray? [Top Icons Plus](https://extensions.gnome.org/extension/2311/topicons-plus) or [(K)StatusNotifierItem/AppIndicator Support](https://extensions.gnome.org/extension/615/appindicator-support) + +How do I add a traditional start menu? [Arc Menu](https://extensions.gnome.org/extension/3628/arcmenu/) + +How do I disable the hot corner? [No Topleft Hot Corner](https://extensions.gnome.org/extension/118/no-topleft-hot-corner) + +How do I move the notifications to somewhere other than the top center? [Panel OSD](https://extensions.gnome.org/extension/708/panel-osd) + +How do I display Minimize & Maximize buttons? In the Tweak Tool application, turn on `Windows > Titlebar Buttons > Minimize & Maximize`. + +How do I reset the extension to its default settings? `dconf reset -f /org/gnome/shell/extensions/dash-to-panel/`. + +## +### Themes +While this extension works well with most popular Gnome Shell themes, the following themes are known to have explicitly added custom styles for this extension: +- [Ciliora Tertia](https://github.com/zagortenay333/ciliora-tertia-shell) / [Ciliora Secunda](https://github.com/zagortenay333/ciliora-secunda-shell) +- [Plano](https://github.com/lassekongo83/plano-theme) + + +## +### Compatibility + +This extension has been tested with Gnome 3.18+. + +This extension manipulates the Gnome Main Panel, aka Top Bar. So, most other extensions which operate on the top bar should be compatible. + +## +### Volunteers needed! + +This extension could be even better with your help! Any items in the issue tracker labelled `help wanted` or `good first issue` are up for grabs. For more info, see the [Contributing wiki page](https://github.com/jderose9/dash-to-panel/wiki/Contributing). + +## +### Credits + +This extension is developed and maintained by [@jderose9](https://github.com/jderose9) and [@charlesg99](https://github.com/charlesg99). + +Significant portions of code in this extension were derived from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html). + +Additional credits: This extension leverages the work for [ZorinOS Taskbar](https://github.com/ZorinOS/zorin-taskbar) (used in [ZorinOS](https://zorinos.com/)) to show window previews and allow the dash from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html) to be embedded in the Gnome main panel. +Code to set anchor position taken from [Thoma5/gnome-shell-extension-bottompanel](https://github.com/Thoma5/gnome-shell-extension-bottompanel). +Pattern for moving panel contents based on [Frippery Move Clock](http://frippery.org/extensions/) by R M Yorston. +Ideas for recursing child actors and assigning inline styles are based on code from the extension [StatusAreaHorizontalSpacing](https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension). +## + +#### Thanks to the following people for contributing via pull requests: + +- @franglais125 for launching apps by number (w/ overlay), bug fixes, and issue support +- @LinxGem33 and @sbarrett322 for artwork, logos, screenshots and design effort +- @dziku1337 for peek mode in window previews +- @robrobinbin for configuring appMenu on/off in the panel +- @MartinPL for toggling favorites on/off in panel +- @jackwickham for thumbnail middle and right click actions +- @abakkk for centering the taskbar icons in the panel, and animated taskbar hovering +- @quasoft for changing of font weight of ungrouped application titles +- @jordanribera for using icon's dominant color as running indicator color +- @tper0700 for dynamically building context menu based on system capabilities +- @levacic for configurable minimized application title font color +- @l3nn4rt for toggling workspace switch popup +- @hlechner for adjustable show desktop line color and window preview icon size +- @ArtyomZorin for animated urgent icons +- @jvpessoa10 for additional click window cycle options +- @marksvc for assigning percent of display for panel length +- @philippun1 for GNOME 40 support :rocket: + +#### Bug Fixes: +@imrvelj, @Teslator, @bil-elmoussaoui, @brandon-schumann, @sw9, @rockon999 , @lexruee, @3v1n0, @freeroot, @moqmar, @ArtyomZorin, @lkc0987, @saibotk, @vanillajonathan, @Zkdc, @leebickmtu, @l3nn4rt, @Melix19, @Aikatsui, @melix99, @kyrillzorin, @oneshadab, , @CorvetteCole + +#### Documentation Improvements: +@BoQsc, @zakkak, @dandv + +#### Translations: +@frnogueira / @victorwpbastos (pt_BR), @zeten30 (cs), @franglais125 / @calotam / @oeramirez (es), @LaurentTreguier / @SolarLiner (fr), @elsieholmes (uk), @hosiet (zh\_CN), @jonnius / @linuxr01 (de), @urbalazs / @pappfer (hu), @crayxt (kk), @pkomur / @MartinPL / @alex4401 (pl), @AlexGluck / @GoodNike / @rjapolov / @vantu5z (ru), @sicklylife-jp / @ryonakano (ja), @oltulu / @TeknoMobil / @daenney (tr), @sbadux / @kowalski7cc / @l3nn4rt (it), @OriginCode / @pan93412 (zh\_TW), @ojn (sv), @frandieguez (gl) + + +## +### License & Terms ![](media/design/png/copyleft-16.png) + +Dash to Panel is available under the terms of the GPL-v2 or later license See [`COPYING`](https://github.com/jderose9/dash-to-panel/blob/master/COPYING) for details. + +![](https://img.shields.io/badge/Language-JavaScript-yellow.svg) ![](https://img.shields.io/badge/Licence-GPL--2.0-blue.svg) diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui new file mode 100644 index 0000000..ed7ef90 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui @@ -0,0 +1,7508 @@ + + + + + + True + False + vertical + 1 + 1 + + + True + True + False + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Animation type + 0 + + + + + True + False + center + + Simple + Ripple + Plank + + + + + + + + + + True + True + False + + + True + False + 12 + 12 + 12 + 12 + 24 + 32 + + + True + False + 12 + Duration + True + 0 + end + + 0 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_duration_adjustment + 0 + 0 + right + True + + 0 + 1 + + + + + + True + False + Rotation + 0 + end + + 1 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_rotation_adjustment + 0 + 0 + right + True + + 1 + 1 + + + + + + True + False + Travel + 0 + end + + 2 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_travel_adjustment + 0 + 0 + right + True + + 2 + 1 + + + + + + True + False + Zoom + 0 + end + + 3 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_zoom_adjustment + 0 + 0 + right + True + + 3 + 1 + + + + + + True + False + Convexity + 0 + end + + 4 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_convexity_adjustment + 1 + 1 + right + True + + 4 + 1 + + + + + + True + False + Extent + 0 + end + + 5 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_extent_adjustment + 0 + 0 + right + True + + 5 + 1 + + + + + + + + + + 100 + 1 + 10 + + + 0 + 300 + 1 + 5 + + + -30 + 30 + 1 + 5 + + + 0 + 100 + 1 + 5 + + + 100 + 250 + 1 + 5 + + + 0 + 3 + 0.1 + 1 + + + 1 + 10 + 0.1 + 1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + True + Nothing yet! + True + + + + + + + + + + + True + False + 12 + 12 + 12 + 12 + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + When set to minimize, double clicking minimizes all the windows of the application. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Shift+Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Toggle single / Cycle multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Middle-Click. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Middle-Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Shift+Middle-Click. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Shift+Middle-Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + + + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + center + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Integrate <i>AppMenu</i> items + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + 100 + 80 + True + True + + + True + False + center + 12 + 12 + 12 + 12 + 32 + + + True + False + True + <i>Show Details</i> menu item + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + 10 + 1 + 5 + + + 5 + 1 + 5 + + + 50 + 9999 + 25 + 100 + + + 5 + 100 + 5 + 5 + + + True + False + 12 + 12 + vertical + 1 + 1 + + + True + False + 12 + 12 + 12 + 12 + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Highlight focused application + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 8 + + + True + False + True + Icon dominant color + 0 + + 0 + 0 + + + + + + True + True + end + center + + + + + True + False + True + Custom color + 0 + + 1 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + False + True + Highlight opacity + 0 + + 2 + 0 + + + + + + True + True + end + 5 + focus_highlight_opacity_adjustment + 5 + + 2 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Indicator size (px) + 0 + + 0 + 0 + + + + + + True + True + end + 0 + dot_size_adjustment + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Indicator color - Icon Dominant + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + vertical + + + True + False + + + True + False + True + Indicator color - Override Theme + 0 + + + + + True + True + end + center + + + + + + + True + False + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 1 window open (or ungrouped) + 0 + + 0 + 0 + + + + + + True + False + end + + + Apply to all + True + True + True + + + + + True + True + True + end + + + + 0 + 1 + + + + + + True + False + True + 2 windows open + 0 + + 1 + 0 + + + + + + True + False + True + 3 windows open + 0 + + 2 + 0 + + + + + + True + False + True + 4+ windows open + 0 + + 3 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + True + True + end + + 2 + 1 + + + + + + True + True + True + end + + 3 + 1 + + + + + + + + True + False + vertical + + + True + False + 12 + + + True + False + True + Use different for unfocused + 0 + + + + + True + True + end + center + + + + + + + True + False + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 1 window open (or ungrouped) + 0 + + 0 + 0 + + + + + + True + False + end + + + Apply to all + True + True + True + + + + + True + True + True + end + + + + 0 + 1 + + + + + + True + False + True + 2 windows open + 0 + + 1 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + False + True + 3 windows open + 0 + + 2 + 0 + + + + + + True + True + True + end + + 2 + 1 + + + + + + True + False + True + 4+ windows open + 0 + + 3 + 0 + + + + + + True + True + True + end + + 3 + 1 + + + + + + + + + + + + + + + + + + 6 + 24 + 1 + 100 + + + 1000 + 10 + 100 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 0 + group_apps_label_font_size_adjustment + True + + 0 + 1 + + + + + + True + False + True + Font size (px) of the application titles (default is 14) + True + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font weight of application titles + 0 + + 0 + 0 + + + + + + True + False + center + + inherit from theme + normal + lighter + bold + bolder + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font color of the application titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font color of the minimized application titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Maximum width (px) of the application titles (default is 160) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + group_apps_label_max_width_adjustment + True + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use a fixed width for the application titles + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Display running indicators on unfocused applications + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use the favorite icons as application launchers + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + 10 + 2000 + 10 + 100 + + + 10 + 4000 + 10 + 100 + + + 10000 + 10 + 100 + + + 1 + 9990 + 10 + 100 + + + 1 + 5000 + 10 + 100 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + True + + + True + False + True + Only hide the panel when it is obstructed by windows + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 4 + + + True + False + True + The panel hides from + 0 + + 0 + 0 + + + + + + True + False + center + + All windows + Focused windows + Maximized windows + + + 0 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Require pressure at the edge of the screen to reveal the panel + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 4 + + + True + False + True + Required pressure threshold (px) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_pressure_threshold_adjustment + True + + 0 + 1 + + + + + + True + False + True + Required pressure timeout (ms) + True + 0 + + 1 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_pressure_time_adjustment + True + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Allow the panel to be revealed while in fullscreen mode + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Only hide secondary panels (requires multi-monitors option) + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>i + + 0 + 1 + 2 + + + + + + True + False + True + Keyboard shortcut to reveal and hold the panel + 0 + + 0 + 0 + + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Hide and reveal animation duration (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_animation_time_adjustment + True + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Delay before hiding the panel (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 10 + intellihide_close_delay_adjustment + True + 10 + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Delay before enabling intellihide on start (ms) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 10 + intellihide_enable_hide_delay_adjustment + True + 10 + + 0 + 1 + + + + + + + + + + + + + + 9999 + 25 + 100 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 255 + 10 + 25 + + + 1000 + 10 + 50 + + + 50 + 500 + 10 + 50 + + + 100 + 5 + 10 + + + 50 + 1 + 5 + + + 100 + 800 + 10 + 50 + + + 9999 + 25 + 100 + + + 6 + 24 + 1 + 100 + + + 8 + 48 + 1 + 100 + + + True + True + 460 + 480 + + + True + False + True + True + natural + natural + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 0 + preview_timeout_adjustment + True + + 0 + 1 + + + + + + True + False + True + Time (ms) before showing (400 is default) + True + 0 + + 0 + 0 + + + + + + True + False + True + Animation time (ms) + 0 + + 2 + 0 + + + + + + True + True + end + 4 + 0 + preview_animation_time_adjustment + True + + 2 + 1 + + + + + + True + False + vertical + + + True + False + True + Time (ms) before hiding (100 is default) + 0 + + + + + True + True + False + 12 + 4 + + + 4 + True + False + start + 4 + Immediate on application icon click + True + + + + + + 1 + 0 + + + + + + True + True + end + center + 4 + 25 + leave_timeout_adjustment + True + 25 + + 1 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Middle click on the preview to close the window + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Window previews preferred size (px) + True + 0 + + 0 + 0 + 2 + + + + + + True + True + end + 4 + 100 + preview_size_adjustment + True + 100 + + + + + True + False + True + Window previews aspect ratio Y (height) + True + 0 + + 2 + 0 + + + + + + True + False + True + Window previews padding (px) + True + 0 + + 3 + 0 + + + + + + True + True + end + 4 + 50 + preview_padding_adjustment + True + 50 + + 3 + 1 + + + + + + True + False + end + 2 + True + + + True + False + end + center + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + + + + + + Fixed + True + True + True + end + + + + 1 + 1 + + + + + + True + False + True + Window previews aspect ratio X (width) + True + 0 + + 1 + 0 + + + + + + True + False + end + 2 + True + + + True + False + end + center + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + + + + + + Fixed + True + True + True + end + + + + 2 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use custom opacity for the previews background + True + 0 + + 0 + 0 + + + + + + True + False + True + If disabled, the previews background have the same opacity as the panel + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + True + False + 8 + + + True + True + end + center + + + + + True + True + end + center + 5 + preview_opacity_adjustment + 5 + + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Close button and header position + 0 + + + + + True + False + end + 32 + + + Bottom + True + True + False + center + center + True + + + + + + Top + True + True + False + center + center + preview_title_position_bottom_button + + + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Display window preview headers + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 32 + + + True + False + 8 + + + True + True + end + center + + + + + True + True + end + 4 + 6 + preview_custom_icon_size_adjustment + True + 6 + + + + 0 + 1 + + + + + + True + False + True + Icon size (px) of the window preview + True + 0 + + 1 + 0 + + + + + + True + False + True + If disabled, the previews icon size will be based on headerbar size + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 1 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + True + end + 4 + 6 + preview_title_font_size_adjustment + True + 6 + + 0 + 1 + + + + + + True + False + True + Font size (px) of the preview titles + True + 0 + + 0 + 0 + + + + + 2 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Font weight of the preview titles + 0 + + 0 + 0 + + + + + + True + False + end + center + + inherit from theme + normal + lighter + bold + bolder + + + 0 + 1 + + + + + 3 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Font color of the preview titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + 4 + 0 + 2 + + + + + + + + + + True + True + 6 + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable window peeking + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + When hovering over a window preview for some time, the window gets distinguished. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Enter window peeking mode timeout (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 50 + enter_peek_mode_timeout_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Time of inactivity while hovering over a window preview needed to enter the window peeking mode. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 2 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Window peeking mode opacity + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + peek_mode_opacity_adjustment + True + + 0 + 1 + + + + + + True + False + True + All windows except for the peeked one have their opacity set to the same value. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 3 + 0 + 2 + + + + + + + + + + + + + + 2000 + 10 + 50 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + 4 + 50 + scroll_icon_options_delay_adjustment + True + 50 + + 0 + 1 + 2 + + + + + + True + False + True + Delay between mouse scroll events (ms) + True + 0 + + 0 + 0 + + + + + + True + False + True + Use this value to limit the number of captured mouse scroll events. + True + 0 + + + 1 + 0 + + + + + + + + + + + + 2000 + 10 + 50 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + 4 + 50 + scroll_panel_options_delay_adjustment + True + 50 + + 0 + 1 + 2 + + + + + + True + False + True + Delay between mouse scroll events (ms) + True + 0 + + 0 + 0 + + + + + + True + False + True + Use this value to limit the number of captured mouse scroll events. + True + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show popup when changing workspace + True + 0 + + 0 + 0 + + + + + + True + False + True + This affects workspace popup when scrolling on the panel only. + True + 0 + + + 1 + 0 + + + + + + True + True + end + center + + 0 + 1 + 2 + + + + + + + + + + + + 10000 + 250 + 1000 + + + True + False + 12 + 12 + 12 + 12 + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Super + Super + Alt + + + 0 + 1 + 2 + + + + + + True + False + True + Hotkeys prefix + 0 + + 0 + 0 + + + + + + True + False + Hotkeys will either be Super+Number or Super+Alt+Num + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Never + Show temporarily + Always visible + + + 0 + 1 + 2 + + + + + + True + False + True + Number overlay + 0 + + 0 + 0 + + + + + + True + False + Temporarily show the application numbers over the icons when using the hotkeys. + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + True + 6 + 32 + + + True + True + end + shortcut_time_adjustment + + 0 + 1 + + + + + + True + False + True + Hide timeout (ms) + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>q + + 0 + 1 + 2 + + + + + + True + False + True + Shortcut to show the overlay for 2 seconds + 0 + + 0 + 0 + + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show window previews on hotkey + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + 2 + + + + + + True + False + True + Show previews when the application have multiple instances + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + end + center + + Number row + Numeric keypad + Both + + + 0 + 1 + 2 + + + + + + True + False + True + Hotkeys are activated with + 0 + + 0 + 0 + + + + + + True + False + Select which keyboard number keys are used to activate the hotkeys + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + + + + + 100 + 1 + 10 + + + True + False + vertical + 1 + 1 + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Current Show Applications icon + True + 0 + + 0 + 0 + + + + + + 32 + 32 + True + False + end + gtk-missing-image + 32 + + 0 + 1 + + + + + + 140 + True + + 1 + 1 + + + + + + True + False + True + Custom Show Applications image icon + True + 0 + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + True + 6 + 32 + + + True + True + end + 0 + show_applications_side_padding_adjustment + + 0 + 1 + + + + + + True + False + True + Show Applications icon side padding (px) + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Override escape key and return to desktop + True + 0 + + 0 + 0 + + + + + + + + + + 5000 + 10 + 100 + + + 5000 + 10 + 100 + + + 1 + 40 + 1 + 10 + + + True + False + vertical + + + True + False + none + 1 + 1 + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_width_adjustment + True + 1 + + 0 + 1 + + + + + + True + False + True + Override Show Desktop line color + 0 + + 1 + 0 + + + + + + True + False + 12 + end + + + True + True + True + end + True + + + + + True + True + end + center + + + + 1 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Reveal the desktop when hovering the Show Desktop button + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 4 + + + True + False + True + Delay before revealing the desktop (ms) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_delay_adjustment + True + 1 + + 0 + 1 + + + + + + True + False + True + Fade duration (ms) + True + 0 + + 1 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_time_adjustment + True + 1 + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + 0.33 + 1 + 0.01 + 0.1 + + + 2000 + 1 + 10 + + + 200 + 1 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + + + True + False + True + The panel background opacity is affected by + 0 + + 0 + 0 + + + + + + True + False + center + + All windows + Focused windows + Maximized windows + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 50 + trans_distance_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Change opacity when a window gets closer than (px) + True + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + + + True + False + 12 + Change opacity to (%) + True + 0 + + + + + True + True + end + 0 + trans_opacity_min_adjustment + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 50 + trans_anim_time_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Opacity change animation duration (ms) + True + 0 + + 0 + 0 + + + + + + + + + + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + True + True + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + 32 + + + True + False + True + Display the main panel on + 0 + + 0 + 0 + + + + + + True + False + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Display panels on all monitors + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Panel Intellihide + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + 2 + + + + + + True + False + True + Hide and reveal the panel according to preferences + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + + + True + False + True + Order and positions on monitor + 0 + + 0 + 0 + + + + + + True + False + center + + 0 + 1 + + + + + + Apply changes to all monitors + True + True + False + 12 + 4 + 4 + + 1 + 0 + 2 + + + + + + True + False + 6 + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 6 + 6 + 12 + 32 + + + True + True + baseline + True + panel_size_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + True + False + Panel thickness (default is 48) + 0 + + 1 + 0 + + + + + + True + False + Panel length (%) (default is 100) + 0 + + 2 + 0 + + + + + + True + True + baseline + True + panel_length_adjustment + 0 + 0 + right + True + + 2 + 1 + + + + + + True + False + center + + Start + Middle + End + + + 3 + 1 + + + + + + True + False + Anchor + 0 + + 3 + 0 + + + + + + True + False + True + Panel screen position + 0 + + 0 + 0 + + + + + + True + False + 32 + + + Bottom + True + True + False + center + center + + True + + + + + + Top + True + True + False + center + center + + position_bottom_button + + + + + + Left + True + True + False + center + center + + position_bottom_button + + + + + + Right + True + True + False + center + center + + position_bottom_button + + + + 0 + 1 + + + + + + + 1 + 0 + + + + + + + + + + 2 + 0 + 2 + + + + + + + + True + False + 6 + none + + + + + + + + + + + + + + + + True + False + Position + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 12 + 32 + + + True + False + App Icon Margin (default is 8) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + appicon_margin_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 32 + + + True + False + App Icon Padding (default is 4) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + appicon_padding_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator position + 0 + + + + + True + False + 32 + + + Bottom + True + True + False + center + True + + + + + + Top + True + True + False + center + dots_bottom_button + + + + + + Left + True + True + False + center + dots_bottom_button + + + + + + Right + True + True + False + center + dots_bottom_button + + + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator style (Focused app) + 0 + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + False + end + center + + Dots + Squares + Dashes + Segmented + Solid + Ciliora + Metro + + + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator style (Unfocused apps) + 0 + + + + + True + False + end + center + + Dots + Squares + Dashes + Segmented + Solid + Ciliora + Metro + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme background color + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + end + + + + + True + True + end + center + + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme background opacity + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 12 + 6 + + + True + False + True + Panel background opacity (%) + True + 0 + + 0 + 0 + + + + + + True + True + end + center + 0 + trans_opacity_adjustment + + 0 + 1 + + + + + + True + False + True + vertical + + + True + False + True + Dynamic background opacity + True + 0 + + + + + True + False + True + Change opacity when a window gets close to the panel + True + 40 + 0 + + + + + 1 + 0 + + + + + + True + False + end + center + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme gradient + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 12 + 6 + + + True + False + True + Gradient top color and opacity (%) + 0 + + 0 + 0 + + + + + + True + False + True + Gradient bottom color and opacity (%) + 0 + + 1 + 0 + + + + + + True + False + 6 + + + True + True + True + + + + + True + True + end + center + 0 + trans_gradient_opacity1_adjustment + + + + 0 + 1 + + + + + + True + False + 6 + + + True + True + True + + + + + True + True + end + center + 0 + trans_gradient_opacity2_adjustment + + + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Animate hovering app icons + 0 + + 2 + 0 + + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 2 + 1 + + + + + + + + + + + + + + + + + + True + False + Style + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Show favorite applications + 0 + + 0 + 0 + + + + + + True + False + True + Show running applications + 0 + + 2 + 0 + + + + + + True + True + end + center + + 2 + 1 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Show favorite applications on secondary panels + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + + 0 + 1 + 2 + + + + + + True + False + True + Show <i>AppMenu</i> button + True + 0 + + 0 + 0 + + + + + + True + False + True + Top Bar > Show App Menu must be enabled in Tweak Tool + True + True + 0 + + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + + + + + + True + False + True + Show window previews on hover + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Show tooltip on hover + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Isolate Workspaces + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Isolate monitors + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Click empty space to close overview + True + 0 + + 0 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Disable show overview on startup + True + 0 + + 0 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Ungroup applications + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + + + + + + + + + + + + + + + + + + + + + True + False + Behavior + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behaviour when clicking on the icon of a running application. + True + 0 + + + 1 + 0 + + + + + + True + False + True + Click action + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + False + center + + Cycle windows + minimize + Cycle through windows + Toggle single / Preview multiple + Toggle windows + Raise windows + Launch new instance + + + + + 0 + 1 + 2 + + + + + + + + + + + + + + + + + False + 0 + + + True + False + 12 + 12 + 12 + 12 + 16 + 6 + + + True + False + vertical + + + True + False + True + Scroll panel action + 0 + + + + + True + False + True + Behavior when mouse scrolling over the panel. + True + 0 + + + + + 0 + 0 + + + + + + True + False + vertical + + + True + False + True + Scroll icon action + 0 + + + + + True + False + True + Behavior when mouse scrolling over an application icon. + True + 0 + + + + + 1 + 0 + + + + + + True + True + True + end + center + + + True + False + emblem-system-symbolic + + + + + 0 + 1 + + + + + + True + False + center + True + + Do nothing + Switch workspace + Cycle windows + Change volume + + + 0 + 2 + + + + + + True + False + center + True + + Do nothing + Cycle windows + Same as panel + + + 1 + 2 + + + + + + True + True + True + end + center + + + True + False + emblem-system-symbolic + + + + + 1 + 1 + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl. + True + True + 0 + + + 1 + 0 + + + + + + True + False + True + Use hotkeys to activate apps + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + 2 + + + + + + + + + + + + + + + + + + + + + True + False + Action + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + True + none + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 12 + 32 + + + True + False + Tray Font Size (0 = theme default) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + tray_size_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + True + False + LeftBox Font Size (0 = theme default) + 0 + + 1 + 0 + + + + + + True + True + baseline + True + leftbox_size_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + Tray Item Padding (-1 = theme default) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + tray_padding_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + True + False + Status Icon Padding (-1 = theme default) + 0 + + 1 + 0 + + + + + + True + True + baseline + True + statusicon_padding_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + True + False + LeftBox Padding (-1 = theme default) + 0 + + 2 + 0 + + + + + + True + True + baseline + True + leftbox_padding_adjustment + 0 + 0 + right + True + + + 2 + 1 + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Animate switching applications + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Animate launching new windows + 0 + + 1 + 0 + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Keep original gnome-shell dash (overview) + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Force Activities hot corner on primary monitor + 0 + + 3 + 0 + + + + + + True + True + end + center + + 3 + 1 + + + + + + True + False + True + Activate panel menu buttons (e.g. date menu) on click only + 0 + + 2 + 0 + + + + + + True + True + end + center + + 2 + 1 + + + + + + True + False + True + Keep original gnome-shell top panel + 0 + + 1 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 20 + 32 + + + True + False + True + App icon secondary (right-click) menu + 0 + + 0 + 0 + + + + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + 0 + 1 + + + + + + + + + + + + + + + + + Advanced Options + False + True + True + start + + + + + + + + + True + False + center + Fine-Tune + + + + + + + False + 24 + 24 + 24 + 24 + True + True + vertical + 5 + + + True + False + vertical + + + True + False + <b>Dash-to-Panel</b> + True + + + + + True + False + center + + + True + False + end + version: + + + + + True + False + start + ... + + + + + + + GitHub + True + True + True + center + https://github.com/jderose9/dash-to-panel + + + + + + + False + 20 + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + 12 + True + Use the buttons below to create a settings file from your current preferences that can be imported on a different machine. + True + 0 + + + 1 + 0 + 2 + + + + + + True + False + start + Export and import settings + + 0 + 0 + 2 + + + + + + Export to file + True + True + True + + 2 + 0 + + + + + + Import from file + True + True + True + + 2 + 1 + + + + + + + + + + + + + + + + + True + True + end + <span size="small">This program comes with ABSOLUTELY NO WARRANTY. See the <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2 or later</a> for details.</span> + True + center + True + + + + + + + + + True + False + About + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js new file mode 100644 index 0000000..e79eae8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js @@ -0,0 +1,1964 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + + +const Clutter = imports.gi.Clutter; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const Signals = imports.signals; +const Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; + +const Config = imports.misc.config; +const AppDisplay = imports.ui.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Util = imports.misc.util; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; +const Panel = Me.imports.panel; +const PanelSettings = Me.imports.panelSettings; +const Taskbar = Me.imports.taskbar; +const Progress = Me.imports.progress; +const _ = imports.gettext.domain(Utils.TRANSLATION_DOMAIN).gettext; + +//timeout names +const T1 = 'setStyleTimeout'; +const T2 = 'mouseScrollTimeout'; +const T3 = 'showDotsTimeout'; +const T4 = 'overviewWindowDragEndTimeout'; +const T5 = 'switchWorkspaceTimeout'; +const T6 = 'displayProperIndicatorTimeout'; + +//right padding defined for .overview-label in stylesheet.css +const TITLE_RIGHT_PADDING = 8; + +let LABEL_GAP = 5; +let MAX_INDICATORS = 4; +var DEFAULT_PADDING_SIZE = 4; + +let DOT_STYLE = { + DOTS: "DOTS", + SQUARES: "SQUARES", + DASHES: "DASHES", + SEGMENTED: "SEGMENTED", + CILIORA: "CILIORA", + METRO: "METRO", + SOLID: "SOLID" +} + +let DOT_POSITION = { + TOP: "TOP", + BOTTOM: "BOTTOM", + LEFT: 'LEFT', + RIGHT: 'RIGHT' +} + +let recentlyClickedAppLoopId = 0; +let recentlyClickedApp = null; +let recentlyClickedAppWindows = null; +let recentlyClickedAppIndex = 0; +let recentlyClickedAppMonitorIndex; + +let tracker = Shell.WindowTracker.get_default(); +let menuRedisplayFunc = !!(AppDisplay.AppMenu || AppDisplay.AppIconMenu).prototype._rebuildMenu ? '_rebuildMenu' : '_redisplay'; + +/** + * Extend AppIcon + * + * - Apply a css class based on the number of windows of each application (#N); + * - Draw a dot for each window of the application based on the default "dot" style which is hidden (#N); + * a class of the form "running#N" is applied to the AppWellIcon actor. + * like the original .running one. + * - add a .focused style to the focused app + * - Customize click actions. + * - Update minimization animation target + * + */ + +var taskbarAppIcon = Utils.defineClass({ + Name: 'DashToPanel.TaskbarAppIcon', + Extends: AppDisplay.AppIcon, + ParentConstrParams: [[0, 'app'], [2]], + + _init: function(appInfo, panel, iconParams, previewMenu, iconAnimator) { + this.dtpPanel = panel; + this._nWindows = 0; + this.window = appInfo.window; + this.isLauncher = appInfo.isLauncher; + this._previewMenu = previewMenu; + this.iconAnimator = iconAnimator; + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + // Fix touchscreen issues before the listener is added by the parent constructor. + this._onTouchEvent = function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) { + // Open the popup menu on long press. + this._setPopupTimeout(); + } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { + // Activate/launch the application. + this.activate(1); + this._removeMenuTimeout(); + } + // Disable dragging via touch screen as it's buggy as hell. Not perfect for tablet users, but the alternative is way worse. + // Also, EVENT_PROPAGATE launches applications twice with this solution, so this.activate(1) above must only be called if there's already a window. + return Clutter.EVENT_STOP; + }; + // Hack for missing TOUCH_END event. + this._onLeaveEvent = function(actor, event) { + this.actor.fake_release(); + if (this._menuTimeoutId != 0) this.activate(1); // Activate/launch the application if TOUCH_END didn't fire. + this._removeMenuTimeout(); + }; + + this.callParent('_init', appInfo.app, iconParams); + + Utils.wrapActor(this.icon); + Utils.wrapActor(this); + + this._dot.set_width(0); + this._isGroupApps = Me.settings.get_boolean('group-apps'); + + this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); + this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._dtpIconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), style: getIconContainerStyle(panel.checkIfVertical()) }); + + this.actor.remove_actor(this._iconContainer); + + this._dtpIconContainer.add_child(this._iconContainer); + + if (appInfo.window) { + let box = new St.BoxLayout(); + + this._windowTitle = new St.Label({ + y_align: Clutter.ActorAlign.CENTER, + x_align: Clutter.ActorAlign.START, + style_class: 'overview-label' + }); + + this._updateWindowTitle(); + this._updateWindowTitleStyle(); + + this._scaleFactorChangedId = Utils.getStageTheme().connect('changed', () => this._updateWindowTitleStyle()); + + box.add_child(this._dtpIconContainer); + box.add_child(this._windowTitle); + + this._dotsContainer.add_child(box); + } else { + this._dotsContainer.add_child(this._dtpIconContainer); + } + + this._container.add_child(this._dotsContainer); + this.actor.set_child(this._container); + + if (panel.checkIfVertical()) { + this.actor.set_width(panel.geom.w); + } + + // Monitor windows-changes instead of app state. + // Keep using the same Id and function callback (that is extended) + if(this._stateChangedId > 0) { + this.app.disconnect(this._stateChangedId); + this._stateChangedId = 0; + } + + this._onAnimateAppiconHoverChanged(); + this._setAppIconPadding(); + this._showDots(); + + this._focusWindowChangedId = global.display.connect('notify::focus-window', + Lang.bind(this, this._onFocusAppChanged)); + + this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; + this._stateChangedId = this.app.connect('windows-changed', Lang.bind(this, this.onWindowsChanged)); + + if (!this.window) { + if (Me.settings.get_boolean('isolate-monitors')) { + this._windowEnteredMonitorId = Utils.DisplayWrapper.getScreen().connect('window-entered-monitor', this.onWindowEnteredOrLeft.bind(this)); + this._windowLeftMonitorId = Utils.DisplayWrapper.getScreen().connect('window-left-monitor', this.onWindowEnteredOrLeft.bind(this)); + } + + this._titleWindowChangeId = 0; + this._minimizedWindowChangeId = 0; + } else { + this._titleWindowChangeId = this.window.connect('notify::title', + Lang.bind(this, this._updateWindowTitle)); + + this._minimizedWindowChangeId = this.window.connect('notify::minimized', + Lang.bind(this, this._updateWindowTitleStyle)); + } + + this._scrollEventId = this.actor.connect('scroll-event', this._onMouseScroll.bind(this)); + + this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', + Lang.bind(this, this._onOverviewWindowDragEnd)); + + this._switchWorkspaceId = global.window_manager.connect('switch-workspace', + Lang.bind(this, this._onSwitchWorkspace)); + + this._hoverChangeId = this.actor.connect('notify::hover', () => this._onAppIconHoverChanged()); + + this._dtpSettingsSignalIds = [ + Me.settings.connect('changed::animate-appicon-hover', Lang.bind(this, this._onAnimateAppiconHoverChanged)), + Me.settings.connect('changed::dot-position', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-size', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-focused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-unfocused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-dominant', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-override', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-1', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-2', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-3', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-4', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-different', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-1', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-2', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-3', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-4', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-dominant', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-color', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-opacity', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::group-apps-label-font-size', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-weight', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-color', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-color-minimized', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-max-width', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-use-fixed-width', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-underline-unfocused', Lang.bind(this, this._settingsChangeRefresh)) + ] + + this.forcedOverview = false; + + this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); + + this._numberOverlay(); + }, + + getDragActor: function() { + return this.app.create_icon_texture(this.dtpPanel.taskbar.iconSize); + }, + + // Used by TaskbarItemContainer to animate appIcons on hover + getCloneButton: function() { + // The source of the clone is this._container, + // using this.actor directly would break DnD style. + let clone = new Clutter.Clone({ + source: this.actor.child, + x: this.actor.child.x, y: this.actor.child.y, + width: this.actor.child.width, height: this.actor.child.height, + pivot_point: new Utils.getPoint({ x: 0.5, y: 0.5 }), + opacity: 255, + reactive: false, + x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, + }); + + // "clone" of this.actor + return new St.Button({ + child: clone, + x: this.actor.x, y: this.actor.y, + width: this.actor.width, height: this.actor.height, + reactive: false, + }); + }, + + shouldShowTooltip: function() { + if (!Me.settings.get_boolean('show-tooltip') || + (!this.isLauncher && Me.settings.get_boolean("show-window-previews") && + this.getAppIconInterestingWindows().length > 0)) { + return false; + } else { + return this.actor.hover && !this.window && + (!this._menu || !this._menu.isOpen) && + (this._previewMenu.getCurrentAppIcon() !== this); + } + }, + + _onAppIconHoverChanged: function() { + if (!Me.settings.get_boolean('show-window-previews') || + (!this.window && !this._nWindows)) { + return; + } + + if (this.actor.hover) { + this._previewMenu.requestOpen(this); + } else { + this._previewMenu.requestClose(); + } + }, + + _onDestroy: function() { + this.callParent('_onDestroy'); + this._destroyed = true; + + this._timeoutsHandler.destroy(); + + this._previewMenu.close(true); + + // Disconect global signals + // stateChangedId is already handled by parent) + + if(this._overviewWindowDragEndId) + Main.overview.disconnect(this._overviewWindowDragEndId); + + if(this._focusWindowChangedId) + global.display.disconnect(this._focusWindowChangedId); + + if(this._titleWindowChangeId) + this.window.disconnect(this._titleWindowChangeId); + + if(this._minimizedWindowChangeId) + this.window.disconnect(this._minimizedWindowChangeId); + + if (this._windowEnteredMonitorId) { + Utils.DisplayWrapper.getScreen().disconnect(this._windowEnteredMonitorId); + Utils.DisplayWrapper.getScreen().disconnect(this._windowLeftMonitorId); + } + + if(this._switchWorkspaceId) + global.window_manager.disconnect(this._switchWorkspaceId); + + if(this._scaleFactorChangedId) + Utils.getStageTheme().disconnect(this._scaleFactorChangedId); + + if (this._hoverChangeId) { + this.actor.disconnect(this._hoverChangeId); + } + + if (this._scrollEventId) { + this.actor.disconnect(this._scrollEventId); + } + + for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { + Me.settings.disconnect(this._dtpSettingsSignalIds[i]); + } + }, + + onWindowsChanged: function() { + this._updateWindows(); + this.updateIcon(); + }, + + onWindowEnteredOrLeft: function() { + if (this._checkIfFocusedApp()) { + this._updateWindows(); + this._displayProperIndicator(); + } + }, + + updateTitleStyle: function() { + this._updateWindowTitleStyle(); + }, + + // Update indicator and target for minimization animation + updateIcon: function() { + + // If (for unknown reason) the actor is not on the stage the reported size + // and position are random values, which might exceeds the integer range + // resulting in an error when assigned to the a rect. This is a more like + // a workaround to prevent flooding the system with errors. + if (this.actor.get_stage() == null) + return; + + let rect = new Meta.Rectangle(); + + [rect.x, rect.y] = this.actor.get_transformed_position(); + [rect.width, rect.height] = this.actor.get_transformed_size(); + + let windows = this.window ? [this.window] : this.getAppIconInterestingWindows(true); + windows.forEach(function(w) { + w.set_icon_geometry(rect); + }); + }, + + _onAnimateAppiconHoverChanged: function() { + if (Me.settings.get_boolean('animate-appicon-hover')) { + this._container.add_style_class_name('animate-appicon-hover'); + + // Workaround to prevent scaled icon from being ugly when it is animated on hover. + // It increases the "resolution" of the icon without changing the icon size. + this.icon.createIcon = (iconSize) => this.app.create_icon_texture(2 * iconSize); + this._iconIconBinActorAddedId = this.icon._iconBin.connect('actor-added', () => { + if (this.icon._iconBin.child.mapped) { + this.icon._iconBin.child.set_size(this.icon.iconSize, this.icon.iconSize); + } else { + let iconMappedId = this.icon._iconBin.child.connect('notify::mapped', () => { + this.icon._iconBin.child.set_size(this.icon.iconSize, this.icon.iconSize); + this.icon._iconBin.child.disconnect(iconMappedId); + }); + } + }); + if (this.icon._iconBin.child) + this.icon._createIconTexture(this.icon.iconSize); + } else { + this._container.remove_style_class_name('animate-appicon-hover'); + + if (this._iconIconBinActorAddedId) { + this.icon._iconBin.disconnect(this._iconIconBinActorAddedId); + this._iconIconBinActorAddedId = 0; + this.icon.createIcon = Lang.bind(this, this._createIcon); + } + } + }, + + _onMouseScroll: function(actor, event) { + let scrollAction = Me.settings.get_string('scroll-icon-action'); + + if (scrollAction === 'PASS_THROUGH') { + return this.dtpPanel._onPanelMouseScroll(actor, event); + } else if (scrollAction === 'NOTHING' || (!this.window && !this._nWindows)) { + return; + } + + let direction = Utils.getMouseScrollDirection(event); + + if (direction && !this._timeoutsHandler.getId(T2)) { + this._timeoutsHandler.add([T2, Me.settings.get_int('scroll-icon-delay'), () => {}]); + + let windows = this.getAppIconInterestingWindows(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + Utils.activateSiblingWindow(windows, direction, this.window); + } + }, + + _showDots: function() { + // Just update style if dots already exist + if (this._focusedDots && this._unfocusedDots) { + this._updateWindows(); + return; + } + + if (!this._isGroupApps) { + this._focusedDots = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + visible: false + }); + + let mappedId = this.actor.connect('notify::mapped', () => { + this._displayProperIndicator(); + this.actor.disconnect(mappedId); + }); + } else { + this._focusedDots = new St.DrawingArea(), + this._unfocusedDots = new St.DrawingArea(); + this._focusedDots._tweeningToSize = null, + this._unfocusedDots._tweeningToSize = null; + + this._focusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._focusedDots, Me.settings.get_string('dot-style-focused'), true); + this._displayProperIndicator(); + })); + + this._unfocusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._unfocusedDots, Me.settings.get_string('dot-style-unfocused'), false); + this._displayProperIndicator(); + })); + + this._dotsContainer.add_child(this._unfocusedDots); + + this._updateWindows(); + + this._timeoutsHandler.add([T3, 0, () => { + this._resetDots(); + this._displayProperIndicator(); + }]); + } + + this._dotsContainer.add_child(this._focusedDots); + }, + + _resetDots: function() { + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + [this._focusedDots, this._unfocusedDots].forEach(d => { + d._tweeningToSize = null; + d.set_size(-1, -1); + d.x_expand = d.y_expand = false; + + d[isHorizontalDots ? 'width' : 'height'] = 1; + d[(isHorizontalDots ? 'y' : 'x') + '_expand'] = true; + }); + }, + + _settingsChangeRefresh: function() { + if (this._isGroupApps) { + this._updateWindows(); + this._resetDots(); + this._focusedDots.queue_repaint(); + this._unfocusedDots.queue_repaint(); + } + + this._displayProperIndicator(true); + }, + + _updateWindowTitleStyle: function() { + if (this._windowTitle) { + let useFixedWidth = Me.settings.get_boolean('group-apps-use-fixed-width'); + let variableWidth = !useFixedWidth || this.dtpPanel.checkIfVertical() || this.dtpPanel.taskbar.fullScrollView; + let fontWeight = Me.settings.get_string('group-apps-label-font-weight'); + let fontScale = Me.desktopSettings.get_double('text-scaling-factor'); + let fontColor = this.window.minimized ? + Me.settings.get_string('group-apps-label-font-color-minimized') : + Me.settings.get_string('group-apps-label-font-color'); + let scaleFactor = Utils.getScaleFactor(); + let maxLabelWidth = Me.settings.get_int('group-apps-label-max-width') * scaleFactor; + + this._windowTitle[(maxLabelWidth > 0 ? 'show' : 'hide')](); + + this._windowTitle.clutter_text.natural_width = useFixedWidth ? maxLabelWidth : 0; + this._windowTitle.clutter_text.natural_width_set = useFixedWidth; + this._windowTitle.set_width(variableWidth ? -1 : maxLabelWidth + TITLE_RIGHT_PADDING * scaleFactor); + + this._windowTitle.set_style('font-size: ' + Me.settings.get_int('group-apps-label-font-size') * fontScale + 'px;' + + 'font-weight: ' + fontWeight + ';' + + (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + + 'color: ' + fontColor); + } + }, + + _updateWindowTitle: function() { + if (this._windowTitle.text != this.window.title) { + this._windowTitle.text = (this.window.title ? this.window.title : this.app.get_name()).replace(/\r?\n|\r/g, '').trim(); + + if (this._focusedDots) { + this._displayProperIndicator(); + } + } + }, + + _setIconStyle: function(isFocused) { + let inlineStyle = 'margin: 0;'; + + if(Me.settings.get_boolean('focus-highlight') && + this._checkIfFocusedApp() && !this.isLauncher && + (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { + let focusedDotStyle = Me.settings.get_string('dot-style-focused'); + let isWide = this._isWideDotStyle(focusedDotStyle); + let pos = Me.settings.get_string('dot-position'); + let highlightMargin = isWide ? Me.settings.get_int('dot-size') : 0; + + if(!this.window) { + let containerWidth = this._dtpIconContainer.get_width() / Utils.getScaleFactor();; + let backgroundSize = containerWidth + "px " + + (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; + + if (focusedDotStyle == DOT_STYLE.CILIORA || focusedDotStyle == DOT_STYLE.SEGMENTED) + highlightMargin += 1; + + if (this._nWindows > 1 && focusedDotStyle == DOT_STYLE.METRO) { + let bgSvg = '/img/highlight_stacked_bg'; + + if (pos == DOT_POSITION.LEFT || pos == DOT_POSITION.RIGHT) { + bgSvg += (this.dtpPanel.checkIfVertical() ? '_2' : '_3'); + } + + inlineStyle += "background-image: url('" + Me.path + bgSvg + ".svg');" + + "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + + "background-size: " + backgroundSize; + } + } + + let highlightColor = this._getFocusHighlightColor(); + inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, Me.settings.get_int('focus-highlight-opacity') * 0.01); + } + + if(this._dotsContainer.get_style() != inlineStyle && this._dotsContainer.mapped) { + if (!this._isGroupApps) { + //when the apps are ungrouped, set the style synchronously so the icons don't jump around on taskbar redraw + this._dotsContainer.set_style(inlineStyle); + } else if (!this._timeoutsHandler.getId(T1)) { + //graphical glitches if i dont set this on a timeout + this._timeoutsHandler.add([T1, 0, () => this._dotsContainer.set_style(inlineStyle)]); + } + } + }, + + _checkIfFocusedApp: function() { + return tracker.focus_app == this.app; + }, + + _checkIfMonitorHasFocus: function() { + return global.display.focus_window && + (!Me.settings.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. + !Me.settings.get_boolean('isolate-monitors') || + global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); + }, + + _setAppIconPadding: function() { + let padding = getIconPadding(this.dtpPanel.monitor.index); + let margin = Me.settings.get_int('appicon-margin'); + + this.actor.set_style('padding:' + (this.dtpPanel.checkIfVertical() ? margin + 'px 0' : '0 ' + margin + 'px;')); + this._iconContainer.set_style('padding: ' + padding + 'px;'); + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + + if (this._draggable) { + this._draggable.fakeRelease(); + } + + if (this.isDragged) { + return; + } + + if (!this._menu) { + this._menu = new taskbarSecondaryMenu(this, this.dtpPanel); + this._menu.connect('activate-window', Lang.bind(this, function (menu, window) { + this.activateWindow(window, Me.settings); + })); + this._menu.connect('open-state-changed', Lang.bind(this, function (menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + + this._menuManager.addMenu(this._menu); + } + + this.emit('menu-state-changed', true); + + this._previewMenu.close(true); + + this.actor.set_hover(true); + this._menu.actor.add_style_class_name('dashtopanelSecondaryMenu'); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + _onFocusAppChanged: function(windowTracker) { + this._displayProperIndicator(true); + }, + + _onOverviewWindowDragEnd: function(windowTracker) { + this._timeoutsHandler.add([T4, 0, () => this._displayProperIndicator()]); + }, + + _onSwitchWorkspace: function(windowTracker) { + if (this._isGroupApps) { + this._timeoutsHandler.add([T5, 0, () => this._displayProperIndicator(true)]); + } else { + this._displayProperIndicator(); + } + }, + + _displayProperIndicator: function (force) { + let isFocused = this._isFocusedWindow(); + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + this._setIconStyle(isFocused); + + if(!this._isGroupApps) { + if (this.window && (Me.settings.get_boolean('group-apps-underline-unfocused') || isFocused)) { + let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; + + this._focusedDots.set_size(0, 0); + this._focusedDots[isHorizontalDots ? 'height' : 'width'] = this._getRunningIndicatorSize(); + + this._focusedDots.y_align = this._focusedDots.x_align = Clutter.ActorAlign.FILL; + this._focusedDots[(isHorizontalDots ? 'y' : 'x') + '_align'] = align; + this._focusedDots.background_color = this._getRunningIndicatorColor(isFocused); + this._focusedDots.show(); + } else if (this._focusedDots.visible) { + this._focusedDots.hide(); + } + } else { + let sizeProp = isHorizontalDots ? 'width' : 'height'; + let containerSize = this._container[sizeProp]; + let focusedDotStyle = Me.settings.get_string('dot-style-focused'); + let unfocusedDotStyle = Me.settings.get_string('dot-style-unfocused'); + let focusedIsWide = this._isWideDotStyle(focusedDotStyle); + let unfocusedIsWide = this._isWideDotStyle(unfocusedDotStyle); + + let newFocusedDotsSize = 0; + let newFocusedDotsOpacity = 0; + let newUnfocusedDotsSize = 0; + let newUnfocusedDotsOpacity = 0; + + isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + this._timeoutsHandler.add([T6, 0, () => { + if (!this._destroyed) { + if(isFocused) + this.actor.add_style_class_name('focused'); + else + this.actor.remove_style_class_name('focused'); + } + }]); + + if(focusedIsWide) { + newFocusedDotsSize = (isFocused && this._nWindows > 0) ? containerSize : 0; + newFocusedDotsOpacity = 255; + } else { + newFocusedDotsSize = containerSize; + newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; + } + + if(unfocusedIsWide) { + newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? containerSize : 0; + newUnfocusedDotsOpacity = 255; + } else { + newUnfocusedDotsSize = containerSize; + newUnfocusedDotsOpacity = (!isFocused && this._nWindows > 0) ? 255 : 0; + } + + // Only animate if... + // animation is enabled in settings + // AND (going from a wide style to a narrow style indicator or vice-versa + // OR going from an open app to a closed app or vice versa) + if(Me.settings.get_boolean('animate-app-switch') && + ((focusedIsWide != unfocusedIsWide) || + (this._focusedDots[sizeProp] != newUnfocusedDotsSize || this._unfocusedDots[sizeProp] != newFocusedDotsSize))) { + this._animateDotDisplay(this._focusedDots, newFocusedDotsSize, this._unfocusedDots, newUnfocusedDotsOpacity, force, sizeProp); + this._animateDotDisplay(this._unfocusedDots, newUnfocusedDotsSize, this._focusedDots, newFocusedDotsOpacity, force, sizeProp); + } else { + this._focusedDots.opacity = newFocusedDotsOpacity; + this._unfocusedDots.opacity = newUnfocusedDotsOpacity; + this._focusedDots[sizeProp] = newFocusedDotsSize; + this._unfocusedDots[sizeProp] = newUnfocusedDotsSize; + } + } + }, + + _animateDotDisplay: function (dots, newSize, otherDots, newOtherOpacity, force, sizeProp) { + if((dots[sizeProp] != newSize && dots._tweeningToSize !== newSize) || force) { + let tweenOpts = { + time: Taskbar.DASH_ANIMATION_TIME, + transition: 'easeInOutCubic', + onComplete: Lang.bind(this, function() { + if(newOtherOpacity > 0) + otherDots.opacity = newOtherOpacity; + dots._tweeningToSize = null; + }) + }; + + if(newOtherOpacity == 0) + otherDots.opacity = newOtherOpacity; + + tweenOpts[sizeProp] = newSize; + dots._tweeningToSize = newSize; + + Utils.animate(dots, tweenOpts); + } + }, + + _isFocusedWindow: function() { + let focusedWindow = global.display.focus_window; + + while (focusedWindow) { + if (focusedWindow == this.window) { + return true; + } + + focusedWindow = focusedWindow.get_transient_for(); + } + + return false; + }, + + _isWideDotStyle: function(dotStyle) { + return dotStyle == DOT_STYLE.SEGMENTED || + dotStyle == DOT_STYLE.CILIORA || + dotStyle == DOT_STYLE.METRO || + dotStyle == DOT_STYLE.SOLID; + }, + + _isThemeProvidingIndicator: function () { + // This is an attempt to determine if the theme is providing their own + // running indicator by way of a border image on the icon, for example in + // the theme Ciliora + return (this.icon.actor.get_stage() && + this.icon.actor.get_theme_node().get_border_image()); + }, + + activate: function(button, handleAsGrouped) { + let event = Clutter.get_current_event(); + let modifiers = event ? event.get_state() : 0; + + // Only consider SHIFT and CONTROL as modifiers (exclude SUPER, CAPS-LOCK, etc.) + modifiers = modifiers & (Clutter.ModifierType.SHIFT_MASK | Clutter.ModifierType.CONTROL_MASK); + + // We don't change the CTRL-click behaviour: in such case we just chain + // up the parent method and return. + if (modifiers & Clutter.ModifierType.CONTROL_MASK) { + // Keep default behaviour: launch new window + // By calling the parent method I make it compatible + // with other extensions tweaking ctrl + click + this.callParent('activate', button); + return; + } + + // We check what type of click we have and if the modifier SHIFT is + // being used. We then define what buttonAction should be for this + // event. + let buttonAction = 0; + if (button && button == 2 ) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = Me.settings.get_string('shift-middle-click-action'); + else + buttonAction = Me.settings.get_string('middle-click-action'); + } + else if (button && button == 1) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = Me.settings.get_string('shift-click-action'); + else + buttonAction = Me.settings.get_string('click-action'); + } + + let appCount = this.getAppIconInterestingWindows().length; + let previewedAppIcon = this._previewMenu.getCurrentAppIcon(); + this._previewMenu.close(Me.settings.get_boolean('window-preview-hide-immediate-click')); + + // We check if the app is running, and that the # of windows is > 0 in + // case we use workspace isolation, + let appIsRunning = this.app.state == Shell.AppState.RUNNING && appCount > 0; + + // We customize the action only when the application is already running + if (appIsRunning && !this.isLauncher) { + if (this.window && !handleAsGrouped) { + //ungrouped applications behaviors + switch (buttonAction) { + case 'RAISE': case 'CYCLE': case 'CYCLE-MIN': case 'MINIMIZE': case 'TOGGLE-SHOWPREVIEW': case 'TOGGLE-CYCLE': + if (!Main.overview._shown && + (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && + (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { + this.window.minimize(); + } else { + Main.activateWindow(this.window); + } + + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "QUIT": + this.window.delete(global.get_current_time()); + break; + } + } else { + //grouped application behaviors + let monitor = this.dtpPanel.monitor; + let appHasFocus = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + switch (buttonAction) { + case "RAISE": + activateAllWindows(this.app, monitor); + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "MINIMIZE": + // In overview just activate the app, unless the acion is explicitely + // requested with a keyboard modifier + if (!Main.overview._shown || modifiers){ + // If we have button=2 or a modifier, allow minimization even if + // the app is not focused + if (appHasFocus || button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK) { + // minimize all windows on double click and always in the case of primary click without + // additional modifiers + let all_windows = (button == 1 && ! modifiers) || event.get_click_count() > 1; + minimizeWindow(this.app, all_windows, monitor); + } + else + activateAllWindows(this.app, monitor); + } + else + this.app.activate(); + break; + + case "CYCLE": + if (!Main.overview._shown){ + if (appHasFocus) + cycleThroughWindows(this.app, false, false, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "CYCLE-MIN": + if (!Main.overview._shown){ + if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) + cycleThroughWindows(this.app, false, true, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "TOGGLE-SHOWPREVIEW": + if (!Main.overview._shown) { + if (appCount == 1) { + if (appHasFocus) + minimizeWindow(this.app, false, monitor); + else + activateFirstWindow(this.app, monitor); + } else { + if (event.get_click_count() > 1) { + // minimize all windows if double clicked + minimizeWindow(this.app, true, monitor); + } else if (previewedAppIcon != this) { + this._previewMenu.open(this); + } + + this.emit('sync-tooltip'); + } + } + else + this.app.activate(); + break; + case "TOGGLE-CYCLE": + if (!Main.overview._shown) { + if (appCount == 1) { + if (appHasFocus) + minimizeWindow(this.app, false, monitor); + else + activateFirstWindow(this.app, monitor); + } else { + cycleThroughWindows(this.app, false, false, monitor); + } + } + else + this.app.activate(); + break; + case "QUIT": + closeAllWindows(this.app, monitor); + break; + } + } + } + else { + this._launchNewInstance(); + } + + Main.overview.hide(); + }, + + _launchNewInstance: function() { + if (this.app.can_open_new_window()) { + let appActions = this.app.get_app_info().list_actions(); + let newWindowIndex = appActions.indexOf('new-window'); + + if(Me.settings.get_boolean('animate-window-launch')) { + this.animateLaunch(); + } + + if (newWindowIndex < 0) { + this.app.open_new_window(-1); + } else { + this.app.launch_action(appActions[newWindowIndex], global.get_current_time(), -1); + } + } else { + let windows = this.window ? [this.window] : this.app.get_windows(); + + if (windows.length) { + Main.activateWindow(windows[0]); + } else { + this.app.activate(); + } + } + }, + + _updateWindows: function() { + let windows = [this.window]; + + if (!this.window) { + windows = this.getAppIconInterestingWindows(); + + this._nWindows = windows.length; + + for (let i = 1; i <= MAX_INDICATORS; i++){ + let className = 'running'+i; + if(i != this._nWindows) + this.actor.remove_style_class_name(className); + else + this.actor.add_style_class_name(className); + } + } + + this._previewMenu.update(this, windows); + }, + + _getRunningIndicatorCount: function() { + return Math.min(this._nWindows, MAX_INDICATORS); + }, + + _getRunningIndicatorSize: function() { + return Me.settings.get_int('dot-size') * Utils.getScaleFactor(); + }, + + _getRunningIndicatorColor: function(isFocused) { + let color; + const fallbackColor = new Clutter.Color({ red: 82, green: 148, blue: 226, alpha: 255 }); + + if (Me.settings.get_boolean('dot-color-dominant')) { + let dce = new Utils.DominantColorExtractor(this.app); + let palette = dce._getColorPalette(); + if (palette) { + color = Clutter.color_from_string(palette.original)[1]; + } else { // unable to determine color, fall back to theme + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + } else if(Me.settings.get_boolean('dot-color-override')) { + let dotColorSettingPrefix = 'dot-color-'; + + if(!isFocused && Me.settings.get_boolean('dot-color-unfocused-different')) + dotColorSettingPrefix = 'dot-color-unfocused-'; + + color = Clutter.color_from_string(Me.settings.get_string(dotColorSettingPrefix + (this._getRunningIndicatorCount() || 1) ))[1]; + } else { + // Re-use the style - background color, and border width and color - + // of the default dot + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + + return color; + }, + + _getFocusHighlightColor: function() { + if (Me.settings.get_boolean('focus-highlight-dominant')) { + let dce = new Utils.DominantColorExtractor(this.app); + let palette = dce._getColorPalette(); + if (palette) return palette.original; + } + return Me.settings.get_string('focus-highlight-color'); + }, + + _drawRunningIndicator: function(area, type, isFocused) { + let n = this._getRunningIndicatorCount(); + + if (!n) { + return; + } + + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + let bodyColor = this._getRunningIndicatorColor(isFocused); + let [areaWidth, areaHeight] = area.get_surface_size(); + let cr = area.get_context(); + let size = this._getRunningIndicatorSize(); + + let areaSize = areaWidth; + let startX = 0; + let startY = 0; + + if (isHorizontalDots) { + if (position == DOT_POSITION.BOTTOM) { + startY = areaHeight - size; + } + } else { + areaSize = areaHeight; + + if (position == DOT_POSITION.RIGHT) { + startX = areaWidth - size; + } + } + + if (type == DOT_STYLE.SOLID || type == DOT_STYLE.METRO) { + if (type == DOT_STYLE.SOLID || n <= 1) { + cr.translate(startX, startY); + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [areaSize, size] : [size, areaSize])); + cr.fill(); + } else { + let blackenedLength = (1 / 48) * areaSize; // need to scale with the SVG for the stacked highlight + let darkenedLength = isFocused ? (2 / 48) * areaSize : (10 / 48) * areaSize; + let blackenedColor = bodyColor.shade(.3); + let darkenedColor = bodyColor.shade(.7); + let solidDarkLength = areaSize - darkenedLength; + let solidLength = solidDarkLength - blackenedLength; + + cr.translate(startX, startY); + + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [solidLength, size] : [size, solidLength])); + cr.fill(); + Clutter.cairo_set_source_color(cr, blackenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidLength, 0, 1, size] : [0, solidLength, size, 1]); + cr.fill(); + Clutter.cairo_set_source_color(cr, darkenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidDarkLength, 0, darkenedLength, size] : [0, solidDarkLength, size, darkenedLength]); + cr.fill(); + } + } else { + let spacing = Math.ceil(areaSize / 18); // separation between the indicators + let length; + let dist; + let indicatorSize; + let translate; + let preDraw = () => {}; + let draw; + let drawDash = (i, dashLength) => { + dist = i * dashLength + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0, dashLength, size] : [0, dist, size, dashLength])); + }; + + switch (type) { + case DOT_STYLE.CILIORA: + spacing = size; + length = areaSize - (size * (n - 1)) - (spacing * (n - 1)); + translate = () => cr.translate(startX, startY); + preDraw = () => { + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [length, size] : [size, length])); + }; + draw = i => { + dist = length + (i * spacing) + ((i - 1) * size); + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DOTS: + let radius = size / 2; + + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = (2 * i + 1) * radius + i * spacing; + cr.arc.apply(cr, (isHorizontalDots ? [dist, radius] : [radius, dist]).concat([radius, 0, 2 * Math.PI])); + }; + break; + case DOT_STYLE.SQUARES: + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = i * size + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DASHES: + length = Math.floor(areaSize / 4) - spacing; + translate = () => { + indicatorSize = Math.floor((areaSize - n * length - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => drawDash(i, length); + break; + case DOT_STYLE.SEGMENTED: + length = Math.ceil((areaSize - ((n - 1) * spacing)) / n); + translate = () => cr.translate(startX, startY); + draw = i => drawDash(i, length); + break; + } + + translate(); + + Clutter.cairo_set_source_color(cr, bodyColor); + preDraw(); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + draw(i); + } + cr.fill(); + } + + cr.$dispose(); + }, + + _numberOverlay: function() { + // Add label for a Hot-Key visual aid + this._numberOverlayLabel = new St.Label({ style_class: 'badge' }); + this._numberOverlayBin = new St.Bin({ + child: this._numberOverlayLabel, y: 2 + }); + this._numberOverlayLabel.add_style_class_name('number-overlay'); + this._numberOverlayOrder = -1; + this._numberOverlayBin.hide(); + + this._dtpIconContainer.add_child(this._numberOverlayBin); + }, + + updateHotkeyNumberOverlay: function() { + this.updateNumberOverlay(this._numberOverlayBin, true); + }, + + updateNumberOverlay: function(bin, fixedSize) { + // We apply an overall scale factor that might come from a HiDPI monitor. + // Clutter dimensions are in physical pixels, but CSS measures are in logical + // pixels, so make sure to consider the scale. + // Set the font size to something smaller than the whole icon so it is + // still visible. The border radius is large to make the shape circular + let [minWidth, natWidth] = this._dtpIconContainer.get_preferred_width(-1); + let font_size = Math.round(Math.max(12, 0.3 * natWidth) / Utils.getScaleFactor()); + let size = Math.round(font_size * 1.3); + let label = bin.child; + let style = 'font-size: ' + font_size + 'px;' + + 'border-radius: ' + this.icon.iconSize + 'px;' + + 'height: ' + size +'px;'; + + if (fixedSize || label.get_text().length == 1) { + style += 'width: ' + size + 'px;'; + } else { + style += 'padding: 0 2px;'; + } + + bin.x = fixedSize ? natWidth - size - 2 : 2; + label.set_style(style); + }, + + setNumberOverlay: function(number) { + this._numberOverlayOrder = number; + this._numberOverlayLabel.set_text(number.toString()); + }, + + toggleNumberOverlay: function(activate) { + if (activate && this._numberOverlayOrder > -1) + this._numberOverlayBin.show(); + else + this._numberOverlayBin.hide(); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + this._previewMenu.close(true); + } + + return DND.DragMotionResult.CONTINUE; + }, + + // Disable all DnD methods on gnome-shell 3.34 + _onDragBegin: function() {}, + _onDragEnd: function() {}, + acceptDrop: function() { return false; }, + + getAppIconInterestingWindows: function(isolateMonitors) { + return getInterestingWindows(this.app, this.dtpPanel.monitor, isolateMonitors); + } +}); +taskbarAppIcon.prototype.scaleAndFade = taskbarAppIcon.prototype.undoScaleAndFade = () => {}; + +function minimizeWindow(app, param, monitor){ + // Param true make all app windows minimize + let windows = getInterestingWindows(app, monitor); + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + for (let i = 0; i < windows.length; i++) { + let w = windows[i]; + if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()){ + w.minimize(); + // Just minimize one window. By specification it should be the + // focused window on the current workspace. + if(!param) + break; + } + } +} + +/* + * By default only non minimized windows are activated. + * This activates all windows in the current workspace. + */ +function activateAllWindows(app, monitor){ + + // First activate first window so workspace is switched if needed, + // then activate all other app windows in the current workspace. + let windows = getInterestingWindows(app, monitor); + let w = windows[0]; + Main.activateWindow(w); + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + + if (windows.length <= 0) + return; + + for (let i = windows.length - 1; i >= 0; i--){ + if (windows[i].get_workspace().index() == activeWorkspace){ + Main.activateWindow(windows[i]); + } + } +} + +function activateFirstWindow(app, monitor){ + + let windows = getInterestingWindows(app, monitor); + Main.activateWindow(windows[0]); +} + +function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { + // Store for a little amount of time last clicked app and its windows + // since the order changes upon window interaction + let MEMORY_TIME=3000; + + let app_windows = getInterestingWindows(app, monitor); + + if(shouldMinimize) + app_windows.push("MINIMIZE"); + + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId = Mainloop.timeout_add(MEMORY_TIME, resetRecentlyClickedApp); + + // If there isn't already a list of windows for the current app, + // or the stored list is outdated, use the current windows list. + if (!recentlyClickedApp || + recentlyClickedApp.get_id() != app.get_id() || + recentlyClickedAppWindows.length != app_windows.length || + recentlyClickedAppMonitorIndex != monitor.index) { + recentlyClickedApp = app; + recentlyClickedAppWindows = app_windows; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = monitor.index; + } + + if (reversed) { + recentlyClickedAppIndex--; + if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; + } else { + recentlyClickedAppIndex++; + } + let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; + + if(recentlyClickedAppWindows[index] === "MINIMIZE") + minimizeWindow(app, true, monitor); + else + Main.activateWindow(recentlyClickedAppWindows[index]); +} + +function resetRecentlyClickedApp() { + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId=0; + recentlyClickedApp =null; + recentlyClickedAppWindows = null; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = null; + + return false; +} + +function closeAllWindows(app, monitor) { + let windows = getInterestingWindows(app, monitor); + for (let i = 0; i < windows.length; i++) + windows[i].delete(global.get_current_time()); +} + +// Filter out unnecessary windows, for instance +// nautilus desktop window. +function getInterestingWindows(app, monitor, isolateMonitors) { + let windows = app.get_windows().filter(function(w) { + return !w.skip_taskbar; + }); + + // When using workspace or monitor isolation, we filter out windows + // that are not in the current workspace or on the same monitor as the appicon + if (Me.settings.get_boolean('isolate-workspaces')) + windows = windows.filter(function(w) { + return w.get_workspace().index() == Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + }); + + if (monitor && Me.settings.get_boolean('multi-monitors') && (isolateMonitors || Me.settings.get_boolean('isolate-monitors'))) { + windows = windows.filter(function(w) { + return w.get_monitor() == monitor.index; + }); + } + + return windows; +} + +function cssHexTocssRgba(cssHex, opacity) { + var bigint = parseInt(cssHex.slice(1), 16); + var r = (bigint >> 16) & 255; + var g = (bigint >> 8) & 255; + var b = bigint & 255; + + return 'rgba(' + [r, g, b].join(',') + ',' + opacity + ')'; +} + +function getIconPadding(monitorIndex) { + let panelSize = PanelSettings.getPanelSize(Me.settings, monitorIndex); + let padding = Me.settings.get_int('appicon-padding'); + let availSize = panelSize - Taskbar.MIN_ICON_SIZE - panelSize % 2; + + if (padding * 2 > availSize) { + padding = availSize * .5; + } + + return padding; +} + +/** + * Extend AppMenu (AppIconMenu for pre gnome 41) + * + * - set popup arrow side based on taskbar orientation + * - Add close windows option based on quitfromdash extension + * (https://github.com/deuill/shell-extension-quitfromdash) + */ + +var taskbarSecondaryMenu = Utils.defineClass({ + Name: 'DashToPanel.SecondaryMenu', + Extends: (AppDisplay.AppMenu || AppDisplay.AppIconMenu), + ParentConstrParams: [[0]], + + _init: function(source, panel) { + // Damm it, there has to be a proper way of doing this... + // As I can't call the parent parent constructor (?) passing the side + // parameter, I overwite what I need later + this.callParent('_init', source); + + let side = panel.getPosition(); + // Change the initialized side where required. + this._arrowSide = side; + this._boxPointer._arrowSide = side; + this._boxPointer._userArrowSide = side; + }, + + // helper function for the quit windows abilities + _closeWindowInstance: function(metaWindow) { + metaWindow.delete(global.get_current_time()); + }, + + _dtpRedisplay: function(parentFunc) { + this.callParent(parentFunc); + + // Remove "Show Details" menu item + if(!Me.settings.get_boolean('secondarymenu-contains-showdetails')) { + let existingMenuItems = this._getMenuItems(); + for(let idx in existingMenuItems) { + if(existingMenuItems[idx].actor.label_actor.text == _("Show Details")) { + this.box.remove_child(existingMenuItems[idx].actor); + if(existingMenuItems[idx-1] instanceof PopupMenu.PopupSeparatorMenuItem) + this.box.remove_child(existingMenuItems[idx-1].actor); + break; + } + } + } + + // prepend items from the appMenu (for native gnome apps) + if(Me.settings.get_boolean('secondarymenu-contains-appmenu')) { + let appMenu = this._source.app.menu; + if(appMenu) { + let remoteMenu = new imports.ui.remoteMenu.RemoteMenu(this._source.actor, this._source.app.menu, this._source.app.action_group); + let appMenuItems = remoteMenu._getMenuItems(); + for(var i = 0, l = appMenuItems.length || 0; i < l; ++i) { + let menuItem = appMenuItems[i]; + let labelText = menuItem.actor.label_actor.text; + if(labelText == _("New Window") || labelText == _("Quit")) + continue; + + if(menuItem instanceof PopupMenu.PopupSeparatorMenuItem) + continue; + + // this ends up getting called multiple times, and bombing due to the signal id's being invalid + // on a 2nd pass. disconnect the base handler and attach our own that wraps the id's in if statements + menuItem.disconnect(menuItem._popupMenuDestroyId) + menuItem._popupMenuDestroyId = menuItem.connect('destroy', Lang.bind(this, function(menuItem) { + if(menuItem._popupMenuDestroyId) { + menuItem.disconnect(menuItem._popupMenuDestroyId); + menuItem._popupMenuDestroyId = 0; + } + if(menuItem._activateId) { + menuItem.disconnect(menuItem._activateId); + menuItem._activateId = 0; + } + if(menuItem._activeChangeId) { + menuItem.disconnect(menuItem._activeChangeId); + menuItem._activeChangeId = 0; + } + if(menuItem._sensitiveChangeId) { + menuItem.disconnect(menuItem._sensitiveChangeId); + menuItem._sensitiveChangeId = 0; + } + this.disconnect(menuItem._parentSensitiveChangeId); + if (menuItem == this._activeMenuItem) + this._activeMenuItem = null; + })); + + menuItem.actor.get_parent().remove_child(menuItem.actor); + if(menuItem instanceof PopupMenu.PopupSubMenuMenuItem) { + let newSubMenuMenuItem = new PopupMenu.PopupSubMenuMenuItem(labelText); + let appSubMenuItems = menuItem.menu._getMenuItems(); + for(let appSubMenuIdx in appSubMenuItems){ + let subMenuItem = appSubMenuItems[appSubMenuIdx]; + subMenuItem.actor.get_parent().remove_child(subMenuItem.actor); + newSubMenuMenuItem.menu.addMenuItem(subMenuItem); + } + this.addMenuItem(newSubMenuMenuItem, i); + } else + this.addMenuItem(menuItem, i); + } + + if(i > 0) { + let separator = new PopupMenu.PopupSeparatorMenuItem(); + this.addMenuItem(separator, i); + } + } + } + + // quit menu + let app = this._source.app; + let window = this._source.window; + let count = window ? 1 : getInterestingWindows(app).length; + if ( count > 0) { + this._appendSeparator(); + let quitFromTaskbarMenuText = ""; + if (count == 1) + quitFromTaskbarMenuText = _("Quit"); + else + quitFromTaskbarMenuText = _("Quit") + ' ' + count + ' ' + _("Windows"); + + this._quitfromTaskbarMenuItem = this._appendMenuItem(quitFromTaskbarMenuText); + this._quitfromTaskbarMenuItem.connect('activate', Lang.bind(this, function() { + let app = this._source.app; + let windows = window ? [window] : app.get_windows(); + for (i = 0; i < windows.length; i++) { + this._closeWindowInstance(windows[i]) + } + })); + } + } +}); +Signals.addSignalMethods(taskbarSecondaryMenu.prototype); +adjustMenuRedisplay(taskbarSecondaryMenu.prototype); + +/** + * This function is used for extendDashItemContainer + */ +function ItemShowLabel() { + if (!this._labelText) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.get_transformed_position(); + let node = this.label.get_theme_node(); + + let itemWidth = this.allocation.x2 - this.allocation.x1; + let itemHeight = this.allocation.y2 - this.allocation.y1; + + let labelWidth = this.label.get_width(); + let labelHeight = this.label.get_height(); + + let position = this._dtpPanel.getPosition(); + let labelOffset = node.get_length('-x-offset'); + + // From TaskbarItemContainer + if (this._getIconAnimationOffset) + labelOffset += this._getIconAnimationOffset(); + + let xOffset = Math.floor((itemWidth - labelWidth) / 2); + let x = stageX + xOffset + let y = stageY + (itemHeight - labelHeight) * .5; + + switch(position) { + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + break; + case St.Side.BOTTOM: + y = stageY - labelHeight - labelOffset; + break; + case St.Side.LEFT: + x = stageX + labelOffset + itemWidth; + break; + case St.Side.RIGHT: + x = stageX - labelWidth - labelOffset; + break; + } + + // keep the label inside the screen border + // Only needed for the x coordinate. + + // Leave a few pixel gap + let gap = LABEL_GAP; + let monitor = Main.layoutManager.findMonitorForActor(this); + if ( x - monitor.x < gap) + x += monitor.x - x + labelOffset; + else if ( x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth -( monitor.x + monitor.width) + gap; + + this.label.set_position(Math.round(x), Math.round(y)); + + let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; + + if (duration > 1) { + duration /= 1000; + } + + Utils.animate(this.label, { + opacity: 255, + time: duration, + transition: 'easeOutQuad', + }); +}; + +/** + * A wrapper class around the ShowAppsIcon class. + * + * - Pass settings to the constructor + * - set label position based on dash orientation (Note, I am reusing most machinery of the appIcon class) + * - implement a popupMenu based on the AppIcon code (Note, I am reusing most machinery of the appIcon class) + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this pattern where the real showAppsIcon object is encaptulated, and a reference to it will be properly wired upon + * use of this class in place of the original showAppsButton. + * + */ +var ShowAppsIconWrapper = Utils.defineClass({ + Name: 'DashToPanel.ShowAppsIconWrapper', + + _init: function(dtpPanel) { + this.realShowAppsIcon = new Dash.ShowAppsIcon(); + + Utils.wrapActor(this.realShowAppsIcon); + Utils.wrapActor(this.realShowAppsIcon.toggleButton); + + /* the variable equivalent to toggleButton has a different name in the appIcon class + (actor): duplicate reference to easily reuse appIcon methods */ + this.actor = this.realShowAppsIcon.toggleButton; + this.realShowAppsIcon.show(false); + + // Re-use appIcon methods + this._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; + this._setPopupTimeout = AppDisplay.AppIcon.prototype._setPopupTimeout; + this._onKeyboardPopupMenu = AppDisplay.AppIcon.prototype._onKeyboardPopupMenu; + + // No action on clicked (showing of the appsview is controlled elsewhere) + this._onClicked = Lang.bind(this, function(actor, button) { + this._removeMenuTimeout(); + }); + + this.actor.connect('leave-event', Lang.bind(this, this._onLeaveEvent)); + this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); + this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent)); + this.actor.connect('clicked', Lang.bind(this, this._onClicked)); + this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu)); + + this._menu = null; + this._menuManager = new PopupMenu.PopupMenuManager(this.actor); + this._menuTimeoutId = 0; + + this.realShowAppsIcon._dtpPanel = dtpPanel; + Taskbar.extendDashItemContainer(this.realShowAppsIcon); + + let customIconPath = Me.settings.get_string('show-apps-icon-file'); + + this.realShowAppsIcon.icon.createIcon = function(size) { + this._iconActor = new St.Icon({ icon_name: 'view' + (Config.PACKAGE_VERSION < '3.20' ? '' : '-app') + '-grid-symbolic', + icon_size: size, + style_class: 'show-apps-icon', + track_hover: true }); + + if (customIconPath) { + this._iconActor.gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(customIconPath) }); + } + + return this._iconActor; + }; + + this._changedShowAppsIconId = Me.settings.connect('changed::show-apps-icon-file', () => { + customIconPath = Me.settings.get_string('show-apps-icon-file'); + this.realShowAppsIcon.icon._createIconTexture(this.realShowAppsIcon.icon.iconSize); + }); + + this._changedAppIconPaddingId = Me.settings.connect('changed::appicon-padding', () => this.setShowAppsPadding()); + this._changedAppIconSidePaddingId = Me.settings.connect('changed::show-apps-icon-side-padding', () => this.setShowAppsPadding()); + + this.setShowAppsPadding(); + }, + + _onButtonPress: function(_actor, event) { + let button = event.get_button(); + if (button == 1) { + this._setPopupTimeout(); + } else if (button == 3) { + this.popupMenu(); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + }, + + _onLeaveEvent: function(_actor, _event) { + this.actor.fake_release(); + this._removeMenuTimeout(); + }, + + _onTouchEvent: function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) + this._setPopupTimeout(); + + return Clutter.EVENT_PROPAGATE; + }, + + _onMenuPoppedDown: function() { + this._menu.sourceActor = this.actor; + this.actor.sync_hover(); + this.emit('menu-state-changed', false); + }, + + setShowAppsPadding: function() { + let padding = getIconPadding(this.realShowAppsIcon._dtpPanel.monitor.index); + let sidePadding = Me.settings.get_int('show-apps-icon-side-padding'); + let isVertical = this.realShowAppsIcon._dtpPanel.checkIfVertical(); + + this.actor.set_style('padding:' + (padding + (isVertical ? sidePadding : 0)) + 'px ' + (padding + (isVertical ? 0 : sidePadding)) + 'px;'); + }, + + createMenu: function() { + if (!this._menu) { + this._menu = new MyShowAppsIconMenu(this.actor, this.realShowAppsIcon._dtpPanel); + this._menu.connect('open-state-changed', Lang.bind(this, function(menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function() { + this._menu.close(); + })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + this._menuManager.addMenu(this._menu); + } + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + this.createMenu(this.actor); + + //this.emit('menu-state-changed', true); + + this.actor.set_hover(true); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + shouldShowTooltip: function() { + return Me.settings.get_boolean('show-tooltip') && + (this.actor.hover && (!this._menu || !this._menu.isOpen)); + }, + + destroy: function() { + Me.settings.disconnect(this._changedShowAppsIconId); + Me.settings.disconnect(this._changedAppIconSidePaddingId); + Me.settings.disconnect(this._changedAppIconPaddingId); + + this.realShowAppsIcon.destroy(); + } +}); +Signals.addSignalMethods(ShowAppsIconWrapper.prototype); + +/** + * A menu for the showAppsIcon + */ +var MyShowAppsIconMenu = Utils.defineClass({ + Name: 'DashToPanel.ShowAppsIconMenu', + Extends: taskbarSecondaryMenu, + ParentConstrParams: [[0], [1]], + + _dtpRedisplay: function() { + this.removeAll(); + + // Only add menu entries for commands that exist in path + function _appendItem(obj, info) { + if (Utils.checkIfCommandExists(info.cmd[0])) { + let item = obj._appendMenuItem(_(info.title)); + + item.connect('activate', function() { + Util.spawn(info.cmd); + }); + return item; + } + + return null; + } + + function _appendList(obj, commandList, titleList) { + if (commandList.length != titleList.length) { + return; + } + + for (var entry = 0; entry < commandList.length; entry++) { + _appendItem(obj, { + title: titleList[entry], + cmd: commandList[entry].split(' ') + }); + } + } + + if (this.sourceActor != Main.layoutManager.dummyCursor) { + _appendItem(this, { + title: 'Power options', + cmd: ['gnome-control-center', 'power'] + }); + + _appendItem(this, { + title: 'Event logs', + cmd: ['gnome-logs'] + }); + + _appendItem(this, { + title: 'System', + cmd: ['gnome-control-center', 'info-overview'] + }); + + _appendItem(this, { + title: 'Device Management', + cmd: ['gnome-control-center', 'display'] + }); + + _appendItem(this, { + title: 'Disk Management', + cmd: ['gnome-disks'] + }); + + _appendList( + this, + Me.settings.get_strv('show-apps-button-context-menu-commands'), + Me.settings.get_strv('show-apps-button-context-menu-titles') + ) + + this._appendSeparator(); + } + + _appendItem(this, { + title: 'Terminal', + cmd: ['gnome-terminal'] + }); + + _appendItem(this, { + title: 'System monitor', + cmd: ['gnome-system-monitor'] + }); + + _appendItem(this, { + title: 'Files', + cmd: ['nautilus'] + }); + + _appendItem(this, { + title: 'Extensions', + cmd: ['gnome-shell-extension-prefs'] + }); + + _appendItem(this, { + title: 'Settings', + cmd: ['gnome-control-center', 'wifi'] + }); + + _appendList( + this, + Me.settings.get_strv('panel-context-menu-commands'), + Me.settings.get_strv('panel-context-menu-titles') + ) + + this._appendSeparator(); + + let lockTaskbarMenuItem = this._appendMenuItem(Me.settings.get_boolean('taskbar-locked') ? _('Unlock taskbar') : _('Lock taskbar')); + lockTaskbarMenuItem.connect('activate', () => { + Me.settings.set_boolean('taskbar-locked', !Me.settings.get_boolean('taskbar-locked')); + }); + + let settingsMenuItem = this._appendMenuItem(_('Dash to Panel Settings')); + settingsMenuItem.connect('activate', function () { + let command = ["gnome-shell-extension-prefs"]; + + if (Config.PACKAGE_VERSION > '3.36') { + command = ["gnome-extensions", "prefs"]; + } + + Util.spawn(command.concat([Me.metadata.uuid])); + }); + + if(this._source._dtpPanel) { + this._appendSeparator(); + let item = this._appendMenuItem(this._source._dtpPanel._restoreWindowList ? _('Restore Windows') : _('Show Desktop')); + item.connect('activate', Lang.bind(this._source._dtpPanel, this._source._dtpPanel._onShowDesktopButtonPress)); + } + } +}); +adjustMenuRedisplay(MyShowAppsIconMenu.prototype); + +function adjustMenuRedisplay(menuProto) { + menuProto[menuRedisplayFunc] = function() { this._dtpRedisplay(menuRedisplayFunc) }; +} + +var getIconContainerStyle = function(isVertical) { + let style = 'padding: '; + + if (Me.settings.get_boolean('group-apps')) { + style += (isVertical ? '0;' : '0 ' + DEFAULT_PADDING_SIZE + 'px;'); + } else { + style += (isVertical ? '' : '0 ') + DEFAULT_PADDING_SIZE + 'px;'; + } + + return style; +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js new file mode 100644 index 0000000..57d2f13 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js @@ -0,0 +1,89 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Config = imports.misc.config; +const ExtensionUtils = imports.misc.extensionUtils; +const Gettext = imports.gettext; +const Gio = imports.gi.Gio; + +/** + * initTranslations: + * @domain: (optional): the gettext domain to use + * + * Initialize Gettext to load translations from extensionsdir/locale. + * If @domain is not provided, it will be taken from metadata['gettext-domain'] + */ +function initTranslations(domain) { + let extension = ExtensionUtils.getCurrentExtension(); + + domain = domain || extension.metadata['gettext-domain']; + + // Check if this extension was built with "make zip-file", and thus + // has the locale files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell + let localeDir = extension.dir.get_child('locale'); + if (localeDir.query_exists(null)) + Gettext.bindtextdomain(domain, localeDir.get_path()); + else + Gettext.bindtextdomain(domain, Config.LOCALEDIR); +} + +/** + * getSettings: + * @schema: (optional): the GSettings schema id + * + * Builds and return a GSettings schema for @schema, using schema files + * in extensionsdir/schemas. If @schema is not provided, it is taken from + * metadata['settings-schema']. + */ +function getSettings(schema) { + let extension = ExtensionUtils.getCurrentExtension(); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Check if this extension was built with "make zip-file", and thus + // has the schema files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell (and therefore schemas are available + // in the standard folders) + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + else + schemaSource = GioSSS.get_default(); + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error('Schema ' + schema + ' could not be found for extension ' + + extension.metadata.uuid + '. Please check your installation.'); + + return new Gio.Settings({ + settings_schema: schemaObj + }); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js new file mode 100644 index 0000000..7ab80f2 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js @@ -0,0 +1,149 @@ +/* + * Dash-To-Panel extension for Gnome 3 + * Copyright 2016 Jason DeRose (jderose9) and Charles Gagnon (charlesg99) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const Lang = imports.lang; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const WindowManager = imports.ui.windowManager; +const ExtensionUtils = imports.misc.extensionUtils; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Me = ExtensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const PanelManager = Me.imports.panelManager; +const Utils = Me.imports.utils; + +const UBUNTU_DOCK_UUID = 'ubuntu-dock@ubuntu.com'; + +let panelManager; +let extensionChangedHandler; +let disabledUbuntuDock; +let extensionSystem = (Main.extensionManager || imports.ui.extensionSystem); + +function init() { + this._realHasOverview = Main.sessionMode.hasOverview; + + Convenience.initTranslations(Utils.TRANSLATION_DOMAIN); + + //create an object that persists until gnome-shell is restarted, even if the extension is disabled + Me.persistentStorage = {}; +} + +function enable() { + // The Ubuntu Dock extension might get enabled after this extension + extensionChangedHandler = extensionSystem.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === UBUNTU_DOCK_UUID && extension.state === 1) { + _enable(); + } + }); + + //create a global object that can emit signals and conveniently expose functionalities to other extensions + global.dashToPanel = {}; + Signals.addSignalMethods(global.dashToPanel); + + _enable(); +} + +function _enable() { + let ubuntuDock = Main.extensionManager ? + Main.extensionManager.lookup(UBUNTU_DOCK_UUID) : //gnome-shell >= 3.33.4 + ExtensionUtils.extensions[UBUNTU_DOCK_UUID]; + + if (ubuntuDock && ubuntuDock.stateObj && ubuntuDock.stateObj.dockManager) { + // Disable Ubuntu Dock + let extensionOrder = (extensionSystem.extensionOrder || extensionSystem._extensionOrder); + + Utils.getStageTheme().get_theme().unload_stylesheet(ubuntuDock.stylesheet); + ubuntuDock.stateObj.disable(); + disabledUbuntuDock = true; + ubuntuDock.state = 2; //ExtensionState.DISABLED + extensionOrder.splice(extensionOrder.indexOf(UBUNTU_DOCK_UUID), 1); + + //reset to prevent conflicts with the ubuntu-dock + if (panelManager) { + disable(true); + } + } + + if (panelManager) return; //already initialized + + Me.settings = Convenience.getSettings('org.gnome.shell.extensions.dash-to-panel'); + Me.desktopSettings = Convenience.getSettings('org.gnome.desktop.interface'); + + Main.layoutManager.startInOverview = !Me.settings.get_boolean('hide-overview-on-startup'); + + if (Me.settings.get_boolean('hide-overview-on-startup') && Main.layoutManager._startingUp) { + Main.sessionMode.hasOverview = false; + Main.layoutManager.connect('startup-complete', () => { + Main.sessionMode.hasOverview = this._realHasOverview + }); + } + + panelManager = new PanelManager.dtpPanelManager(); + + panelManager.enable(); + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(this, function() { + if(Me.settings.get_boolean('show-appmenu')) + Main.wm._toggleAppMenu(); + else + panelManager.primaryPanel.taskbar.popupFocusedAppSecondaryMenu(); + }), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP + ); +} + +function disable(reset) { + panelManager.disable(); + Me.settings.run_dispose(); + Me.desktopSettings.run_dispose(); + + delete Me.settings; + panelManager = null; + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(Main.wm, Main.wm._toggleAppMenu), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP + ); + + if (!reset) { + extensionSystem.disconnect(extensionChangedHandler); + delete global.dashToPanel; + + // Re-enable Ubuntu Dock if it was disabled by dash to panel + if (disabledUbuntuDock && Main.sessionMode.allowExtensions) { + (extensionSystem._callExtensionEnable || extensionSystem.enableExtension).call(extensionSystem, UBUNTU_DOCK_UUID); + } + } + + Main.sessionMode.hasOverview = this._realHasOverview; +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg new file mode 100644 index 0000000..977146b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg new file mode 100644 index 0000000..47aa802 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg new file mode 100644 index 0000000..80420fd --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js new file mode 100644 index 0000000..8fb1e97 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js @@ -0,0 +1,401 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Lang = imports.lang; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +var GrabHelper = imports.ui.grabHelper; +const Layout = imports.ui.layout; +const Main = imports.ui.main; +const OverviewControls = imports.ui.overviewControls; +const PointerWatcher = imports.ui.pointerWatcher; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +//timeout intervals +const CHECK_POINTER_MS = 200; +const CHECK_GRAB_MS = 400; +const POST_ANIMATE_MS = 50; +const MIN_UPDATE_MS = 250; + +//timeout names +const T1 = 'checkGrabTimeout'; +const T2 = 'limitUpdateTimeout'; +const T3 = 'postAnimateTimeout'; +const T4 = 'panelBoxClipTimeout'; + +var SIDE_CONTROLS_ANIMATION_TIME = OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / (OverviewControls.SIDE_CONTROLS_ANIMATION_TIME > 1 ? 1000 : 1); + +var Hold = { + NONE: 0, + TEMPORARY: 1, + PERMANENT: 2 +}; + +var Intellihide = Utils.defineClass({ + Name: 'DashToPanel.Intellihide', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this._panelBox = dtpPanel.panelBox; + this._panelManager = dtpPanel.panelManager; + this._proximityManager = this._panelManager.proximityManager; + this._holdStatus = Hold.NONE; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._intellihideChangedId = Me.settings.connect('changed::intellihide', () => this._changeEnabledStatus()); + this._intellihideOnlySecondaryChangedId = Me.settings.connect('changed::intellihide-only-secondary', () => this._changeEnabledStatus()); + + this.enabled = false; + this._changeEnabledStatus(); + }, + + enable: function() { + this.enabled = true; + this._monitor = this._dtpPanel.monitor; + this._animationDestination = -1; + this._pendingUpdate = false; + this._hoveredOut = false; + this._windowOverlap = false; + this._translationProp = 'translation_' + (this._dtpPanel.checkIfVertical() ? 'x' : 'y'); + + this._panelBox.translation_y = 0; + this._panelBox.translation_x = 0; + + this._setTrackPanel(true); + this._bindGeneralSignals(); + + if (Me.settings.get_boolean('intellihide-hide-from-windows')) { + this._proximityWatchId = this._proximityManager.createWatch( + this._panelBox.get_parent(), + Proximity.Mode[Me.settings.get_string('intellihide-behaviour')], + 0, 0, + overlap => { + this._windowOverlap = overlap; + this._queueUpdatePanelPosition(); + } + ); + } + + this._setRevealMechanism(); + this._queueUpdatePanelPosition(); + }, + + disable: function(reset) { + if (this._proximityWatchId) { + this._proximityManager.removeWatch(this._proximityWatchId); + } + + this._setTrackPanel(false); + + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + + this._removeRevealMechanism(); + + this._revealPanel(!reset); + + this.enabled = false; + }, + + destroy: function() { + Me.settings.disconnect(this._intellihideChangedId); + Me.settings.disconnect(this._intellihideOnlySecondaryChangedId); + + if (this.enabled) { + this.disable(); + } + }, + + toggle: function() { + this[this._holdStatus & Hold.PERMANENT ? 'release' : 'revealAndHold'](Hold.PERMANENT); + }, + + revealAndHold: function(holdStatus) { + if (this.enabled && !this._holdStatus) { + this._revealPanel(); + } + + this._holdStatus |= holdStatus; + }, + + release: function(holdStatus) { + this._holdStatus -= holdStatus; + + if (this.enabled && !this._holdStatus) { + this._queueUpdatePanelPosition(); + } + }, + + reset: function() { + this.disable(true); + this.enable(); + }, + + _changeEnabledStatus: function() { + let intellihide = Me.settings.get_boolean('intellihide'); + let onlySecondary = Me.settings.get_boolean('intellihide-only-secondary'); + let enabled = intellihide && !(this._dtpPanel.isPrimary && onlySecondary); + + if (this.enabled !== enabled) { + this[enabled ? 'enable' : 'disable'](); + } + }, + + _bindGeneralSignals: function() { + this._signalsHandler.add( + [ + this._dtpPanel.taskbar, + 'menu-closed', + () => this._panelBox.sync_hover() + ], + [ + Me.settings, + [ + 'changed::intellihide-use-pressure', + 'changed::intellihide-hide-from-windows', + 'changed::intellihide-behaviour', + 'changed::intellihide-pressure-threshold', + 'changed::intellihide-pressure-time' + ], + () => this.reset() + ], + [ + this._panelBox, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._dtpPanel.taskbar.previewMenu, + 'open-state-changed', + () => this._queueUpdatePanelPosition() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._queueUpdatePanelPosition() + ] + ); + }, + + _onHoverChanged: function() { + this._hoveredOut = !this._panelBox.hover; + this._queueUpdatePanelPosition(); + }, + + _setTrackPanel: function(enable) { + let trackedIndex = Main.layoutManager._findActor(this._panelBox); + let actorData = Main.layoutManager._trackedActors[trackedIndex] + + actorData.affectsStruts = !enable; + actorData.trackFullscreen = !enable; + + this._panelBox.track_hover = enable; + this._panelBox.reactive = enable; + this._panelBox.visible = enable ? enable : this._panelBox.visible; + + Main.layoutManager._queueUpdateRegions(); + }, + + _setRevealMechanism: function() { + if (global.display.supports_extended_barriers() && Me.settings.get_boolean('intellihide-use-pressure')) { + this._edgeBarrier = this._createBarrier(); + this._pressureBarrier = new Layout.PressureBarrier( + Me.settings.get_int('intellihide-pressure-threshold'), + Me.settings.get_int('intellihide-pressure-time'), + Shell.ActionMode.NORMAL + ); + this._pressureBarrier.addBarrier(this._edgeBarrier); + this._signalsHandler.add([this._pressureBarrier, 'trigger', () => this._queueUpdatePanelPosition(true)]); + } else { + this._pointerWatch = PointerWatcher.getPointerWatcher() + .addWatch(CHECK_POINTER_MS, (x, y) => this._checkMousePointer(x, y)); + } + }, + + _removeRevealMechanism: function() { + if (this._pointerWatch) { + PointerWatcher.getPointerWatcher()._removeWatch(this._pointerWatch); + } + + if (this._pressureBarrier) { + this._pressureBarrier.destroy(); + this._edgeBarrier.destroy(); + } + }, + + _createBarrier: function() { + let position = this._dtpPanel.geom.position; + let opts = { display: global.display }; + + if (this._dtpPanel.checkIfVertical()) { + opts.y1 = this._monitor.y; + opts.y2 = this._monitor.y + this._monitor.height; + opts.x1 = opts.x2 = this._monitor.x; + } else { + opts.x1 = this._monitor.x; + opts.x2 = this._monitor.x + this._monitor.width; + opts.y1 = opts.y2 = this._monitor.y; + } + + if (position == St.Side.TOP) { + opts.directions = Meta.BarrierDirection.POSITIVE_Y; + } else if (position == St.Side.BOTTOM) { + opts.y1 = opts.y2 = opts.y1 + this._monitor.height; + opts.directions = Meta.BarrierDirection.NEGATIVE_Y; + } else if (position == St.Side.LEFT) { + opts.directions = Meta.BarrierDirection.POSITIVE_X; + } else { + opts.x1 = opts.x2 = opts.x1 + this._monitor.width; + opts.directions = Meta.BarrierDirection.NEGATIVE_X; + } + + return new Meta.Barrier(opts); + }, + + _checkMousePointer: function(x, y) { + let position = this._dtpPanel.geom.position; + + if (!this._panelBox.hover && !Main.overview.visible && + ((position == St.Side.TOP && y <= this._monitor.y + 1) || + (position == St.Side.BOTTOM && y >= this._monitor.y + this._monitor.height - 1) || + (position == St.Side.LEFT && x <= this._monitor.x + 1) || + (position == St.Side.RIGHT && x >= this._monitor.x + this._monitor.width - 1)) && + ((x >= this._monitor.x && x < this._monitor.x + this._monitor.width) && + (y >= this._monitor.y && y < this._monitor.y + this._monitor.height))) { + this._queueUpdatePanelPosition(true); + } + }, + + _queueUpdatePanelPosition: function(fromRevealMechanism) { + if (!fromRevealMechanism && this._timeoutsHandler.getId(T2) && !Main.overview.visible) { + //unless this is a mouse interaction or entering/leaving the overview, limit the number + //of updates, but remember to update again when the limit timeout is reached + this._pendingUpdate = true; + } else if (!this._holdStatus) { + this._checkIfShouldBeVisible(fromRevealMechanism) ? this._revealPanel() : this._hidePanel(); + this._timeoutsHandler.add([T2, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + } + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdatePanelPosition(); + } + }, + + _checkIfShouldBeVisible: function(fromRevealMechanism) { + if (Main.overview.visibleTarget || this._dtpPanel.taskbar.previewMenu.opened || + this._panelBox.get_hover() || this._checkIfGrab()) { + return true; + } + + if (fromRevealMechanism) { + let mouseBtnIsPressed = global.get_pointer()[2] & Clutter.ModifierType.BUTTON1_MASK; + + //the user is trying to reveal the panel + if (this._monitor.inFullscreen && !mouseBtnIsPressed) { + return Me.settings.get_boolean('intellihide-show-in-fullscreen'); + } + + return !mouseBtnIsPressed; + } + + if (!Me.settings.get_boolean('intellihide-hide-from-windows')) { + return this._panelBox.hover; + } + + return !this._windowOverlap; + }, + + _checkIfGrab: function() { + if (GrabHelper._grabHelperStack.some(gh => gh._owner == this._dtpPanel.panel.actor)) { + //there currently is a grab on a child of the panel, check again soon to catch its release + this._timeoutsHandler.add([T1, CHECK_GRAB_MS, () => this._queueUpdatePanelPosition()]); + + return true; + } + }, + + _revealPanel: function(immediate) { + if (!this._panelBox.visible) { + this._panelBox.visible = true; + this._dtpPanel.taskbar._shownInitially = false; + } + + this._animatePanel(0, immediate); + }, + + _hidePanel: function(immediate) { + let position = this._dtpPanel.geom.position; + let size = this._panelBox[position == St.Side.LEFT || position == St.Side.RIGHT ? 'width' : 'height']; + let coefficient = position == St.Side.TOP || position == St.Side.LEFT ? -1 : 1; + + this._animatePanel(size * coefficient, immediate); + }, + + _animatePanel: function(destination, immediate) { + let animating = Utils.isAnimating(this._panelBox, this._translationProp); + + if (!((animating && destination === this._animationDestination) || + (!animating && destination === this._panelBox[this._translationProp]))) { + //the panel isn't already at, or animating to the asked destination + if (animating) { + Utils.stopAnimations(this._panelBox); + } + + this._animationDestination = destination; + + if (immediate) { + this._panelBox[this._translationProp] = destination; + this._panelBox.visible = !destination; + } else { + let tweenOpts = { + //when entering/leaving the overview, use its animation time instead of the one from the settings + time: Main.overview.visible ? + SIDE_CONTROLS_ANIMATION_TIME : + Me.settings.get_int('intellihide-animation-time') * 0.001, + //only delay the animation when hiding the panel after the user hovered out + delay: destination != 0 && this._hoveredOut ? Me.settings.get_int('intellihide-close-delay') * 0.001 : 0, + transition: 'easeOutQuad', + onComplete: () => { + this._panelBox.visible = !destination; + Main.layoutManager._queueUpdateRegions(); + this._timeoutsHandler.add([T3, POST_ANIMATE_MS, () => this._queueUpdatePanelPosition()]); + } + }; + + tweenOpts[this._translationProp] = destination; + Utils.animate(this._panelBox, tweenOpts); + } + } + + this._hoveredOut = false; + }, +}); \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..8425f68f480807a0f85b51fb2a7812ad4271e863 GIT binary patch literal 23608 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..86da0901734cccffb3c9738613df62e63e2ac9d7 GIT binary patch literal 23744 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..7a5af2f7f27f2c1482a9cf432d36a09b553e7585 GIT binary patch literal 24908 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..70da5fa6ab1ea329c3990f04d36aa469bbbe7059 GIT binary patch literal 25001 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..f52e89a0a8e4dc2cab4c719004e41f0905b9e154 GIT binary patch literal 25609 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 LJEN#}&g=dQ{A}HA literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..2fd26daf6b08acccdb555c361278dd1daea97deb GIT binary patch literal 26323 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 D&K29v literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..c467e930366da9b24cce69ef6718e8a372680f0d GIT binary patch literal 28449 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..3bd1a468cae2b0bec1f917166717c28cb417707d GIT binary patch literal 27840 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 bzfGO#w`?@otzfvWcr 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

      + + + + +

      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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..eb02f6ca29afac1317edbeb293aeff3eb02e11bc GIT binary patch literal 31167 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 R2e;AZuJh!?z|_`x|39h5K7#-N literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..8b0241e11fa7877867eb26eb8b5e4a4177be3074 GIT binary patch literal 31187 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..22605ab84eb7d130864f90ef5bb71b614190e5b2 GIT binary patch literal 18243 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 X%{tQlJSOOy_L`pB&4(85_0InX=8t~Q literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9f4b0607d6d58cea00339b4b0820f1abf36c0798 GIT binary patch literal 3628 zcmai#U2Ggz6~`}7D40T_l+W;S18GQT#@ThNDs1df+jZKs3ASPvAyFZXcdzXs>zUQe ztX)SDaxgLl9zZFGe9$i{^#vXl$EGHU9r04}fY2TFfrmmL5JDjFK#_Pug5S9_yWUOO zFxor6d*{wQ_niMZclPzWZu_y~D$zbk`{~=18kPP#xN+^fO{sUn{qRHZAnb#q@DBK8 z_&)eG_-+_Lek$hn9=HfU2+zWI!KdMS;l+Y4LCts#ehR)?@C|r?@ttfgb_OAj)X{>E zLD_ernE!h5d=9>!=kvw*47{E3S@;q7UAPNA55?{^$WOh(?N0bR_!;;|_&NBW;QBVMfX3z55T{`Ps4vh@&9g&iTyoL<_|)N_dzJ@o`Aby042`v!!h`Cco@C` zhoOg&aTr0-^E#CEzlZ$PYuqHBze2J9Ux*887b0l52a4Wf1)qQi87I(#FG8`GL9zEb z{4D%CtiU^%d=x$m?}O*y-S8DCalHmbmw&)A6p^KV1`19LFW=%5{FzL&e3zfhtWrA;;ZCWd}?2kCry)meD0%(pK|rn3wwoq#i1wt+Y58{O(GJk|&^|$voU|{AvwcbK<-FfT zqr~0$M|zh7O3rB|^(NPTxeZT8%~TCn(_kS;1C!|S1rsj>W>F0{8peOw%aT{*IAR6Q(9sqs=6Z=JUlx zKQ&LL#q;2_(eq+_`lj^{1&KdhH`?FvbuLPEHHt&bj)iWrnp<}!PMM|YAgl%9Yn!1{(8$U5RF?CZ-F|31mf7Up+)I_w1 zrSX{=buyTpOY?h|{mFch3t=XTo&Q~$sY!z>xegMKeyexf8YDy~S(74Eq9&u6bkUEE znrtQw6V}w^QkeQrR`lTHTriU!IiLqe)3`1iuDhWN{0Q$QsVVYW^qrbcFu6JToS1I( zW?oG#8vm4@ilVxjT56D)2!;H(I``-0m(=57&CCR$sVV3;>!}VBMX@FbThVGFj=q7G z-m#kZmG;ASsrH>TjVMmN6Ul5)^G2Gpi8mEhbl=3dchW2bV!?aJPfbM+l*)&^(ttN` zzb-#eDV6Unl}n|*<9?EQQ=EmQ?x#^)(e?#<)o$Bg($;OuZfW~7yOAy1m+fYDN$bI+ z9!*CzKkTRCPY2ZpPe*f6ziA%9QaIZr)83Tv=kcIDuIME0J8|s9*pBn%{!-s)#F+`% z8#O9g^gP(8`$2eESLggVG3n6bQ%Ai+JMW2)GbZ-N!fGUyU(tuAgS79f-ou7dk~=>U znOczQf&Nne1AP-O}!%a#?># zmo%?4J~A}Wo*EpwU%GBZX|P<_6P6?6cZlN3U&rnS0A#%T|HSdiIGdj*qQwx#V4v*m16+iTd` zA}Qx>OWp8H*=N|}W!gHX@^#r$wv}D98$BCoyPmDEE4FZ=rLt8qD&1^ZxiB{Ixy2jX z**Ui#`*&P<(>FA$H;9j@@-VtBvDw1+z{Ne#JPcwBFIX1$!==9h6Z`p z`QNhJZ=vc%JYPm7Cvu*dZigh=mHhEW_8s0^m0^#xFA~fJHebvm({DX%5Gr9 zZ6yibk>IA#s1M9B}q+}w4E-Sb{SMw@*sQSPhJo0H(4+BwPvxJ zcih63i=89P(MGK6a+;O>i7Uc9u1;3Ox%G^KLf;FRFOrqlkbD4EX-xMhq;oH>vr5u* zRq9=8xy3g`J{+5(26BnhNQu16bt$Rr(}e#N@4D(-r*jrd1kvu^B8;0il1-%II~#Q> ztH)~>lT${bC$n;9Z>Wqe*>7E-9IR^v Q%lTOop{XxdrTlaL57$VK9RL6T literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..defd1623eeab7c961de313a6a9568d703237c840 GIT binary patch literal 3009 zcmai#Pi$009LEPm(N#pjzxZ!JK`OlRwi3jpt+a(=X-hZkf<~js?AzJh>ArolnVGkx z8)EQah$hAuV`7LV7y~Cy9`K?ElZqE(OgQL4iSb}e^nxc39Q^)f-?j~Eoa~#=%)FW3 z{C?m0z1b@p*S^P4LOc)Q`CtuW6V$#D70QmajNJqdfSbVGU=ExBZwHTp>%o`6TR;Wk z#|)}l!3FRx@HOye@LljW@NC8lAV>dG@L}+B#;f2i^fzF0vNH@~h)rgk25H}7_WqS@ zyaC>U@mAJ91+GK?HSk{W4e&wm97uLQ2k~QwgczW%e^j`}_)$9#=tHN1KtIbs+7(8Qc!;0=IxA@NqB&N&mAT zma?xwiuXH^?Ee5#TvtHS?GKRRy#|uqHQ1c?-2~FSt>6P-2$Bv*K(ZTwWG@EEF9VYP zuY)_l^C0Erw;<))?;x%F3nabQpc(+zgXG8484rVG_j!=^e;K?RY=X4@H0bjI#E+dr z1(WO(5FxP7K*;Z729^u?zB}vPvpl-e*oNkPcxW%ufpWTE9zlcSq3?(a?MJ>*p);iN zB%YmkNK1-`G@$&VGKhyhOVW|fiu9#iCVxqr8}I~p=-lWGH{+pL`-S4|7t)w?CCy1E z`u-6z+lq(sgmQxNp9<;A#wt2>Y%FrBqnwhK&vm5fD7nDK+HEO}NFqtiSVh7qome(z zB0ejVlut!EpG8^NO^p zDmjg2+j&nWMMoRuq-D?PmSjFms<=q1yiC6Oo`tV$M%J9Kcqwg5!>8pUo6%5WM%Vcq zl=VurwS~B_pc38|iHun>mcmMIWh^5H!(6pQU3#}zQ7^#KT&>2Asd~fp>Q(kjy+uBR znl|45RhqGqgepB9C?5V_bNm`e2%Tt+gHV>0bj>XYBUvf6ZJAVAX)$r)WPuNt8mi_- zck$r~XJX=5?7KejQOvVWX6KrIBdiO`_!ev|oHhksigiU- zacpI2x@zeR=fgG|8bp$JRdk@M8+uTtqgb5OQygwkmZF7C`~3p9<^b%eBsV)XduYY$ z{9u@y(D+yqYzi3)oP^xnj)hA0^Qa+=m2TvCc{13yGLM|ANfR7OB26h@;QK1dQrwD=7a-SlgFB&f&Do)$J<8NjcBDfFjU*(A{+Q(SpdqHn9e_go@dx}GkbQM_Y3(z?*A z-Jiy_fiMu_@~$a5a_KD#5${gQtuqpLtK>*fh~Yh2-kQy|R6H*e%?|38 zSUMwnie$Q|%>NTG0E1bClEt#4slt2YEv^#(g|Zh#Z|7c=Y_2*lI`O>nF+)k@EELYX zpP1>Mg_Y$*QCB6BfZ`Aa E0npIy%>V!Z literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..f048587842d3e14c5bfb7e846390ca987b9a1257 GIT binary patch literal 22003 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9dc0b4de53fda377444cd399eec39f9ebf957e5e GIT binary patch literal 27502 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..3ce757e4d08a7e7e7348d82c930700560e66b5f5 GIT binary patch literal 9402 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 CR=S=5 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/.keep b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/.keep new file mode 100644 index 0000000..e69de29 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg new file mode 100644 index 0000000..41fce36 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg new file mode 100644 index 0000000..aa125be --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg new file mode 100644 index 0000000..fc2640d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg new file mode 100644 index 0000000..2e2ac62 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg new file mode 100644 index 0000000..2c82d74 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg new file mode 100644 index 0000000..cff31b1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg @@ -0,0 +1,35 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg new file mode 100644 index 0000000..d3eadd1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg new file mode 100644 index 0000000..4ca02dc --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg new file mode 100644 index 0000000..f6dfb02 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg new file mode 100644 index 0000000..731c0fd --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg new file mode 100644 index 0000000..c843522 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg new file mode 100644 index 0000000..763a380 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg new file mode 100644 index 0000000..42b8470 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg new file mode 100644 index 0000000..d69ae29 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg new file mode 100644 index 0000000..720fa18 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg new file mode 100644 index 0000000..b6b1393 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg new file mode 100644 index 0000000..4903fd2 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg new file mode 100644 index 0000000..6d15f88 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg new file mode 100644 index 0000000..b0037ad --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg new file mode 100644 index 0000000..985702d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg new file mode 100644 index 0000000..ad8d2a5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg new file mode 100644 index 0000000..7d03f0c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg new file mode 100644 index 0000000..ebbaa42 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg new file mode 100644 index 0000000..16e9d9e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg new file mode 100644 index 0000000..976ac04 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg new file mode 100644 index 0000000..7884f4e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg new file mode 100644 index 0000000..251fe3a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg @@ -0,0 +1,103 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg new file mode 100644 index 0000000..73bea1d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg new file mode 100644 index 0000000..2278c4e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg @@ -0,0 +1,92 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg new file mode 100644 index 0000000..a57017e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg new file mode 100644 index 0000000..b271af1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg new file mode 100644 index 0000000..d28b713 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg new file mode 100644 index 0000000..80449b8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg new file mode 100644 index 0000000..c518e65 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg new file mode 100644 index 0000000..5a34df5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg new file mode 100644 index 0000000..63f45e4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg new file mode 100644 index 0000000..a1e5380 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg new file mode 100644 index 0000000..0760fd0 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg new file mode 100644 index 0000000..190f2b7 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg new file mode 100644 index 0000000..d874f4b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg new file mode 100644 index 0000000..daba3ed --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg new file mode 100644 index 0000000..1a583a9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg new file mode 100644 index 0000000..de3118c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg new file mode 100644 index 0000000..6c40cec --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg new file mode 100644 index 0000000..f09fbc5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg new file mode 100644 index 0000000..307ee2c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg @@ -0,0 +1,118 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg new file mode 100644 index 0000000..2ca7f94 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg new file mode 100644 index 0000000..a23a9a9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg new file mode 100644 index 0000000..4bbe335 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg new file mode 100644 index 0000000..bd6251d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg new file mode 100644 index 0000000..21a7907 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg new file mode 100644 index 0000000..42b1780 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg new file mode 100644 index 0000000..7ce4ae4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg new file mode 100644 index 0000000..9924c84 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg new file mode 100644 index 0000000..e352453 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg new file mode 100644 index 0000000..0844542 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg new file mode 100644 index 0000000..55e657a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg new file mode 100644 index 0000000..96aa0fb --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg new file mode 100644 index 0000000..0554b40 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg new file mode 100644 index 0000000..2325b5d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg new file mode 100644 index 0000000..e48c0b9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg new file mode 100644 index 0000000..a346c66 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg new file mode 100644 index 0000000..a15c420 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg new file mode 100644 index 0000000..67553a2 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg new file mode 100644 index 0000000..b2aa610 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg new file mode 100644 index 0000000..b8b2284 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg new file mode 100644 index 0000000..d6c8cee --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg new file mode 100644 index 0000000..946bb65 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg new file mode 100644 index 0000000..a0a2b99 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg @@ -0,0 +1,18 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg new file mode 100644 index 0000000..8e59598 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg new file mode 100644 index 0000000..c1c819c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg new file mode 100644 index 0000000..c7c4a15 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg new file mode 100644 index 0000000..8273e6c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg new file mode 100644 index 0000000..82962c4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg new file mode 100644 index 0000000..169bb1a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg @@ -0,0 +1,138 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg new file mode 100644 index 0000000..02d87d9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg new file mode 100644 index 0000000..43a3cb5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg new file mode 100644 index 0000000..71052b3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg new file mode 100644 index 0000000..e8bf7d6 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg new file mode 100644 index 0000000..d4ce9d8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg new file mode 100644 index 0000000..cfaddfb --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg new file mode 100644 index 0000000..48cda14 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg new file mode 100644 index 0000000..bee800f --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg @@ -0,0 +1,88 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg new file mode 100644 index 0000000..9474a72 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg new file mode 100644 index 0000000..7da31b3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg new file mode 100644 index 0000000..3fbbae0 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg new file mode 100644 index 0000000..c646eae --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg new file mode 100644 index 0000000..7eddf2b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg new file mode 100644 index 0000000..08c3ba8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg new file mode 100644 index 0000000..1179af3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg @@ -0,0 +1,93 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg new file mode 100644 index 0000000..b87c15f --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg @@ -0,0 +1 @@ + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg new file mode 100644 index 0000000..09f7966 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg new file mode 100644 index 0000000..ba04343 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg new file mode 100644 index 0000000..27aa967 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg @@ -0,0 +1,1412 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg new file mode 100644 index 0000000..43e74e7 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg new file mode 100644 index 0000000..7e35c7b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + H: 2.5 x + 1/2 x + 1x + 1x + + 1x + + 1x + + + + + + + + + + + H: 2.5 x + + 1/2 x + + 1x + + 1x + + + + 1x + + + + 1x + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg new file mode 100644 index 0000000..b0037ad --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg new file mode 100644 index 0000000..985702d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg new file mode 100644 index 0000000..ad8d2a5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg new file mode 100644 index 0000000..7d03f0c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg new file mode 100644 index 0000000..56c7967 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg @@ -0,0 +1,287 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg new file mode 100644 index 0000000..ebbaa42 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg new file mode 100644 index 0000000..16e9d9e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg new file mode 100644 index 0000000..976ac04 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg new file mode 100644 index 0000000..7884f4e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg new file mode 100644 index 0000000..251fe3a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg @@ -0,0 +1,103 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg new file mode 100644 index 0000000..1179af3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg @@ -0,0 +1,93 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg new file mode 100644 index 0000000..41fce36 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg new file mode 100644 index 0000000..0a1afe7 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg @@ -0,0 +1,330 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg new file mode 100644 index 0000000..73bea1d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg new file mode 100644 index 0000000..2278c4e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg @@ -0,0 +1,92 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg new file mode 100644 index 0000000..a57017e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg new file mode 100644 index 0000000..0687ab4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg @@ -0,0 +1,312 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg new file mode 100644 index 0000000..b271af1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg new file mode 100644 index 0000000..e26d0b1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg @@ -0,0 +1,328 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + Exit To App + + + + Lock Outline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg new file mode 100644 index 0000000..2955da8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg new file mode 100644 index 0000000..077fcc7 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg @@ -0,0 +1,202 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg new file mode 100644 index 0000000..aa125be --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg new file mode 100644 index 0000000..d28b713 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg new file mode 100644 index 0000000..ff230a7 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg @@ -0,0 +1,45 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg new file mode 100644 index 0000000..46b2317 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg @@ -0,0 +1,87 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg new file mode 100644 index 0000000..013cc7c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg @@ -0,0 +1,227 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg new file mode 100644 index 0000000..80449b8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg new file mode 100644 index 0000000..c518e65 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg new file mode 100644 index 0000000..5a34df5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg new file mode 100644 index 0000000..fc2640d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg new file mode 100644 index 0000000..63f45e4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg new file mode 100644 index 0000000..a1e5380 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg new file mode 100644 index 0000000..0760fd0 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg new file mode 100644 index 0000000..190f2b7 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg new file mode 100644 index 0000000..d874f4b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg new file mode 100644 index 0000000..02caa74 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg @@ -0,0 +1,65 @@ + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg new file mode 100644 index 0000000..daba3ed --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg new file mode 100644 index 0000000..1a583a9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg new file mode 100644 index 0000000..de3118c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg new file mode 100644 index 0000000..c969ff2 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg @@ -0,0 +1,285 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg new file mode 100644 index 0000000..2eeaae6 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg @@ -0,0 +1,219 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg new file mode 100644 index 0000000..2e2ac62 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg new file mode 100644 index 0000000..6c40cec --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg new file mode 100644 index 0000000..2c82d74 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg new file mode 100644 index 0000000..447e292 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg new file mode 100644 index 0000000..f09fbc5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg new file mode 100644 index 0000000..307ee2c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg @@ -0,0 +1,118 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg new file mode 100644 index 0000000..2ca7f94 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg new file mode 100644 index 0000000..a23a9a9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg new file mode 100644 index 0000000..cff31b1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg @@ -0,0 +1,35 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg new file mode 100644 index 0000000..4bbe335 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg new file mode 100644 index 0000000..78c769b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg new file mode 100644 index 0000000..24067fd --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg @@ -0,0 +1,163 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg new file mode 100644 index 0000000..bd6251d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg new file mode 100644 index 0000000..21a7907 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg new file mode 100644 index 0000000..42b1780 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg new file mode 100644 index 0000000..09f7966 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg new file mode 100644 index 0000000..eab2c5c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg new file mode 100644 index 0000000..fc8dd05 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg new file mode 100644 index 0000000..020a8e3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg @@ -0,0 +1,322 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg new file mode 100644 index 0000000..7ce4ae4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg new file mode 100644 index 0000000..d3eadd1 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg new file mode 100644 index 0000000..501012f --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg @@ -0,0 +1,297 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg new file mode 100644 index 0000000..ba4c27e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg @@ -0,0 +1,290 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg new file mode 100644 index 0000000..9924c84 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg new file mode 100644 index 0000000..e352453 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg new file mode 100644 index 0000000..0844542 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg new file mode 100644 index 0000000..4ca02dc --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg new file mode 100644 index 0000000..1e85ea4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg new file mode 100644 index 0000000..1d75e16 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg new file mode 100644 index 0000000..15e9d51 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg @@ -0,0 +1,76 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg new file mode 100644 index 0000000..49311b4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg new file mode 100644 index 0000000..8a69a7b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg @@ -0,0 +1,384 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg new file mode 100644 index 0000000..47fae59 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg new file mode 100644 index 0000000..e146519 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg @@ -0,0 +1,298 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg new file mode 100644 index 0000000..f6dfb02 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg new file mode 100644 index 0000000..55e657a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg new file mode 100644 index 0000000..731c0fd --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg new file mode 100644 index 0000000..96aa0fb --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg new file mode 100644 index 0000000..0554b40 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg new file mode 100644 index 0000000..2325b5d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg new file mode 100644 index 0000000..e48c0b9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg new file mode 100644 index 0000000..a346c66 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg new file mode 100644 index 0000000..a15c420 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg new file mode 100644 index 0000000..13d524c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg new file mode 100644 index 0000000..8f94a84 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg @@ -0,0 +1,438 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg new file mode 100644 index 0000000..67553a2 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg new file mode 100644 index 0000000..c843522 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg new file mode 100644 index 0000000..763a380 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg new file mode 100644 index 0000000..b2aa610 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg new file mode 100644 index 0000000..42b8470 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg new file mode 100644 index 0000000..2d04fcf --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg @@ -0,0 +1,307 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg new file mode 100644 index 0000000..b8b2284 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg new file mode 100644 index 0000000..d69ae29 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg new file mode 100644 index 0000000..a2e9833 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg @@ -0,0 +1,610 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exit To App + + + + Lock Outline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg new file mode 100644 index 0000000..d6c8cee --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg new file mode 100644 index 0000000..946bb65 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg new file mode 100644 index 0000000..a0a2b99 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg @@ -0,0 +1,18 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg new file mode 100644 index 0000000..fae1077 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg @@ -0,0 +1,208 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg new file mode 100644 index 0000000..8e59598 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg new file mode 100644 index 0000000..c1c819c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg new file mode 100644 index 0000000..c7c4a15 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg new file mode 100644 index 0000000..fdd6224 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg new file mode 100644 index 0000000..5ccb02c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg @@ -0,0 +1,295 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg new file mode 100644 index 0000000..7acd64d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg @@ -0,0 +1,285 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg new file mode 100644 index 0000000..04f57e3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg @@ -0,0 +1,210 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg new file mode 100644 index 0000000..8273e6c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg new file mode 100644 index 0000000..720fa18 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg new file mode 100644 index 0000000..82962c4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg new file mode 100644 index 0000000..169bb1a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg @@ -0,0 +1,138 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg new file mode 100644 index 0000000..02d87d9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg new file mode 100644 index 0000000..43a3cb5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg new file mode 100644 index 0000000..71052b3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg new file mode 100644 index 0000000..e8bf7d6 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg new file mode 100644 index 0000000..ba1c723 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg @@ -0,0 +1,99 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg new file mode 100644 index 0000000..830e664 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg @@ -0,0 +1,543 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg new file mode 100644 index 0000000..d4ce9d8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg new file mode 100644 index 0000000..b5219b3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg @@ -0,0 +1,793 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg new file mode 100644 index 0000000..cfaddfb --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg new file mode 100644 index 0000000..48cda14 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg new file mode 100644 index 0000000..bee800f --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg @@ -0,0 +1,88 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg new file mode 100644 index 0000000..b6b1393 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg new file mode 100644 index 0000000..ff813d5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg @@ -0,0 +1,504 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg new file mode 100644 index 0000000..9474a72 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg new file mode 100644 index 0000000..7da31b3 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg new file mode 100644 index 0000000..3fbbae0 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg new file mode 100644 index 0000000..4903fd2 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg new file mode 100644 index 0000000..022435a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg new file mode 100644 index 0000000..c646eae --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg new file mode 100644 index 0000000..7eddf2b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg new file mode 100644 index 0000000..75ed8b9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg @@ -0,0 +1,392 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg new file mode 100644 index 0000000..f29c05d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg @@ -0,0 +1,86 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg new file mode 100644 index 0000000..08c3ba8 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg new file mode 100644 index 0000000..6d15f88 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg new file mode 100644 index 0000000..ff8584d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg @@ -0,0 +1,52 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets new file mode 100644 index 0000000..f2c8e16 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets @@ -0,0 +1,52 @@ +ArcMenu Style//rgba(53,53,53,0.987)//rgb(223,223,223)//rgb(32,32,32)//rgb(21,83,158)//rgba(255,255,255,1)//rgb(32,32,32)//9//1//5//12//24//false// +Simply Dark//rgba(28, 28, 28, 0.98)//rgba(211, 218, 227, 1)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Blue//rgb(25,31,34)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Light Blue//rgb(255,255,255)//rgb(51,51,51)//rgb(235,235,235)//rgba(189,230,251,0.9)//rgba(89,89,89,1)//rgba(189,230,251,0.9)//9//1//5//12//24//true// +Silk Desert//rgba(50,52,73,0.820946)//rgba(211, 218, 227, 1)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//11//0//0//0//0//false// +Breeze//rgb(237,237,243)//rgb(36,36,40)//rgba(63,62,64,0.246622)//rgba(61,174,235,0.55)//rgb(36,36,40)//rgb(210,210,215)//9//1//0//0//0//false// +Breeze Dark//rgb(49,53,61)//rgb(237,237,243)//rgba(63,62,64,0.246622)//rgba(61,174,235,0.55)//rgb(237,237,243)//rgb(65,69,73)//9//1//0//0//0//false// +Dark Blue 2//rgb(50,52,61)//rgb(211,217,227)//rgba(211,217,227,0.2)//rgb(81,149,226)//rgba(255,255,255,1)//rgba(211,217,227,0.5)//9//1//4//0//0//false// +Dark Orange//rgb(51,51,51)//rgb(226,224,221)//rgba(174,167,159,0.2)//rgb(233,84,32)//rgba(255,255,255,1)//rgba(233,84,32,0.5)//9//1//4//12//24//true// +Light Orange//rgb(246,246,245)//rgb(76,76,76)//rgba(51,51,51,0.2)//rgb(233,84,32)//rgba(114,114,114,1)//rgba(233,84,32,0.5)//9//1//4//12//24//true// +Blue Orange//rgb(44,62,80)//rgb(189,195,199)//rgba(189,195,199,0.2)//rgb(231,76,60)//rgba(227,233,237,1)//rgba(189,195,199,0.5)//9//1//4//0//0//false// +Light Purple//rgb(237,245,252)//rgb(39,45,45)//rgba(39,45,45,0.2)//rgba(144,112,164,0.5)//rgba(77,83,83,1)//rgba(144,112,164,0.5)//9//1//6//0//0//false// +Dark Green//rgb(27,34,36)//rgb(243,243,243)//rgba(46,149,130,0.2)//rgb(46,149,130)//rgba(255,255,255,1)//rgba(46,149,130,0.35)//9//1//6//0//0//true// +Gray//rgb(142,142,142)//rgb(255,255,255)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//11//0//0//0//0//false// +Terminal Green//rgba(28, 28, 28, 0.98)//rgb(17,164,40)//rgb(63,62,64)//rgba(17,164,40,0.641892)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Sky Clear//rgba(64,145,191,0.756757)//rgb(243,243,243)//rgb(63,62,64)//rgba(135,64,191,0.253378)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Ubi Purple//rgba(174,64,191,0.523649)//rgb(243,243,243)//rgb(63,62,64)//rgba(189,191,64,0.763514)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Shade//rgb(46,52,54)//rgb(186,189,182)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Red Shade//rgba(191,64,74,0.753378)//rgb(243,243,243)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Tilk Blue//rgba(74,179,228,0.716216)//rgb(243,243,243)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Green Blue//rgb(87,121,89)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Gray Blue//rgb(136,138,133)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Pastel//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgb(233,185,110)//rgb(173,127,168)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 2//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(191,64,190,0.344595)//rgb(114,159,207)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 3//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(64,137,191,0.358108)//rgb(78,154,6)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 4//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(64,191,70,0.307432)//rgb(196,160,0)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgb(233,185,110)//rgb(173,127,168)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 2//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(191,64,190,0.344595)//rgb(114,159,207)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 3//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(64,137,191,0.358108)//rgb(78,154,6)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 4//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(64,191,70,0.307432)//rgb(196,160,0)//rgb(63,62,64)//9//0//0//0//0//false// +Yellow Shade//rgb(196,160,0)//rgb(46,52,54)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Adapta//rgb(250,251,252)//rgb(34,45,50)//rgb(81,84,86)//rgba(0,150,136,0.121711)//rgba(72,83,88,1)//rgb(0,150,136)//11//0//8//12//24//true// +Adapta Nokto//rgb(38,50,56)//rgb(205,215,218)//rgb(38,50,56)//rgba(125,131,134,0.207237)//rgba(243,253,255,1)//rgb(0,188,212)//11//0//8//12//24//true// +Arc//rgb(245,246,247)//rgb(55,54,68)//rgba(82,148,226,0.903915)//rgba(56,55,68,0.0782918)//rgba(93,92,106,1)//rgb(82,148,226)//11//0//8//12//24//true// +Arc Dark//rgb(56,60,74)//rgb(188,195,205)//rgba(82,148,226,0.903915)//rgba(188,195,205,0.188612)//rgba(226,233,243,1)//rgb(82,148,226)//11//0//8//12//24//true// +Pop!_OS Dark//rgb(69,63,63)//rgb(188,185,183)//rgb(68,61,58)//rgba(250,164,26,0.885135)//rgba(226,223,221,1)//rgb(50,128,138)//11//0//8//12//24//true// +Pop!_OS//rgb(250,251,252)//rgb(87,79,74)//rgba(188,185,183,0.722973)//rgba(250,164,26,0.885135)//rgba(125,117,112,1)//rgb(72,185,199)//11//0//8//12//24//true// +McOS CTLina//rgba(243,243,243,0.841549)//rgb(32,32,32)//rgba(243,243,243,0.841549)//rgb(203,204,207)//rgba(70,70,70,1)//rgb(61,140,248)//11//0//8//12//24//true// +McOS CTLina Dark//rgba(47,47,46,0.873239)//rgb(198,194,194)//rgb(44,45,44)//rgb(37,87,214)//rgba(236,232,232,1)//rgb(37,87,214)//11//0//8//12//24//true// +Android Dark Blue//rgb(63,62,64)//rgb(243,243,243)//rgb(0,177,251)//rgba(237,250,12,0.35473)//rgba(255,255,255,1)//rgb(0,177,251)//11//0//4//12//24//true// +Android Light Blue//rgb(255,255,255)//rgb(63,62,64)//rgb(0,177,251)//rgba(237,250,12,0.35473)//rgba(101,100,102,1)//rgb(0,177,251)//11//0//4//12//24//true// +Android Light Green//rgb(255,255,255)//rgb(63,62,64)//rgb(4,149,90)//rgba(143,219,207,0.334459)//rgba(101,100,102,1)//rgb(237,250,12)//11//0//4//12//24//true// +Android Dark Green//rgb(46,52,54)//rgb(243,243,243)//rgb(4,149,90)//rgba(143,219,207,0.334459)//rgba(255,255,255,1)//rgb(237,250,12)//11//0//4//12//24//true// +Android Dark Yaru//rgb(46,52,54)//rgb(243,243,243)//rgb(189,86,53)//rgba(247,186,36,0.405405)//rgba(255,255,255,1)//rgb(189,86,53)//11//0//4//12//24//true// +Android Light Yaru//rgb(255,255,255)//rgb(63,62,64)//rgb(189,86,53)//rgba(247,186,36,0.405405)//rgba(101,100,102,1)//rgb(189,86,53)//11//0//4//12//24//true// +Adapta 4k Dark//rgb(49,59,67)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Adapta 4k Light//rgb(255,255,255)//rgb(46,52,54)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(84,90,92,1)//rgb(4,149,90)//11//1//4//12//24//true// +Neon Yellow Punk//rgb(49,59,67)//rgb(237,250,12)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(248,255,109,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Blue//rgba(49,59,67,0.841216)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Jade//rgba(24,81,58,0.875)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Amber//rgba(84,34,18,0.881757)//rgb(243,243,243)//rgb(247,186,36)//rgba(247,186,36,0.472973)//rgba(255,255,255,1)//rgb(247,186,36)//11//1//4//12//24//true// +Elegant Purple Haze//rgba(41,1,31,0.881757)//rgb(243,243,243)//rgba(112,8,67,0.425676)//rgba(112,8,67,0.425676)//rgba(255,255,255,1)//rgb(176,52,139)//11//0//4//12//24//true// diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuButton.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuButton.js new file mode 100644 index 0000000..ba9c387 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuButton.js @@ -0,0 +1,875 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Clutter, GLib, GObject, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; +const Util = imports.misc.util; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var DASH_TO_PANEL_UUID = 'dash-to-panel@jderose9.github.com'; +var DASH_TO_DOCK_UUID = 'dash-to-dock@micxgx.gmail.com'; +var UBUNTU_DOCK_UUID = 'ubuntu-dock@ubuntu.com'; + +var MenuButton = GObject.registerClass(class Arc_Menu_MenuButton extends PanelMenu.Button{ + _init(settings, arcMenuPlacement, panel, dashIndex) { + super._init(0.5, null, true); + this._settings = settings; + this._panel = panel; + this.menu.destroy(); + this.menu = null; + this.add_style_class_name('arc-menu-panel-menu'); + this.arcMenuPlacement = arcMenuPlacement; + this.tooltipShowing = false; + this.tooltipHidingID = null; + this.tooltipShowingID = null; + this.dtpNeedsRelease = false; + + let menuManagerParent; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL) + menuManagerParent = this._panel; + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + menuManagerParent = this; + + //Create Main Menus - ArcMenu and arcMenu's context menu + this.arcMenu = new ArcMenu(this, 0.5, St.Side.TOP); + this.arcMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.arcMenuContextMenu = new ArcMenuContextMenu(this, 0.5, St.Side.TOP); + this.arcMenuContextMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.menuManager = new PopupMenu.PopupMenuManager(menuManagerParent); + this.menuManager._changeMenu = (menu) => {}; + this.menuManager.addMenu(this.arcMenu); + this.menuManager.addMenu(this.arcMenuContextMenu); + + //Context Menus for applications and other menu items + this.contextMenuManager = new PopupMenu.PopupMenuManager(this); + this.contextMenuManager._changeMenu = (menu) => {}; + this.contextMenuManager._onMenuSourceEnter = (menu) =>{ + if (this.contextMenuManager.activeMenu && this.contextMenuManager.activeMenu != menu) + return Clutter.EVENT_STOP; + + return Clutter.EVENT_PROPAGATE; + } + + //Sub Menu Manager - Control all other popup menus + this.subMenuManager = new PopupMenu.PopupMenuManager(this); + this.subMenuManager._changeMenu = (menu) => {}; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget = new MW.MenuButtonWidget(); + this.x_expand = false; + this.y_expand = false; + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this._delegate = this; + this.menuButtonWidget = new MW.DashMenuButtonWidget(this, this._settings); + this.dash = this._panel._allDocks[dashIndex]; + this.style_class = 'dash-item-container'; + this.child = this.menuButtonWidget.actor; + this.icon = this.menuButtonWidget.icon; + this.label = this.menuButtonWidget.label; + this.container.showLabel = () => this.menuButtonWidget.showLabel(); + this.container.hideLabel = () => this.menuButtonWidget.hideLabel(); + this.container.toggleButton = this.menuButtonWidget.actor; + this.toggleButton = this.menuButtonWidget.actor; + this.container.setDragApp = () => {}; + this.arcMenuContextMenu.addExtensionSettings(this.arcMenuPlacement); + } + + //Add Menu Button Widget to Button + this.add_child(this.menuButtonWidget.actor); + } + + initiate(){ + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + //Dash to Panel Integration + this.dashToPanel = Main.extensionManager.lookup(DASH_TO_PANEL_UUID); + this.extensionChangedId = Main.extensionManager.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === DASH_TO_PANEL_UUID && extension.state === 1) { + this.dashToPanel = Main.extensionManager.lookup(DASH_TO_PANEL_UUID); + this.syncWithDashToPanel(); + } + if (extension.uuid === DASH_TO_PANEL_UUID && extension.state === 2) { + this.dashToPanel = null; + this.arcMenuContextMenu.removeExtensionSettings(); + this.updateArrowSide(St.Side.TOP); + if(this.dtpPostionChangedID>0 && this.extensionSettingsItem){ + this.extensionSettingsItem.disconnect(this.dtpPostionChangedID); + this.dtpPostionChangedID = 0; + } + } + }); + if(this.dashToPanel && this.dashToPanel.stateObj){ + this.syncWithDashToPanel(); + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + //Dash to Dock Integration + this.dtdPostionChangedID = this._panel._settings.connect('changed::dock-position', ()=> { + let side = this._panel._settings.get_enum('dock-position'); + this.updateArrowSide(side); + }); + } + + this._monitorsChangedId = Main.layoutManager.connect('monitors-changed', () => { + this.updateHeight(); + }); + + this._startupCompleteId = Main.layoutManager.connect('startup-complete', () => { + this.updateHeight(); + }); + + this.initiateRecentlyInstalledApps(); + this.setMenuPositionAlignment(); + + //Create Basic Layout + this.createLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.createLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + setDragApp(){ + } + + handleDragOver(source, _actor, _x, _y, _time) { + return imports.ui.dnd.DragMotionResult.NO_DROP; + } + + acceptDrop(source, _actor, _x, _y, _time) { + return false; + } + + syncWithDashToPanel(){ + this.arcMenuContextMenu.addExtensionSettings(this.arcMenuPlacement); + this.extensionSettingsItem = Utils.getSettings('org.gnome.shell.extensions.dash-to-panel', DASH_TO_PANEL_UUID); + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side); + let dashToPanelPositionSettings = 'panel-positions' + try{ + this.extensionSettingsItem.get_string(dashToPanelPositionSettings); + } catch(e){ + dashToPanelPositionSettings = 'panel-position' + } + this.dtpPostionChangedID = this.extensionSettingsItem.connect('changed::' + dashToPanelPositionSettings, ()=> { + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side); + }); + if(global.dashToPanel && global.dashToPanel.panels){ + global.dashToPanel.panels.forEach(p => { + if(p.panel === this._panel){ + this.dtpPanel = p; + } + }); + } + } + + initiateRecentlyInstalledApps(){ + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this._settings.get_boolean('disable-recently-installed-apps')) + return; + + this._appList = this.listAllApps(); + //Update Categories on 'installed-changed' event------------------------------------- + this._installedChangedId = appSys.connect('installed-changed', () => { + this._newAppList = this.listAllApps(); + + //Filter to find if a new application has been installed + let newApps = this._newAppList.filter(app => !this._appList.includes(app)); + + //A New Application has been installed + //Save it in settings + if(newApps.length){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + let newRecentApps = [...new Set(recentApps.concat(newApps))]; + this._settings.set_strv('recently-installed-apps', newRecentApps); + this.MenuLayout.reloadApplications(); + } + + this._appList = this._newAppList; + }); + } + + listAllApps(){ + let appList = appSys.get_installed().filter(appInfo => { + try { + appInfo.get_id(); // catch invalid file encodings + } catch (e) { + return false; + } + return appInfo.should_show(); + }); + return appList.map(app => app.get_id()); + } + + createMenuLayout(){ + this._menuInForcedLocation = false; + this.arcMenu.actor.style = null; + this.arcMenu.removeAll(); + this.section = new PopupMenu.PopupMenuSection(); + this.arcMenu.addMenuItem(this.section); + this.mainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL + }); + this.mainBox._delegate = this.mainBox; + this.section.actor.add_child(this.mainBox); + + this.MenuLayout = Utils.getMenuLayout(this, this._settings.get_enum('menu-layout')); + this.setMenuPositionAlignment(); + this.updateStyle(); + this.forceMenuLocation(); + this.updateHeight(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + reloadMenuLayout(){ + this._menuInForcedLocation = false; + + this.MenuLayout.destroy(); + this.MenuLayout = null; + + this.arcMenu.actor.style = null; + + this.MenuLayout = Utils.getMenuLayout(this, this._settings.get_enum('menu-layout')); + + this.setMenuPositionAlignment(); + this.updateStyle(); + this.forceMenuLocation(); + this.updateHeight(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + setMenuPositionAlignment(){ + let layout = this._settings.get_enum('menu-layout'); + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + let arrowAlignment = (this._settings.get_int('menu-position-alignment') / 100); + if(layout != Constants.MenuLayout.RUNNER){ + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER){ + this.arcMenuContextMenu._arrowAlignment = arrowAlignment + this.arcMenu._arrowAlignment = arrowAlignment + this.arcMenuContextMenu._boxPointer.setSourceAlignment(.5); + this.arcMenu._boxPointer.setSourceAlignment(.5); + } + else if(this.dashToPanel && this.dashToPanel.stateObj){ + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side, false); + } + else{ + this.updateArrowSide(St.Side.TOP, false); + } + } + else{ + this.updateArrowSide(St.Side.TOP, false); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER){ + this.arcMenuContextMenu._arrowAlignment = arrowAlignment + this.arcMenuContextMenu._boxPointer.setSourceAlignment(.5); + } + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(layout != Constants.MenuLayout.RUNNER){ + let side = this._panel._settings.get_enum('dock-position'); + this.updateArrowSide(side, false); + } + else{ + this.updateArrowSide(St.Side.TOP, false); + } + } + } + + updateArrowSide(side, setAlignment = true){ + let arrowAlignment; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget.updateArrowIconSide(side); + if(side === St.Side.RIGHT || side === St.Side.LEFT) + arrowAlignment = 1.0; + else + arrowAlignment = 0.5; + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + arrowAlignment = 0.5; + + this.arcMenuContextMenu._arrowSide = side; + this.arcMenuContextMenu._boxPointer._arrowSide = side; + this.arcMenuContextMenu._boxPointer._userArrowSide = side; + this.arcMenuContextMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenuContextMenu._arrowAlignment = arrowAlignment; + this.arcMenuContextMenu._boxPointer._border.queue_repaint(); + + this.arcMenu._arrowSide = side; + this.arcMenu._boxPointer._arrowSide = side; + this.arcMenu._boxPointer._userArrowSide = side; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = arrowAlignment; + this.arcMenu._boxPointer._border.queue_repaint(); + + if(setAlignment) + this.setMenuPositionAlignment(); + } + + forceMenuLocation(){ + let layout = this._settings.get_enum('menu-layout'); + let forcedMenuLocation = this._settings.get_enum('force-menu-location'); + if(layout === Constants.MenuLayout.RUNNER || layout === Constants.MenuLayout.RAVEN) + return; + + if(forcedMenuLocation === Constants.ForcedMenuLocation.OFF){ + if(!this._menuInForcedLocation) + return; + this.arcMenu.sourceActor = this; + this.arcMenu.focusActor = this; + this.arcMenu._boxPointer.setPosition(this, 0.5); + this.setMenuPositionAlignment(); + this._menuInForcedLocation = false; + return; + } + + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + + if(!this.dummyWidget){ + this.dummyWidget = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyWidget); + } + + if(!this._menuInForcedLocation){ + this.arcMenu.sourceActor = this.dummyWidget; + this.arcMenu.focusActor = this.dummyWidget; + this.arcMenu._boxPointer.setPosition(this.dummyWidget, 0.5); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px;"; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = 0.5; + this._menuInForcedLocation = true; + } + + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let rect = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY; + if(forcedMenuLocation === Constants.ForcedMenuLocation.TOP_CENTERED) + positionY = rect.y + this.rise; + else if(forcedMenuLocation === Constants.ForcedMenuLocation.BOTTOM_CENTERED) + positionY = rect.y + rect.height - this.rise; + this.dummyWidget.set_position(positionX, positionY); + } + + updateStyle(){ + let forcedMenuLocation = this._settings.get_enum('force-menu-location'); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + let layout = this._settings.get_enum('menu-layout'); + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + let gapAdjustment = this._settings.get_int('gap-adjustment'); + + this.arcMenu.actor.set_style_class_name(null); + this.arcMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + this.arcMenuContextMenu.actor.set_style_class_name(null); + this.arcMenuContextMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenuContextMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + if(layout === Constants.MenuLayout.RAVEN){ + this.MenuLayout?.updateStyle(); + return; + } + + if(removeMenuArrow){ + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px; -boxpointer-gap: " + gapAdjustment + "px;"; + this.arcMenu.box.style = "margin:0px;"; + } + else if(forcedMenuLocation === Constants.ForcedMenuLocation.OFF){ + this.arcMenu.actor.style = "-boxpointer-gap: " + gapAdjustment + "px;"; + this.arcMenu.box.style = null; + } + + this.MenuLayout?.updateStyle(); + } + + vfunc_event(event){ + if (event.type() === Clutter.EventType.BUTTON_PRESS){ + if(event.get_button() == 1){ + this.toggleMenu(); + } + else if(event.get_button() == 3){ + this.arcMenuContextMenu.toggle(); + } + } + else if(event.type() === Clutter.EventType.TOUCH_BEGIN){ + this.toggleMenu(); + } + else if(event.type() === Clutter.EventType.ENTER && this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this.menuButtonWidget.actor.add_style_pseudo_class('selected'); + this.menuButtonWidget._icon.add_style_pseudo_class('active'); + } + else if(event.type() === Clutter.EventType.LEAVE && this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + this.menuButtonWidget.actor.remove_style_pseudo_class('selected'); + this.menuButtonWidget._icon.remove_style_pseudo_class('active'); + } + } + return Clutter.EVENT_PROPAGATE; + } + + toggleMenu(){ + if(this.contextMenuManager.activeMenu) + this.contextMenuManager.activeMenu.toggle(); + if(this.subMenuManager.activeMenu) + this.subMenuManager.activeMenu.toggle(); + + this.forceMenuLocation(); + let layout = this._settings.get_enum('menu-layout'); + if(layout === Constants.MenuLayout.GNOME_OVERVIEW){ + if(this._settings.get_boolean('gnome-dash-show-applications')){ + Main.overview._overview._controls._toggleAppsPage(); + } + else + Main.overview.toggle(); + } + else if(!this.arcMenu.isOpen){ + if(layout === Constants.MenuLayout.RUNNER || layout === Constants.MenuLayout.RAVEN) + this.MenuLayout.updateLocation(); + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + if(this.dtpPanel){ + if(this.dtpPanel.intellihide?.enabled){ + this.dtpPanel.intellihide._revealPanel(true); + this.dtpPanel.intellihide.revealAndHold(1); + } + else if(!this.dtpPanel.panelBox.visible){ + this.dtpPanel.panelBox.visible = true; + this.dtpNeedsHiding = true; + } + } + else if(this._panel === Main.panel && !Main.layoutManager.panelBox.visible){ + Main.layoutManager.panelBox.visible = true; + this.mainPanelNeedsHiding = true; + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(this.dash.getDockState() === 0){ + this.dash._removeAnimations(); + this.dash._animateIn(0, 0); + } + } + this.arcMenu.toggle(); + if(this.arcMenu.isOpen && this.MenuLayout){ + if(this.MenuLayout.activeMenuItem && this.MenuLayout.layoutProperties.SupportsCategoryOnHover) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + else if(this.arcMenu.isOpen){ + this.arcMenu.toggle(); + } + } + + getActiveMenu(){ + if(this.contextMenuManager.activeMenu) + return this.contextMenuManager.activeMenu; + else if(this.subMenuManager.activeMenu) + return this.subMenuManager.activeMenu; + else if(this.arcMenu.isOpen) + return this.arcMenu; + else if(this.arcMenuContextMenu.isOpen) + return this.arcMenuContextMenu; + else + return null; + } + + toggleArcMenuContextMenu(){ + if(this.arcMenuContextMenu.isOpen) + this.arcMenuContextMenu.toggle(); + } + + updateHeight(){ + let layout = this._settings.get_enum('menu-layout'); + + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + let monitorWorkArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor); + + if(height > monitorWorkArea.height){ + height = (monitorWorkArea.height * 8) / 10; + } + + if(!(layout == Constants.MenuLayout.SIMPLE || layout == Constants.MenuLayout.SIMPLE_2 || layout == Constants.MenuLayout.RUNNER) && this.MenuLayout) + this.mainBox.style = `height: ${height}px`; + if(this.MenuLayout?.updateWidth) + this.MenuLayout.updateWidth(true); + } + + _onDestroy(){ + if (this._monitorsChangedId){ + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = null; + } + if (this._startupCompleteId){ + Main.layoutManager.disconnect(this._startupCompleteId); + this._startupCompleteId = null; + } + if(this.createLayoutID){ + GLib.source_remove(this.createLayoutID); + this.createLayoutID = null; + } + if(this.updateMenuLayoutID){ + GLib.source_remove(this.updateMenuLayoutID); + this.updateMenuLayoutID = null; + } + if(this.tooltipShowingID){ + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if(this.tooltipHidingID){ + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.extensionChangedId){ + Main.extensionManager.disconnect(this.extensionChangedId); + this.extensionChangedId = null; + } + if(this.dtpPostionChangedID && this.extensionSettingsItem){ + this.extensionSettingsItem.disconnect(this.dtpPostionChangedID); + this.dtpPostionChangedID = null; + } + if(this.dtdPostionChangedID && this._panel._settings){ + this._panel._settings.disconnect(this.dtdPostionChangedID); + this.dtdPostionChangedID = null; + } + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this.MenuLayout) + this.MenuLayout.destroy(); + if(this.arcMenu) + this.arcMenu.destroy(); + if(this.arcMenuContextMenu) + this.arcMenuContextMenu.destroy(); + if(this.dummyWidget) + this.dummyWidget.destroy(); + + super._onDestroy(); + } + + updateMenuLayout(){ + this.tooltipShowing = false; + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.MenuLayout){ + this.MenuLayout.destroy(); + this.MenuLayout = null; + } + this.updateMenuLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.updateMenuLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + loadExtraPinnedApps(){ + if(this.MenuLayout) + this.MenuLayout.loadExtraPinnedApps(); + } + + updateLocation(){ + if(this.MenuLayout && this.MenuLayout.updateLocation) + this.MenuLayout.updateLocation(); + } + + displayPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.displayPinnedApps(); + } + + loadPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.loadPinnedApps(); + } + + reload(){ + if(this.MenuLayout){ + this.reloadMenuLayout(); + } + } + + shouldLoadPinnedApps(){ + if(this.MenuLayout) + return this.MenuLayout.shouldLoadPinnedApps; + } + + setDefaultMenuView(){ + if(this.MenuLayout) + this.MenuLayout.setDefaultMenuView(); + } + + _onOpenStateChanged(menu, open) { + if(open){ + //Avoid Super L hotkey conflicts with Pop Shell extension by + //setting 'overlay-key' mode to Shell.ActionMode.ALL. + let hotKeyPos = this._settings.get_enum('menu-hotkey'); + if(hotKeyPos === Constants.HotKey.SUPER_L) + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.ALL); + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget.setActiveStylePseudoClass(true); + this.add_style_pseudo_class('active'); + + if(Main.panel.menuManager && Main.panel.menuManager.activeMenu) + Main.panel.menuManager.activeMenu.toggle(); + + if(this.dtpPanel && !this.dtpNeedsRelease){ + if(this.dtpPanel.intellihide?.enabled){ + this.dtpNeedsRelease = true; + } + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this.menuButtonWidget.hideLabel(); + if(this.dash._autohideIsEnabled || this.dash._intellihideIsEnabled){ + this.dtdNeedsHiding = true; + this.dash._autohideIsEnabled = false; + this.dash._intellihideIsEnabled = false; + } + this.menuButtonWidget.actor.add_style_pseudo_class('selected'); + this.menuButtonWidget._icon.add_style_pseudo_class('active'); + } + } + else{ + if(!this.arcMenu.isOpen){ + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + this.tooltipShowing = false; + if(this.activeTooltip){ + this.activeTooltip.hide(); + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + } + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + if(this.dtpPanel && this.dtpNeedsRelease && !this.dtpNeedsHiding){ + this.dtpNeedsRelease = false; + this.dtpPanel.intellihide?.release(1); + } + if(this.dtpPanel && this.dtpNeedsHiding){ + this.dtpNeedsHiding = false; + this.dtpPanel.panelBox.visible = false; + } + if(this.mainPanelNeedsHiding){ + Main.layoutManager.panelBox.visible = false; + this.mainPanelNeedsHiding = false; + } + this.menuButtonWidget.setActiveStylePseudoClass(false); + this.remove_style_pseudo_class('active'); + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + if(this.dtdNeedsHiding){ + let dtdSettings = Utils.getSettings('org.gnome.shell.extensions.dash-to-dock', DASH_TO_DOCK_UUID); + if(dtdSettings){ + this.dash._autohideIsEnabled = dtdSettings.get_boolean('autohide'); + this.dash._intellihideIsEnabled = dtdSettings.get_boolean('intellihide'); + } + this.dash._box.sync_hover(); + this.dash._updateDashVisibility(); + this.dtdNeedsHiding = false; + } + + this.menuButtonWidget.actor.remove_style_pseudo_class('selected'); + if(!this.menuButtonWidget.actor.hover) + this.menuButtonWidget._icon.remove_style_pseudo_class('active'); + } + } + } + } +}); + +var ArcMenu = class Arc_Menu_ArcMenu extends PopupMenu.PopupMenu{ + constructor(sourceActor, arrowAlignment, arrowSide) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this._menuButton = sourceActor; + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + this._boxPointer.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this._menuClosedID = this.connect('menu-closed', () => this._menuButton.setDefaultMenuView()); + this.connect('destroy', () => this._onDestroy()); + } + + open(animate){ + if(!this.isOpen) + this._menuButton.arcMenu.actor._muteInput = false; + super.open(animate); + } + + close(animate){ + if(this.isOpen){ + if(this._menuButton.contextMenuManager.activeMenu) + this._menuButton.contextMenuManager.activeMenu.toggle(); + if(this._menuButton.subMenuManager.activeMenu) + this._menuButton.subMenuManager.activeMenu.toggle(); + } + + super.close(animate); + } + + _onDestroy(){ + if(this._menuClosedID){ + this.disconnect(this._menuClosedID) + this._menuClosedID = null; + } + } +}; + +var ArcMenuContextMenu = class Arc_Menu_ArcMenuContextMenu extends PopupMenu.PopupMenu { + constructor(sourceActor, arrowAlignment, arrowSide) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this._menuButton = sourceActor; + this.extensionSettingsItem = false; + + this.actor.add_style_class_name('panel-menu'); + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + + this.addMenuItem(this.createQuickLinkItem(_("ArcMenu Settings"), Constants.PrefsVisiblePage.MAIN)); + + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.addMenuItem(separator); + + let item = new PopupMenu.PopupMenuItem(_("Settings Quick Links:"), { + activate: false, + reactive: false + }); + item.add_style_class_name("margin-box arcmenu-menu-item"); + this.addMenuItem(item); + + this.addMenuItem(this.createQuickLinkItem(_("Change Menu Layout"), Constants.PrefsVisiblePage.MENU_LAYOUT)); + this.addMenuItem(this.createQuickLinkItem(_("Layout Tweaks"), Constants.PrefsVisiblePage.LAYOUT_TWEAKS)); + this.addMenuItem(this.createQuickLinkItem(_("Customize Menu"), Constants.PrefsVisiblePage.CUSTOMIZE_MENU)); + this.addMenuItem(this.createQuickLinkItem(_("Button Appearance"), Constants.PrefsVisiblePage.BUTTON_APPEARANCE)); + + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.addMenuItem(separator); + + this.addMenuItem(this.createQuickLinkItem(_("About"), Constants.PrefsVisiblePage.ABOUT)); + } + + addExtensionSettings(arcMenuPlacement){ + if(!this.extensionSettingsItem){ + let extensionCommand, extensionName; + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + extensionName = _("Dash to Panel Settings"); + extensionCommand = 'gnome-extensions prefs ' + DASH_TO_PANEL_UUID; + } + else if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + let dashToDock = Main.extensionManager.lookup(DASH_TO_DOCK_UUID); + let ubuntuDash = Main.extensionManager.lookup(UBUNTU_DOCK_UUID); + if(dashToDock && dashToDock.stateObj && dashToDock.stateObj.dockManager){ + extensionName = _("Dash to Dock Settings"); + extensionCommand = 'gnome-extensions prefs ' + DASH_TO_DOCK_UUID; + } + if(ubuntuDash && ubuntuDash.stateObj && ubuntuDash.stateObj.dockManager){ + extensionName = _("Ubuntu Dock Settings"); + extensionCommand = 'gnome-control-center ubuntu'; + } + } + + let item = new PopupMenu.PopupMenuItem(_(extensionName)); + item.add_style_class_name("margin-box arcmenu-menu-item"); + item.connect('activate', ()=>{ + Util.spawnCommandLine(extensionCommand); + }); + this.addMenuItem(item, 1); + this.extensionSettingsItem = true; + } + } + + removeExtensionSettings(){ + let children = this._getMenuItems(); + children[1].destroy(); + this.extensionSettingsItem = false; + } + + createQuickLinkItem(title, prefsVisiblePage){ + let item = new PopupMenu.PopupMenuItem(_(title)); + item.add_style_class_name("margin-box arcmenu-menu-item"); + item.connect('activate', ()=>{ + this._settings.set_int('prefs-visible-page', prefsVisiblePage); + Util.spawnCommandLine(Constants.ArcMenuSettingsCommand); + }); + return item; + } +}; diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js new file mode 100644 index 0000000..c38431f --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js @@ -0,0 +1,3693 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); +const {Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Shell, St} = imports.gi; +const AccountsService = imports.gi.AccountsService; +const AppFavorites = imports.ui.appFavorites; +const BoxPointer = imports.ui.boxpointer; +const Constants = Me.imports.constants; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Signals = imports.signals; +const _SystemActions = imports.misc.systemActions; +const SystemActions = _SystemActions.getDefault(); +const Util = imports.misc.util; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; +const { loadInterfaceXML } = imports.misc.fileUtils; + +const ClocksIntegrationIface = loadInterfaceXML('org.gnome.Shell.ClocksIntegration'); +const ClocksProxy = Gio.DBusProxy.makeProxyWrapper(ClocksIntegrationIface); + +Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish'); +Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish'); + +const INDICATOR_ICON_SIZE = 18; +const USER_AVATAR_SIZE = 28; + +function activatePowerOption(powerType, arcMenu){ + arcMenu.itemActivated(BoxPointer.PopupAnimation.NONE); + if(powerType === Constants.PowerType.POWER_OFF) + SystemActions.activatePowerOff(); + else if(powerType === Constants.PowerType.RESTART) + SystemActions.activateRestart ? SystemActions.activateRestart() : SystemActions.activatePowerOff(); + else if(powerType === Constants.PowerType.LOCK) + SystemActions.activateLockScreen(); + else if(powerType === Constants.PowerType.LOGOUT) + SystemActions.activateLogout(); + else if(powerType === Constants.PowerType.SUSPEND) + SystemActions.activateSuspend(); + else if(powerType === Constants.PowerType.HYBRID_SLEEP) + Utils.activateHybridSleep(); + else if(powerType === Constants.PowerType.HIBERNATE) + Utils.activateHibernate(); +} + +var ApplicationContextItems = GObject.registerClass({ + Signals: { + 'close-context-menu': { }, + }, + +}, class Arc_Menu_ApplicationContextItems extends St.BoxLayout{ + _init(actor, app, menuLayout){ + super._init({ + vertical: true, + x_expand: true, + y_expand: true, + style_class: 'margin-box', + }); + this._menuLayout = menuLayout; + this._settings = menuLayout._settings; + this._menuButton = menuLayout.menuButton; + this._app = app; + this.sourceActor = actor; + this.layout = this._settings.get_enum('menu-layout'); + + this.discreteGpuAvailable = false; + this._switcherooNotifyId = global.connect('notify::switcheroo-control', + () => this._updateDiscreteGpuAvailable()); + this._updateDiscreteGpuAvailable(); + } + + set path(path){ + this._path = path; + } + + _updateDiscreteGpuAvailable() { + this._switcherooProxy = global.get_switcheroo_control(); + if (this._switcherooProxy) { + let prop = this._switcherooProxy.get_cached_property('HasDualGpu'); + this.discreteGpuAvailable = prop?.unpack() ?? false; + } else { + this.discreteGpuAvailable = false; + } + } + + closeMenus(){ + this.close(); + this._menuLayout.arcMenu.toggle(); + } + + close(){ + this.emit('close-context-menu'); + } + + rebuildItems(){ + this.destroy_all_children(); + if(this._app instanceof Shell.App){ + this.appInfo = this._app.get_app_info(); + let actions = this.appInfo.list_actions(); + + let windows = this._app.get_windows().filter( + w => !w.skip_taskbar + ); + + if (windows.length > 0){ + let item = new PopupMenu.PopupMenuItem(_("Current Windows:"), { + reactive: false, + can_focus: false + }); + item.actor.add_style_class_name('inactive'); + this.add_child(item); + + windows.forEach(window => { + let title = window.title ? window.title + : this._app.get_name(); + let item = this._appendMenuItem(title); + item.connect('activate', () => { + this.closeMenus(); + Main.activateWindow(window); + }); + }); + this._appendSeparator(); + } + + if (!this._app.is_window_backed()) { + if (this._app.can_open_new_window() && !actions.includes('new-window')) { + let newWindowItem = this._appendMenuItem(_("New Window")); + newWindowItem.connect('activate', () => { + this.closeMenus(); + this._app.open_new_window(-1); + }); + } + if (this.discreteGpuAvailable && this._app.state == Shell.AppState.STOPPED) { + const appPrefersNonDefaultGPU = this.appInfo.get_boolean('PrefersNonDefaultGPU'); + const gpuPref = appPrefersNonDefaultGPU + ? Shell.AppLaunchGpu.DEFAULT + : Shell.AppLaunchGpu.DISCRETE; + + this._onGpuMenuItem = this._appendMenuItem(appPrefersNonDefaultGPU + ? _('Launch using Integrated Graphics Card') + : _('Launch using Discrete Graphics Card')); + + this._onGpuMenuItem.connect('activate', () => { + this.closeMenus(); + this._app.launch(0, -1, gpuPref); + }); + } + + for (let i = 0; i < actions.length; i++) { + let action = actions[i]; + let item; + if(action === "empty-trash-inactive"){ + item = new PopupMenu.PopupMenuItem(this.appInfo.get_action_name(action), {reactive:false, can_focus:false}); + item.actor.add_style_class_name('inactive'); + this._appendSeparator(); + this.add_child(item); + } + else if(action === "empty-trash"){ + this._appendSeparator(); + item = this._appendMenuItem(this.appInfo.get_action_name(action)); + } + else{ + item = this._appendMenuItem(this.appInfo.get_action_name(action)); + } + + item.connect('activate', (emitter, event) => { + this.closeMenus(); + this._app.launch_action(action, event.get_time(), -1); + }); + } + + //If Trash Can, we don't want to add the rest of the entries below. + if(this.appInfo.get_string('Id') === "ArcMenu_Trash") + return false; + + let desktopIcons = Main.extensionManager.lookup("desktop-icons@csoriano"); + let desktopIconsNG = Main.extensionManager.lookup("ding@rastersoft.com"); + if((desktopIcons && desktopIcons.stateObj) || (desktopIconsNG && desktopIconsNG.stateObj)){ + this._appendSeparator(); + let fileDestination = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP); + let src = Gio.File.new_for_path(this.appInfo.get_filename()); + let dst = Gio.File.new_for_path(GLib.build_filenamev([fileDestination, src.get_basename()])); + let exists = dst.query_exists(null); + if(exists) { + let item = this._appendMenuItem(_("Delete Desktop Shortcut")); + item.connect('activate', () => { + if(src && dst){ + try { + dst.delete(null); + } catch (e) { + log(`Failed to delete shortcut: ${e.message}`); + } + } + this.close(); + }); + } + else { + let item = this._appendMenuItem(_("Create Desktop Shortcut")); + item.connect('activate', () => { + if(src && dst){ + try { + // copy_async() isn't introspectable :-( + src.copy(dst, Gio.FileCopyFlags.OVERWRITE, null, null); + this._markTrusted(dst); + } catch (e) { + log(`Failed to copy to desktop: ${e.message}`); + } + } + this.close(); + }); + } + } + + let canFavorite = global.settings.is_writable('favorite-apps'); + if (canFavorite) { + this._appendSeparator(); + let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._app.get_id()); + if (isFavorite) { + let item = this._appendMenuItem(_("Remove from Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.removeFavorite(this._app.get_id()); + this.close(); + }); + } else { + let item = this._appendMenuItem(_("Add to Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.addFavorite(this._app.get_id()); + this.close(); + }); + } + } + + let pinnedApps = this._settings.get_strv('pinned-app-list'); + let pinnedAppID = []; + + //filter pinnedApps list by every 3rd entry in list. 3rd entry contains an appID or command + for(let i = 2; i < pinnedApps.length; i += 3){ + pinnedAppID.push(pinnedApps[i]); + } + let isAppPinned = pinnedAppID.find((element) => { + return element == this._app.get_id(); + }); + + //if app is pinned and menulayout has PinnedApps category, show Unpin from ArcMenu entry + if(isAppPinned && this._menuLayout.hasPinnedApps) { + let item = this._appendMenuItem(_("Unpin from ArcMenu")); + item.connect('activate', ()=>{ + this.close(); + for(let i = 0; i < pinnedApps.length; i += 3){ + if(pinnedApps[i + 2] === this._app.get_id()){ + pinnedApps.splice(i, 3); + this._settings.set_strv('pinned-app-list', pinnedApps); + break; + } + } + }); + } + else if(this._menuLayout.hasPinnedApps) { + let item = this._appendMenuItem(_("Pin to ArcMenu")); + item.connect('activate', ()=>{ + this.close(); + pinnedApps.push(this.appInfo.get_display_name()); + pinnedApps.push(''); + pinnedApps.push(this._app.get_id()); + this._settings.set_strv('pinned-app-list',pinnedApps); + }); + } + + if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) { + this._appendSeparator(); + let item = this._appendMenuItem(_("Show Details")); + item.connect('activate', () => { + let id = this._app.get_id(); + let args = GLib.Variant.new('(ss)', [id, '']); + Gio.DBus.get(Gio.BusType.SESSION, null, (o, res) => { + let bus = Gio.DBus.get_finish(res); + bus.call('org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Actions', 'Activate', + GLib.Variant.new('(sava{sv})', + ['details', [args], null]), + null, 0, -1, null, null); + this.closeMenus(); + }); + }); + } + } + } + else if(this._path){ + let newWindowItem = this._appendMenuItem(_("Open Folder Location")); + newWindowItem.connect('activate', () => { + let file = Gio.File.new_for_path(this._path); + let context = global.create_app_launch_context(Clutter.get_current_event().get_time(), -1) + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(file.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + this.closeMenus(); + }); + } + else if(this._menuLayout.hasPinnedApps && this.sourceActor instanceof PinnedAppsMenuItem) { + let item = this._appendMenuItem(_("Unpin from ArcMenu")); + item.connect('activate', () => { + this.close(); + let pinnedApps = this._settings.get_strv('pinned-app-list'); + for(let i = 0; i < pinnedApps.length; i += 3){ + if(pinnedApps[i + 2] === this._app){ + pinnedApps.splice(i, 3); + this._settings.set_strv('pinned-app-list', pinnedApps); + break; + } + } + }); + } + } + + //_markTrusted function borrowed from + //https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/tree/master/extensions/apps-menu + async _markTrusted(file) { + let modeAttr = Gio.FILE_ATTRIBUTE_UNIX_MODE; + let trustedAttr = 'metadata::trusted'; + let queryFlags = Gio.FileQueryInfoFlags.NONE; + let ioPriority = GLib.PRIORITY_DEFAULT; + + try { + let info = await file.query_info_async(modeAttr, queryFlags, ioPriority, null); + + let mode = info.get_attribute_uint32(modeAttr) | 0o100; + info.set_attribute_uint32(modeAttr, mode); + info.set_attribute_string(trustedAttr, 'yes'); + await file.set_attributes_async(info, queryFlags, ioPriority, null); + + // Hack: force nautilus to reload file info + info = new Gio.FileInfo(); + info.set_attribute_uint64( + Gio.FILE_ATTRIBUTE_TIME_ACCESS, GLib.get_real_time()); + try { + await file.set_attributes_async(info, queryFlags, ioPriority, null); + } catch (e) { + log(`Failed to update access time: ${e.message}`); + } + } catch (e) { + log(`Failed to mark file as trusted: ${e.message}`); + } + } + + _appendSeparator() { + let separator = new ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.add_child(separator); + } + + _appendMenuItem(labelText) { + let item = new ArcMenuPopupBaseMenuItem(this._menuLayout); + this.label = new St.Label({ + text: _(labelText), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + item.add_child(this.label); + this.add_child(item); + return item; + } +}); + +var ApplicationContextMenu = class Arc_Menu_ApplicationContextMenu extends PopupMenu.PopupMenu { + constructor(actor, app, menuLayout){ + super(actor, 0.0, St.Side.TOP); + this._menuLayout = menuLayout; + this._settings = menuLayout._settings; + this._menuButton = menuLayout.menuButton; + this._app = app; + this.layout = this._settings.get_enum('menu-layout'); + this._boxPointer.setSourceAlignment(.20); + this._boxPointer._border.queue_repaint(); + this.blockSourceEvents = true; + Main.uiGroup.add_child(this.actor); + this._menuLayout.contextMenuManager.addMenu(this); + this.contextMenuItems = new ApplicationContextItems(actor, app, menuLayout); + this.contextMenuItems.connect('close-context-menu', () => this.toggle()); + this.contextMenuItems._delegate = this.contextMenuItems; + this.box.add_child(this.contextMenuItems); + this.sourceActor = actor; + this.sourceActor.connect("destroy", ()=> { + if(this.isOpen) + this.close(); + Main.uiGroup.remove_child(this.actor); + this.contextMenuItems.destroy(); + this.destroy(); + }); + } + + centerBoxPointerPosition(){ + this._boxPointer.setSourceAlignment(.50); + this._arrowAlignment = .5; + this._boxPointer._border.queue_repaint(); + } + + rightBoxPointerPosition(){ + this._arrowSide = St.Side.LEFT; + this._boxPointer._arrowSide = St.Side.LEFT; + this._boxPointer._userArrowSide = St.Side.LEFT; + this._boxPointer.setSourceAlignment(.50); + this._arrowAlignment = .5; + this._boxPointer._border.queue_repaint(); + } + + set path(path){ + this.contextMenuItems.path = path; + } + + open(animate){ + if(this._menuLayout.searchResults && this.sourceActor !== this._menuLayout.searchResults.getTopResult()) + this._menuLayout.searchResults.getTopResult()?.remove_style_pseudo_class('active'); + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + this._menuButton.tooltipShowing = false; + } + if(this.sourceActor.tooltip){ + this.sourceActor.tooltip.hide(); + this._menuButton.tooltipShowing = false; + } + + super.open(animate); + } + + close(animate){ + super.close(animate); + if(this.sourceActor instanceof ArcMenuButtonItem) + this.sourceActor.sync_hover(); + else{ + this.sourceActor.active = false; + } + + this.sourceActor.sync_hover(); + this.sourceActor.hovered = this.sourceActor.hover; + } + + rebuildItems(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + if(customStyle){ + this.actor.style_class = 'arc-menu-boxpointer'; + this.actor.add_style_class_name('arc-menu'); + } + else{ + this.actor.style_class = 'popup-menu-boxpointer'; + this.actor.add_style_class_name('popup-menu'); + } + + this.contextMenuItems.rebuildItems(); + } + + _onKeyPress(actor, event) { + return Clutter.EVENT_PROPAGATE; + } +}; + +var ArcMenuPopupBaseMenuItem = GObject.registerClass({ + Properties: { + 'active': GObject.ParamSpec.boolean('active', 'active', 'active', + GObject.ParamFlags.READWRITE, + false), + 'hovered': GObject.ParamSpec.boolean('hovered', 'hovered', 'hovered', + GObject.ParamFlags.READWRITE, + false), + 'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive', + GObject.ParamFlags.READWRITE, + true), + }, + Signals: { + 'activate': { param_types: [Clutter.Event.$gtype] }, + }, + +}, class Arc_Menu_PopupBaseMenuItem extends St.BoxLayout{ + _init(menuLayout, params){ + params = imports.misc.params.parse(params, { + reactive: true, + activate: true, + hover: true, + style_class: null, + can_focus: true, + }); + super._init({ style_class: 'popup-menu-item arcmenu-menu-item', + reactive: params.reactive, + track_hover: params.reactive, + can_focus: params.can_focus, + accessible_role: Atk.Role.MENU_ITEM + }); + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this.hasContextMenu = false; + this._delegate = this; + this._menuLayout = menuLayout; + this.arcMenu = this._menuLayout.arcMenu; + this.shouldShow = true; + this._parent = null; + this._active = false; + this._activatable = params.reactive && params.activate; + this._sensitive = true; + + this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' }); + this.add_child(this._ornamentLabel); + + this.x_align = Clutter.ActorAlign.FILL; + this.x_expand = true; + + if (!this._activatable) + this.add_style_class_name('popup-inactive-menu-item'); + + if (params.style_class) + this.add_style_class_name(params.style_class); + + if (params.reactive && params.hover) + this.bind_property('hover', this, 'hovered', GObject.BindingFlags.SYNC_CREATE); + + if(params.hover) + this.actor.connect('notify::hover', this._onHover.bind(this)); + + this.arcMenuOpenStateChangeID = this.arcMenu.connect('open-state-changed', (menu, open) =>{ + if(!open) + this.cancelPopupTimeout(); + }); + + let textureCache = St.TextureCache.get_default(); + let iconThemeChangedId = textureCache.connect('icon-theme-changed', this._updateIcon.bind(this)); + this.connect('destroy', () => { + textureCache.disconnect(iconThemeChangedId); + this._onDestroy(); + }); + } + + _updateIcon() { + if(!this._iconBin || !this.createIcon) + return; + + let icon = this.createIcon(); + this._iconBin.set_child(icon); + } + + get actor() { + return this; + } + + get active(){ + return this._active; + } + + set active(active) { + if(this.isDestroyed) + return; + let activeChanged = active != this.active; + if(activeChanged){ + this._active = active; + if(active){ + if(this._menuLayout.activeMenuItem !== this) + this._menuLayout.activeMenuItem = this; + this.remove_style_class_name('selected'); + this.add_style_pseudo_class('active'); + if(this.can_focus) + this.grab_key_focus(); + } + else{ + this.remove_style_pseudo_class('active'); + this.remove_style_class_name('selected'); + } + this.notify('active'); + } + } + + set hovered(hover) { + let hoverChanged = hover != this.hovered; + if(hoverChanged){ + let isActiveStyle = this.get_style_pseudo_class()?.includes('active') + if(hover && !isActiveStyle){ + this.add_style_class_name('selected'); + } + else{ + this.remove_style_class_name('selected'); + } + } + } + + setShouldShow(){ + //If a saved shortcut link is a desktop app, check if currently installed. + //Do NOT display if application not found. + if(this._command.endsWith(".desktop") && !Shell.AppSystem.get_default().lookup_app(this._command)){ + this.shouldShow = false; + } + } + + _onHover() { + if(this.tooltip === undefined && this.actor.hover && this.label){ + let description = this.description; + if(this._app) + description = this._app.get_description(); + Utils.createTooltip(this._menuLayout, this, this.label, description, this._displayType ? this._displayType : -1); + } + } + + vfunc_button_press_event(){ + let event = Clutter.get_current_event(); + this.pressed = false; + if(event.get_button() == 1){ + this._menuLayout._blockActivateEvent = false; + this.pressed = true; + if(this.hasContextMenu) + this.contextMenuTimeOut(); + } + else if(event.get_button() == 3){ + this.pressed = true; + } + this.active = true; + return Clutter.EVENT_PROPAGATE; + } + + vfunc_button_release_event(){ + let event = Clutter.get_current_event(); + if(event.get_button() == 1 && !this._menuLayout._blockActivateEvent && this.pressed){ + this.pressed = false; + this.activate(event); + if(!(this instanceof CategoryMenuItem) && !(this instanceof ArcMenuButtonItem)) + this.active = false; + return Clutter.EVENT_STOP; + } + if(event.get_button() == 3 && this.pressed){ + this.pressed = false; + if(this.hasContextMenu) + this.popupContextMenu(); + else if(!(this instanceof CategoryMenuItem && !(this instanceof ArcMenuButtonItem))){ + this.active = false; + this.hovered = true; + } + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + vfunc_key_focus_in() { + super.vfunc_key_focus_in(); + if(!this.actor.hover) + this._menuLayout._keyFocusIn(this.actor); + this.active = true; + } + + vfunc_key_focus_out() { + if(this.contextMenu && this.contextMenu.isOpen){ + return; + } + super.vfunc_key_focus_out(); + this.active = false; + } + + activate(event) { + this.emit('activate', event); + } + + vfunc_key_press_event(keyEvent) { + if (!this._activatable) + return super.vfunc_key_press_event(keyEvent); + + let state = keyEvent.modifier_state; + + // if user has a modifier down (except capslock and numlock) + // then don't handle the key press here + state &= ~Clutter.ModifierType.LOCK_MASK; + state &= ~Clutter.ModifierType.MOD2_MASK; + state &= Clutter.ModifierType.MODIFIER_MASK; + + if (state) + return Clutter.EVENT_PROPAGATE; + + let symbol = keyEvent.keyval; + if ( symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter) { + this.activate(Clutter.get_current_event()); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + vfunc_touch_event(event){ + if(event.type == Clutter.EventType.TOUCH_END && !this._menuLayout._blockActivateEvent && this.pressed){ + this.remove_style_pseudo_class('active'); + this.activate(Clutter.get_current_event()); + this.pressed = false; + return Clutter.EVENT_STOP; + } + else if(event.type == Clutter.EventType.TOUCH_BEGIN && !this._menuLayout.contextMenuManager.activeMenu){ + this.pressed = true; + this._menuLayout._blockActivateEvent = false; + if(this.hasContextMenu) + this.contextMenuTimeOut(); + this.add_style_pseudo_class('active'); + } + else if(event.type == Clutter.EventType.TOUCH_BEGIN && this._menuLayout.contextMenuManager.activeMenu){ + this.pressed = false; + this._menuLayout._blockActivateEvent = false; + this._menuLayout.contextMenuManager.activeMenu.toggle(); + } + return Clutter.EVENT_PROPAGATE; + } + + contextMenuTimeOut(){ + this._popupTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 600, () => { + this.pressed = false; + this._popupTimeoutId = null; + if(this.hasContextMenu && this._menuLayout.arcMenu.isOpen && !this._menuLayout._blockActivateEvent) { + this.popupContextMenu(); + this._menuLayout.contextMenuManager.ignoreRelease(); + } + return GLib.SOURCE_REMOVE; + }); + } + + cancelPopupTimeout(){ + if(this._popupTimeoutId){ + GLib.source_remove(this._popupTimeoutId); + this._popupTimeoutId = null; + } + } + + _onDestroy(){ + this.isDestroyed = true; + if(this.arcMenuOpenStateChangeID){ + this.arcMenu.disconnect(this.arcMenuOpenStateChangeID); + this.arcMenuOpenStateChangeID = null; + } + } +}); + +var ArcMenuSeparator = GObject.registerClass( +class Arc_Menu_Separator extends PopupMenu.PopupBaseMenuItem { + _init(separatorLength, separatorAlignment, text) { + super._init({ + style_class: 'popup-separator-menu-item', + reactive: false, + can_focus: false, + }); + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + this.remove_child(this._ornamentLabel); + this.reactive = true; + this.label = new St.Label({ + text: text || '', + style: 'font-weight: bold' + }); + this.add_child(this.label); + this.label_actor = this.label; + + this.label.add_style_pseudo_class = () => { return false; }; + + this.label.connect('notify::text', + this._syncLabelVisibility.bind(this)); + this._syncLabelVisibility(); + + this._separator = new St.Widget({ + style_class: 'popup-separator-menu-item-separator separator-color-style', + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(this._separator); + if(separatorAlignment === Constants.SeparatorAlignment.HORIZONTAL){ + this.style = "padding: 0px 5px;" + if(separatorLength === Constants.SeparatorStyle.SHORT) + this._separator.style = "margin: 5px 45px;"; + else if(separatorLength === Constants.SeparatorStyle.MEDIUM) + this._separator.style = "margin: 5px 15px;"; + else if(separatorLength === Constants.SeparatorStyle.LONG) + this._separator.style = "margin: 0px 5px;"; + else if(separatorLength === Constants.SeparatorStyle.MAX) + this._separator.style = "margin: 0px; padding: 0px;"; + else if(separatorLength === Constants.SeparatorStyle.HEADER_LABEL){ + this._separator.style = "margin: 0px 20px 0px 10px;"; + this.style = "padding: 5px 15px;" + } + } + else if(separatorAlignment === Constants.SeparatorAlignment.VERTICAL){ + if(separatorLength === Constants.SeparatorStyle.ALWAYS_SHOW){ + this.style = "padding: 8px 4px;" + } + else{ + this._syncVisibility(); + this.vertSeparatorChangedID = this._settings.connect('changed::vert-separator', this._syncVisibility.bind(this)); + this.style = "padding: 0px 4px;" + } + + this._separator.style = "margin: 0px; width: 1px; height: -1px;"; + this.remove_child(this.label); + this.x_expand = this._separator.x_expand = true; + this.x_align = this._separator.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = this._separator.y_expand = true; + this.y_align = this._separator.y_align = Clutter.ActorAlign.FILL; + } + + this.connect('destroy', () => { + if(this.vertSeparatorChangedID){ + this._settings.disconnect(this.vertSeparatorChangedID); + this.vertSeparatorChangedID = null; + } + }); + } + + _syncLabelVisibility() { + this.label.visible = this.label.text != ''; + } + + _syncVisibility() { + this._separator.visible = this._settings.get_boolean('vert-separator'); + } +}); + +var ActivitiesMenuItem = GObject.registerClass(class Arc_Menu_ActivitiesMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _("Activities Overview"), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this.label); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + icon_name: 'view-fullscreen-symbolic', + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + } + + activate(event) { + this._menuLayout.arcMenu.toggle(); + Main.overview.show(); + super.activate(event); + } +}); + +var Tooltip = class Arc_Menu_Tooltip{ + constructor(menuLayout, sourceActor, title, description) { + this._menuButton = menuLayout.menuButton; + this._settings = this._menuButton._settings; + this.sourceActor = sourceActor; + if(this.sourceActor.tooltipLocation) + this.location = this.sourceActor.tooltipLocation; + else + this.location = Constants.TooltipLocation.BOTTOM; + let descriptionLabel; + this.actor = new St.BoxLayout({ + vertical: true, + style_class: 'dash-label tooltip-menu-item', + opacity: 0 + }); + + if(title){ + this.titleLabel = new St.Label({ + text: _(title), + style: description ? "font-weight: bold;" : null, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(this.titleLabel); + } + + if(description){ + descriptionLabel = new St.Label({ + text: description, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(descriptionLabel); + } + + global.stage.add_child(this.actor); + + this.actor.connect('destroy',()=>{ + if(this.destroyID){ + this.sourceActor.disconnect(this.destroyID); + this.destroyID = null; + } + if(this.activeID){ + this.sourceActor.disconnect(this.activeID); + this.activeID = null; + } + + if(this.hoverID){ + this.sourceActor.disconnect(this.hoverID); + this.hoverID = null; + } + if(this.toggleID){ + this._settings.disconnect(this.toggleID); + this.toggleID = null; + } + }) + this.activeID = this.sourceActor.connect('notify::active', ()=> this.setActive(this.sourceActor.active)); + this.destroyID = this.sourceActor.connect('destroy',this.destroy.bind(this)); + this.hoverID = this.sourceActor.connect('notify::hover', this._onHover.bind(this)); + this._useTooltips = ! this._settings.get_boolean('disable-tooltips'); + this.toggleID = this._settings.connect('changed::disable-tooltips', this.disableTooltips.bind(this)); + } + + setActive(active){ + if(!active) + this.hide(); + } + + disableTooltips() { + this._useTooltips = ! this._settings.get_boolean('disable-tooltips'); + } + + _onHover() { + if(this._useTooltips){ + if(this.sourceActor.hover){ + if(this._menuButton.tooltipShowing){ + this.show(); + this._menuButton.activeTooltip = this.actor; + } + else{ + this._menuButton.tooltipShowingID = GLib.timeout_add(0, 750, () => { + this.show(); + this._menuButton.tooltipShowing = true; + this._menuButton.activeTooltip = this.actor; + this._menuButton.tooltipShowingID = null; + return GLib.SOURCE_REMOVE; + }); + } + if(this._menuButton.tooltipHidingID){ + GLib.source_remove(this._menuButton.tooltipHidingID); + this._menuButton.tooltipHidingID = null; + } + } + else { + this.hide(); + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + } + this._menuButton.tooltipHidingID = GLib.timeout_add(0, 750, () => { + this._menuButton.tooltipShowing = false; + this._menuButton.activeTooltip = null; + this._menuButton.tooltipHidingID = null; + return GLib.SOURCE_REMOVE; + }); + } + } + } + + show() { + if(this._useTooltips){ + this.actor.opacity = 0; + this.actor.show(); + + let [stageX, stageY] = this.sourceActor.get_transformed_position(); + + let itemWidth = this.sourceActor.allocation.x2 - this.sourceActor.allocation.x1; + let itemHeight = this.sourceActor.allocation.y2 - this.sourceActor.allocation.y1; + + let labelWidth = this.actor.get_width(); + let labelHeight = this.actor.get_height(); + + let x, y; + let gap = 5; + + switch (this.location) { + case Constants.TooltipLocation.BOTTOM_CENTERED: + y = stageY + itemHeight + gap; + x = stageX + Math.floor((itemWidth - labelWidth) / 2); + break; + case Constants.TooltipLocation.TOP_CENTERED: + y = stageY - labelHeight - gap; + x = stageX + Math.floor((itemWidth - labelWidth) / 2); + break; + case Constants.TooltipLocation.BOTTOM: + y = stageY + itemHeight + gap; + x = stageX + gap; + break; + } + + // keep the label inside the screen + let monitor = Main.layoutManager.findMonitorForActor(this.sourceActor); + if (x - monitor.x < gap) + x += monitor.x - x + gap; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; + else if (y - monitor.y < gap) + y += monitor.y - y + gap; + else if (y + labelHeight > monitor.y + monitor.height - gap) + y -= y + labelHeight - (monitor.y + monitor.height) + gap; + + this.actor.set_position(x, y); + this.actor.ease({ + opacity: 255, + duration: Dash.DASH_ITEM_LABEL_SHOW_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + }); + } + } + + hide() { + if(this._useTooltips){ + this.actor.ease({ + opacity: 0, + duration: Dash.DASH_ITEM_LABEL_HIDE_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => this.actor.hide() + }); + } + } + + destroy() { + if (this._menuButton.tooltipShowingID) { + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + } + if (this._menuButton.tooltipHidingID) { + GLib.source_remove(this._menuButton.tooltipHidingID); + this._menuButton.tooltipHidingID = null; + } + if(this.toggleID>0){ + this._settings.disconnect(this.toggleID); + this.toggleID = 0; + } + if(this.hoverID>0){ + this.sourceActor.disconnect(this.hoverID); + this.hoverID = 0; + } + if(this._menuButton.activeTooltip = this.actor) + this._menuButton.activeTooltip = null; + + global.stage.remove_child(this.actor); + this.actor.destroy(); + } +}; + +var ArcMenuButtonItem = GObject.registerClass( + class Arc_Menu_ArcMenuButtonItem extends ArcMenuPopupBaseMenuItem { + _init(menuLayout, tooltipText, iconName, gicon) { + super._init(menuLayout); + this.style_class = 'popup-menu-item arc-menu-button'; + this._settings = this._menuLayout._settings; + this._menuLayout = menuLayout; + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + this.iconName = iconName; + this.gicon = gicon; + this.toggleMenuOnClick = true; + + if(tooltipText){ + this.tooltip = new Tooltip(this._menuLayout, this.actor, tooltipText); + this.tooltip.location = Constants.TooltipLocation.TOP_CENTERED; + this.tooltip.hide(); + } + + if(this.iconName !== null){ + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + } + } + + createIcon(overrideIconSize){ + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: this.gicon ? this.gicon : Gio.icon_new_for_string(this.iconName), + icon_size: overrideIconSize ? overrideIconSize : iconSize, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER + }); + } + + setIconSize(size){ + if(!this._iconBin) + return; + this._iconBin.set_child(this.createIcon(size)); + } + + activate(event){ + if(this.toggleMenuOnClick) + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +// Settings Button +var SettingsButton = GObject.registerClass(class Arc_Menu_SettingsButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Settings"), 'emblem-system-symbolic'); + } + activate(event) { + super.activate(event); + Util.spawnCommandLine('gnome-control-center'); + } +}); + +// Runner Layout Tweaks Button +var RunnerTweaksButton = GObject.registerClass(class Arc_Menu_RunnerTweaksButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Configure Runner"), 'emblem-system-symbolic'); + this.tooltip.location = Constants.TooltipLocation.BOTTOM_CENTERED; + } + activate(event) { + super.activate(event); + this._menuLayout._settings.set_int('prefs-visible-page', Constants.PrefsVisiblePage.RUNNER_TWEAKS); + Util.spawnCommandLine(Constants.ArcMenuSettingsCommand); + } +}); + +//'Insider' layout Pinned Apps hamburger button +var PinnedAppsButton = GObject.registerClass(class Arc_Menu_PinnedAppsButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Pinned Apps"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.togglePinnedAppsMenu(); + } +}); + +//'Windows' layout extras hamburger button +var ExtrasButton = GObject.registerClass(class Arc_Menu_ExtrasButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Extras"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.toggleExtrasMenu(); + } +}); + +//"Leave" Button with popupmenu that shows lock, power off, restart, etc +var LeaveButton = GObject.registerClass(class Arc_Menu_LeaveButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Leave"), 'system-shutdown-symbolic'); + this.toggleMenuOnClick = false; + this._menuLayout = menuLayout; + this.menuButton = menuLayout.menuButton; + this._settings = menuLayout._settings; + this._createLeaveMenu(); + } + + _createLeaveMenu(){ + this.leaveMenu = new PopupMenu.PopupMenu(this, 0.5 , St.Side.BOTTOM); + this.leaveMenu.blockSourceEvents = true; + let section = new PopupMenu.PopupMenuSection(); + this.leaveMenu.addMenuItem(section); + + let box = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + box._delegate = box; + + section.actor.add_child(box); + + box.add_child(this._menuLayout.createLabelRow(_("Session"))); + + this.lockItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.LOCK); + box.add_child(this.lockItem); + + let logOutItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.LOGOUT); + box.add_child(logOutItem); + + box.add_child(this._menuLayout.createLabelRow(_("System"))); + + Utils.canHybridSleep((canHybridSleep, needsAuth) => { + if(canHybridSleep){ + let sleepItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.HYBRID_SLEEP); + box.insert_child_at_index(sleepItem, 4); + } + }); + + Utils.canHibernate((canHibernate, needsAuth) => { + if(canHibernate){ + let hibernateItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.HIBERNATE); + box.insert_child_at_index(hibernateItem, 5); + } + }); + + let suspendItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.SUSPEND); + box.add_child(suspendItem); + + let restartItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.RESTART); + box.add_child(restartItem); + + let powerOffItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.POWER_OFF); + box.add_child(powerOffItem); + + this._menuLayout.subMenuManager.addMenu(this.leaveMenu); + this.leaveMenu.actor.hide(); + Main.uiGroup.add_child(this.leaveMenu.actor); + this.leaveMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.tooltip){ + this.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.active = false; + this.sync_hover(); + this.hovered = this.hover; + } + }); + } + + _onDestroy(){ + Main.uiGroup.remove_child(this.leaveMenu.actor); + this.leaveMenu.destroy(); + } + + activate(event) { + super.activate(event); + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.leaveMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.leaveMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + this.leaveMenu.toggle(); + } +}); + +//'Unity' layout categories hamburger button +var CategoriesButton = GObject.registerClass(class Arc_Menu_CategoriesButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Categories"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.toggleCategoriesMenu(); + } +}); + +var PowerButton = GObject.registerClass(class Arc_Menu_PowerButton extends ArcMenuButtonItem { + _init(menuLayout, powerType) { + super._init(menuLayout, Constants.PowerOptions[powerType].TITLE, Constants.PowerOptions[powerType].IMAGE); + this.powerType = powerType; + } + activate(event) { + activatePowerOption(this.powerType, this._menuLayout.arcMenu); + } +}); + +var PowerMenuItem = GObject.registerClass(class Arc_Menu_PowerMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, type) { + super._init(menuLayout); + this.powerType = type; + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(Constants.PowerOptions[this.powerType].TITLE), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this.label); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: Gio.icon_new_for_string(Constants.PowerOptions[this.powerType].IMAGE), + style_class: 'popup-menu-icon', + icon_size: iconSize, + }); + } + + activate(){ + activatePowerOption(this.powerType, this._menuLayout.arcMenu); + } +}); + +var PlasmaMenuItem = GObject.registerClass(class Arc_Menu_PlasmaMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, title, iconPath) { + super._init(menuLayout); + this.remove_child(this._ornamentLabel); + this._menuLayout = menuLayout; + this.tooltipLocation = Constants.TooltipLocation.BOTTOM_CENTERED; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.vertical = true; + this.name = "arc-menu-plasma-button"; + this.iconPath = iconPath; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(title), + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + + this.label.x_align = this.label.y_align = Clutter.ActorAlign.CENTER; + this.label.y_expand = true; + + this._iconBin.x_align = this._iconBin.y_align = Clutter.ActorAlign.CENTER; + this._iconBin.y_expand = true; + + this.label.get_clutter_text().set_line_wrap(true); + this.add_child(this.label); + this.actor.connect('notify::hover', this._onHover.bind(this)); + } + + createIcon(){ + return new St.Icon({ + gicon: Gio.icon_new_for_string(this.iconPath), + style_class: 'popup-menu-icon', + icon_size: Constants.MEDIUM_ICON_SIZE + }); + } + + _onHover(){ + if(this.tooltip === undefined && this.actor.hover && this.label){ + let description = null; + Utils.createTooltip(this._menuLayout, this, this.label, description, Constants.DisplayType.LIST); + } + let shouldHover = this._settings.get_boolean('plasma-enable-hover'); + if(shouldHover && this.actor.hover && !this.isActive){ + this.activate(Clutter.get_current_event()); + } + } + + set active(active) { + let activeChanged = active != this.active; + if(activeChanged){ + this._active = active; + if(active){ + this.add_style_class_name('selected'); + this._menuLayout.activeMenuItem = this; + if(this.can_focus) + this.grab_key_focus(); + } + else{ + this.remove_style_class_name('selected'); + } + this.notify('active'); + } + } + + setActive(active){ + if(active){ + this.isActive = true; + this.set_style_pseudo_class("active-item"); + } + else{ + this.isActive = false; + this.set_style_pseudo_class(null); + } + } + + activate(event){ + this._menuLayout.searchBox.clearWithoutSearchChangeEvent(); + this._menuLayout.clearActiveItem(); + this.setActive(true); + super.activate(event); + } +}); + +var PlasmaCategoryHeader = GObject.registerClass(class Arc_Menu_PlasmaCategoryHeader extends St.BoxLayout{ + _init(menuLayout) { + super._init({ + style_class: "popup-menu-item", + style: 'padding: 0px;', + reactive: true, + track_hover:true, + can_focus: true, + accessible_role: Atk.Role.MENU_ITEM + }); + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this.backButton = new ArcMenuPopupBaseMenuItem(this._menuLayout); + this.backButton.x_expand = false; + this.backButton.x_align = Clutter.ActorAlign.CENTER; + this.label = new St.Label({ + text: _("Applications"), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER, + style: 'font-weight: bold' + }); + + this.backButton.add_child(this.label); + + this.add_child(this.backButton); + this.backButton.connect("activate", () => this._menuLayout.displayCategories() ); + + this.categoryLabel = new St.Label({ + text: '', + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this.categoryLabel); + } + + setActiveCategory(categoryText){ + if(categoryText){ + this.categoryLabel.text = _(categoryText); + this.categoryLabel.show(); + } + else + this.categoryLabel.hide(); + } +}); + +var AllAppsButton = GObject.registerClass(class Arc_Menu_AllAppsButton extends ArcMenuButtonItem{ + _init(menuLayout) { + super._init(menuLayout, null, 'go-next-symbolic'); + this.setIconSize(Constants.EXTRA_SMALL_ICON_SIZE); + this.toggleMenuOnClick = false; + this.style = 'min-height: 28px; padding: 0px 8px;' + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.x_expand = true; + this.x_align = Clutter.ActorAlign.END; + this._label = new St.Label({ + text: _("All Apps"), + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.insert_child_at_index(this._label, 0); + } + + activate(event){ + super.activate(event); + this._menuLayout.displayAllApps(); + } +}); + +var BackButton = GObject.registerClass(class Arc_Menu_BackButton extends ArcMenuButtonItem{ + _init(menuLayout) { + super._init(menuLayout, null, 'go-previous-symbolic'); + this.setIconSize(Constants.EXTRA_SMALL_ICON_SIZE); + this.toggleMenuOnClick = false; + this.style = 'min-height: 28px; padding: 0px 8px;' + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.x_expand = true; + this.x_align = Clutter.ActorAlign.END; + this._label = new St.Label({ + text: _("Back"), + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this._label); + } + + activate(event){ + super.activate(event); + this._menuLayout.setDefaultMenuView(); + } +}); + +// Menu item to go back to category view +var BackMenuItem = GObject.registerClass(class Arc_Menu_BackMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin({ + x_expand: false, + x_align: Clutter.ActorAlign.START, + }); + this.add_child(this._iconBin); + + this._updateIcon(); + + let backLabel = new St.Label({ + text: _("Back"), + x_expand: false, + x_align: Clutter.ActorAlign.START, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(backLabel); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.MISC_ICON_SIZE); + + return new St.Icon({ + icon_name: 'go-previous-symbolic', + icon_size: iconSize, + }); + } + + activate(event) { + if(this._layout === Constants.MenuLayout.ARCMENU){ + //If the current page is inside a category and + //previous page was the categories page, + //go back to categories page + if(this._menuLayout.previousCategoryType === Constants.CategoryType.CATEGORIES_LIST && (this._menuLayout.activeCategoryType <= 4 || this._menuLayout.activeCategoryType instanceof GMenu.TreeDirectory)) + this._menuLayout.displayCategories(); + else + this._menuLayout.setDefaultMenuView(); + } + else if(this._layout === Constants.MenuLayout.TOGNEE) + this._menuLayout.setDefaultMenuView(); + super.activate(event); + } +}); + +// Menu item to view all apps +var ViewAllPrograms = GObject.registerClass(class Arc_Menu_ViewAllPrograms extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + let backLabel = new St.Label({ + text: _("All Applications"), + x_expand: false, + x_align: Clutter.ActorAlign.START, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(backLabel); + + this._iconBin = new St.Bin({ + x_expand: false, + x_align: Clutter.ActorAlign.START, + }); + this.add_child(this._iconBin); + this._updateIcon(); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.MISC_ICON_SIZE); + + return new St.Icon({ + icon_name: 'go-next-symbolic', + icon_size: iconSize, + x_align: Clutter.ActorAlign.START + }); + } + + activate(event) { + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS || defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + this._menuLayout.displayCategories(); + else + this._menuLayout.displayAllApps(); + super.activate(event); + } +}); + +var ShortcutMenuItem = GObject.registerClass(class Arc_Menu_ShortcutMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, name, icon, command, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + if(this._settings.get_enum('shortcut-icon-type') === Constants.CategoryIconType.FULL_COLOR) + this.add_style_class_name('regular-icons'); + else + this.add_style_class_name('symbolic-icons'); + this._command = command; + this._displayType = displayType; + this.isContainedInCategory = isContainedInCategory; + this.iconName = icon; + + //Check for default commands-------- + if(this._command == "ArcMenu_Software"){ + let softwareManager = Utils.findSoftwareManager(); + this._command = softwareManager ? softwareManager : 'ArcMenu_unfound.desktop'; + } + else if(this._command === "ArcMenu_Trash"){ + this.trash = new Me.imports.placeDisplay.Trash(this); + this._command = "ArcMenu_Trash"; + this._app = this.trash.getApp(); + } + if(!this._app) + this._app = Shell.AppSystem.get_default().lookup_app(this._command); + + if(this._app && icon === ''){ + let appIcon = this._app.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(appIcon instanceof St.Icon){ + this.iconName = appIcon.gicon.to_string(); + } + } + //------------------------------------- + + this.hasContextMenu = this._app ? true : false; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(name), y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this.layout = this._settings.get_enum('menu-layout'); + if(this.layout === Constants.MenuLayout.PLASMA && this._settings.get_boolean('apps-show-extra-details') && this._app){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionLabel = new St.Label({ + text: this._app.get_description(), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + if(this._app.get_description()) + labelBox.add_child(descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + else if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.remove_child(this.label); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + } + this.setShouldShow(); + } + + createIcon(){ + let iconSizeEnum; + if(this.isContainedInCategory) + iconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + else + iconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + iconSizeEnum = this._settings.get_enum('button-item-icon-size'); + defaultIconSize = LayoutProps.DefaultButtonsIconSize; + iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + } + else if(this._displayType === Constants.DisplayType.GRID){ + iconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(iconSizeEnum, defaultIconStyle); + } + + return new St.Icon({ + icon_name: this.iconName, + gicon: Gio.icon_new_for_string(this.iconName), + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + } + + popupContextMenu(){ + if(this._app && this.contextMenu == undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._displayType === Constants.DisplayType.GRID || this.layout === Constants.MenuLayout.UNITY || this.layout === Constants.MenuLayout.AZ) + this.contextMenu.centerBoxPointerPosition(); + else if(this.layout === Constants.MenuLayout.MINT || this.layout === Constants.MenuLayout.TOGNEE) + this.contextMenu.rightBoxPointerPosition(); + if(this._path) + this.contextMenu.path = this._path; + } + if(this.contextMenu !== undefined){ + if(this.tooltip !== undefined) + this.tooltip.hide(); + if(!this.contextMenu.isOpen){ + this.contextMenu.rebuildItems(); + } + this.contextMenu.toggle(); + } + } + + activate(event) { + if(this._command === "ArcMenu_LogOut") + activatePowerOption(Constants.PowerType.LOGOUT, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Lock") + activatePowerOption(Constants.PowerType.LOCK, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_PowerOff") + activatePowerOption(Constants.PowerType.POWER_OFF, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Restart") + activatePowerOption(Constants.PowerType.RESTART, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Suspend") + activatePowerOption(Constants.PowerType.SUSPEND, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_HybridSleep") + activatePowerOption(Constants.PowerType.HYBRID_SLEEP, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Hibernate") + activatePowerOption(Constants.PowerType.HIBERNATE, this._menuLayout.arcMenu); + + else{ + this._menuLayout.arcMenu.toggle(); + if(this._command === "ArcMenu_ActivitiesOverview") + Main.overview.show(); + else if(this._command === "ArcMenu_RunCommand") + Main.openRunDialog(); + else if(this._command === "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else if(this._app) + this._app.open_new_window(-1); + else + Util.spawnCommandLine(this._command); + } + } +}); + +// Menu item which displays the current user +var UserMenuItem = GObject.registerClass(class Arc_Menu_UserMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, displayType) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._displayType = displayType; + this._settings = this._menuLayout._settings; + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + this.iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + } + else{ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + this.iconSize = Utils.getIconSize(IconSizeEnum, USER_AVATAR_SIZE); + } + + this.userMenuIcon = new UserMenuIcon(menuLayout, this.iconSize, false); + + this.add_child(this.userMenuIcon.actor); + this.label = this.userMenuIcon.label; + if(this._displayType !== Constants.DisplayType.BUTTON) + this.add_child(this.label); + } + + activate(event) { + Util.spawnCommandLine("gnome-control-center user-accounts"); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +var UserMenuIcon = class Arc_Menu_UserMenuIcon{ + constructor(menuLayout, size, hasTooltip) { + this._menuLayout = menuLayout; + this.iconSize = size; + + let username = GLib.get_user_name(); + this._user = AccountsService.UserManager.get_default().get_user(username); + + this.actor = new St.Bin({ + style_class: 'menu-user-avatar user-icon', + track_hover: true, + reactive: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + + this.label = new St.Label({ + text: GLib.get_real_name(), + y_align: Clutter.ActorAlign.CENTER + }); + + this.actor.style = "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + + this._userLoadedId = this._user.connect('notify::is-loaded', this._onUserChanged.bind(this)); + this._userChangedId = this._user.connect('changed', this._onUserChanged.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + if(hasTooltip) + this.actor.connect('notify::hover',this._onHover.bind(this)); + + this._onUserChanged(); + } + + _onHover() { + if(this.tooltip === undefined && this.actor.hover){ + this.tooltip = new Tooltip(this._menuLayout, this.actor, GLib.get_real_name()); + this.tooltip.location = Constants.TooltipLocation.BOTTOM_CENTERED; + this.tooltip._onHover(); + } + } + + _onUserChanged() { + if (this._user.is_loaded) { + this.label.set_text(this._user.get_real_name()); + if(this.tooltip) + this.tooltip.titleLabel.text = this._user.get_real_name(); + + let iconFile = this._user.get_icon_file(); + if (iconFile && !GLib.file_test(iconFile ,GLib.FileTest.EXISTS)) + iconFile = null; + + if (iconFile) { + this.actor.child = null; + this.actor.add_style_class_name('user-avatar'); + this.actor.style = 'background-image: url("%s");'.format(iconFile) + "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + } + else { + this.actor.style = "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + this.actor.child = new St.Icon({ + icon_name: 'avatar-default-symbolic', + icon_size: this.iconSize, + style: "padding: 5px; width: " + this.iconSize + "px; height: " + this.iconSize + "px;" + }); + } + } + } + + _onDestroy() { + if (this._userLoadedId) { + this._user.disconnect(this._userLoadedId); + this._userLoadedId = null; + } + if (this._userChangedId) { + this._user.disconnect(this._userChangedId); + this._userChangedId = null; + } + } +}; + +// Menu pinned apps item class +var PinnedAppsMenuItem = GObject.registerClass({ + Signals: { 'saveSettings': {}, }, +}, class Arc_Menu_PinnedAppsMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, name, icon, command, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._menuButton = menuLayout.menuButton; + this._settings = this._menuLayout._settings; + this._command = command; + this._iconString = this._iconPath = icon; + this._name = name; + this._displayType = displayType; + this._app = Shell.AppSystem.get_default().lookup_app(this._command); + this.hasContextMenu = true; + this.gridLocation = [-1, -1]; + this.isContainedInCategory = isContainedInCategory; + + //Modifiy the Default Pinned Apps--------------------- + if(this._name == "ArcMenu Settings"){ + this._name = _("ArcMenu Settings"); + } + else if(this._name == "Terminal"){ + this._name = _("Terminal"); + } + else if(this._name == "Files"){ + this._name = _("Files"); + } + if(this._iconPath === "ArcMenu_ArcMenuIcon" || this._iconPath === Me.path + '/media/icons/arc-menu-symbolic.svg'){ + this._iconString = this._iconPath = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + } + //------------------------------------------------------- + + if(this._app && this._iconPath === ''){ + let appIcon = this._app.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(appIcon instanceof St.Icon){ + this._iconString = appIcon.gicon ? appIcon.gicon.to_string() : appIcon.fallback_icon_name; + if(!this._iconString) + this._iconString = ""; + } + } + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(this._name), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + if(this._displayType === Constants.DisplayType.LIST && this._settings.get_boolean('apps-show-extra-details') && this._app){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionLabel = new St.Label({ + text: this._app.get_description(), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + if(this._app.get_description()) + labelBox.add_child(descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + this._draggable = DND.makeDraggable(this.actor); + this._draggable._animateDragEnd = (eventTime) => { + this._draggable._animationInProgress = true; + this._draggable._onAnimationComplete(this._draggable._dragActor, eventTime); + }; + this.isDraggableApp = true; + this._draggable.connect('drag-begin', this._onDragBegin.bind(this)); + this._draggable.connect('drag-end', this._onDragEnd.bind(this)); + + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + + this.setShouldShow(); + } + + createIcon(){ + let iconSize; + if(this._displayType === Constants.DisplayType.GRID){ + const IconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(IconSizeEnum, defaultIconStyle); + } + else if(this._displayType === Constants.DisplayType.LIST){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultPinnedIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + return new St.Icon({ + gicon: Gio.icon_new_for_string(this._iconString), + icon_size: iconSize + }); + } + + popupContextMenu(){ + if(this.contextMenu == undefined){ + let app = this._app ? this._app : this._command; + this.contextMenu = new ApplicationContextMenu(this.actor, app, this._menuLayout); + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(this.tooltip !== undefined) + this.tooltip.hide(); + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + _onDragBegin() { + this.isDragging = true; + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + this._menuButton.tooltipShowing = false; + } + if(this.tooltip){ + this.tooltip.hide(); + this._menuButton.tooltipShowing = false; + } + + if(this.contextMenu && this.contextMenu.isOpen) + this.contextMenu.toggle(); + + this.cancelPopupTimeout(); + + this._dragMonitor = { + dragMotion: this._onDragMotion.bind(this) + }; + DND.addDragMonitor(this._dragMonitor); + this._parentBox = this.actor.get_parent(); + let p = this._parentBox.get_transformed_position(); + this.posX = p[0]; + this.posY = p[1]; + + this.actor.opacity = 55; + this.get_allocation_box(); + this.rowHeight = this.height; + this.rowWidth = this.width; + } + + _onDragMotion(dragEvent) { + let layoutManager = this._parentBox.layout_manager; + if(layoutManager instanceof Clutter.GridLayout){ + this.xIndex = Math.floor((this._draggable._dragX - this.posX) / (this.rowWidth + layoutManager.column_spacing)); + this.yIndex = Math.floor((this._draggable._dragY - this.posY) / (this.rowHeight + layoutManager.row_spacing)); + + if(this.xIndex === this.gridLocation[0] && this.yIndex === this.gridLocation[1]){ + return DND.DragMotionResult.CONTINUE; + } + else{ + this.gridLocation = [this.xIndex, this.yIndex]; + } + + this._parentBox.remove_child(this); + let children = this._parentBox.get_children(); + let childrenCount = children.length; + let columns = layoutManager.gridColumns; + let rows = Math.floor(childrenCount / columns); + if(this.yIndex >= rows) + this.yIndex = rows; + if(this.yIndex < 0) + this.yIndex = 0; + if(this.xIndex >= columns - 1) + this.xIndex = columns - 1; + if(this.xIndex < 0) + this.xIndex = 0; + + if(((this.xIndex + 1) + (this.yIndex * columns)) > childrenCount) + this.xIndex = Math.floor(childrenCount % columns); + + this._parentBox.remove_all_children(); + + let x = 0, y = 0; + for(let i = 0; i < children.length; i++){ + if(this.xIndex === x && this.yIndex === y) + [x, y] = this.gridLayoutIter(x, y, columns); + layoutManager.attach(children[i], x, y, 1, 1); + [x, y] = this.gridLayoutIter(x, y, columns); + } + layoutManager.attach(this, this.xIndex, this.yIndex, 1, 1); + } + return DND.DragMotionResult.CONTINUE; + } + + _onDragEnd() { + if (this._dragMonitor) { + DND.removeDragMonitor(this._dragMonitor); + this._dragMonitor = null; + } + this.actor.opacity = 255; + let layoutManager = this._parentBox.layout_manager; + if(layoutManager instanceof Clutter.GridLayout){ + let x = 0, y = 0; + let columns = layoutManager.gridColumns; + let orderedList = []; + let children = this._parentBox.get_children(); + for(let i = 0; i < children.length; i++){ + orderedList.push(this._parentBox.layout_manager.get_child_at(x, y)); + [x, y] = this.gridLayoutIter(x, y, columns); + } + this._menuLayout.pinnedAppsArray = orderedList; + } + this.emit('saveSettings'); + } + + getDragActor() { + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + let icon = new St.Icon({ + gicon: Gio.icon_new_for_string(this._iconString), + style_class: 'popup-menu-icon', + icon_size: this._iconBin.get_child().icon_size + }); + let iconColor = this._settings.get_string('menu-foreground-color'); + if(customStyle) + icon.style = `color: ${iconColor};`; + return icon; + } + + getDragActorSource() { + return this.actor; + } + + gridLayoutIter(x, y, columns){ + x++; + if(x === columns){ + y++; + x = 0; + } + return [x, y]; + } + + activate(event) { + if(this._app) + this._app.open_new_window(-1); + else if(this._command === "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else + Util.spawnCommandLine(this._command); + + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +var ApplicationMenuItem = GObject.registerClass(class Arc_Menu_ApplicationMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, app, displayType, metaInfo, isContainedInCategory) { + super._init(menuLayout); + this._app = app; + this._menuLayout = menuLayout; + this.metaInfo = metaInfo; + this._settings = this._menuLayout._settings; + this.searchType = this._menuLayout.layoutProperties.SearchDisplayType; + this._displayType = displayType; + this.hasContextMenu = true; + this.isSearchResult = this.metaInfo ? true : false; + this.isContainedInCategory = isContainedInCategory; + + if(this._app){ + let disableRecentAppsIndicator = this._settings.get_boolean("disable-recently-installed-apps") + if(!disableRecentAppsIndicator){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + this.isRecentlyInstalled = recentApps.some((appIter) => appIter === this._app.get_id()); + } + } + + this._iconBin = new St.Bin({ + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: this._app ? this._app.get_name() : this.metaInfo['name'], + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.description = this._app ? this._app.get_description() : this.metaInfo['description']; + + let searchResultsDescriptionsSetting = this._settings.get_boolean("show-search-result-details"); + let appsShowDescriptionsSetting = this._settings.get_boolean("apps-show-extra-details"); + this.searchResultsDescriptions = searchResultsDescriptionsSetting && this.isSearchResult; + this.appsShowDescriptions = appsShowDescriptionsSetting && !this.isSearchResult; + + if(this.description && (this.searchResultsDescriptions || this.appsShowDescriptions) && this._displayType === Constants.DisplayType.LIST){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionText = this.description.split('\n')[0]; + this.descriptionLabel = new St.Label({ + text: descriptionText, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + labelBox.add_child(this.descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + this.label_actor = this.label; + + if(this.isRecentlyInstalled){ + this._indicator = new St.Label({ + text: _('New'), + style_class: "arc-menu-menu-item-text-indicator", + style: "border-radius: 15px; margin: 0px; padding: 0px 10px;", + x_expand: true, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._indicator); + } + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + + this.hoverID = this.connect("notify::hover", () => this.removeIndicator()); + this.keyFocusInID = this.connect("key-focus-in", () => this.removeIndicator()); + } + + createIcon(){ + let iconSize; + if(this._displayType === Constants.DisplayType.GRID){ + this._iconBin.x_align = Clutter.ActorAlign.CENTER; + + const IconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(IconSizeEnum, defaultIconStyle); + } + else if(this._displayType === Constants.DisplayType.LIST){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory || this.isSearchResult ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultPinnedIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + return this.metaInfo ? this.metaInfo['createIcon'](iconSize) : this._app.create_icon_texture(iconSize); + } + + removeIndicator(){ + if(this.isRecentlyInstalled){ + this.isRecentlyInstalled = false; + let recentApps = this._settings.get_strv('recently-installed-apps'); + let index = recentApps.indexOf(this._app.get_id()); + if(index > -1){ + recentApps.splice(index, 1); + } + this._settings.set_strv('recently-installed-apps', recentApps); + + this._indicator.hide(); + this._menuLayout.setRecentlyInstalledIndicator(); + } + } + + popupContextMenu(){ + this.removeIndicator(); + if(this.tooltip) + this.tooltip.hide(); + if(!this._app && !this._path) + return; + + if(this.contextMenu === undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._path) + this.contextMenu.path = this._path; + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + activateSearchResult(provider, metaInfo, terms, event){ + this._menuLayout.arcMenu.toggle(); + if(provider.activateResult){ + provider.activateResult(metaInfo.id, terms); + if (metaInfo.clipboardText) + St.Clipboard.get_default().set_text(St.ClipboardType.CLIPBOARD, metaInfo.clipboardText); + } + else{ + if (metaInfo.id.endsWith('.desktop')) { + let app = Shell.AppSystem.get_default().lookup_app(metaInfo.id); + if (app.can_open_new_window()) + app.open_new_window(-1); + else + app.activate(); + } + else{ + this._menuLayout.arcMenu.itemActivated(BoxPointer.PopupAnimation.NONE); + SystemActions.activateAction(metaInfo.id); + } + } + } + + activate(event) { + this.removeIndicator(); + + if(this.metaInfo){ + this.activateSearchResult(this.provider, this.metaInfo, this.resultsView.terms, event); + return Clutter.EVENT_STOP; + } + else + this._app.open_new_window(-1); + + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _onDestroy(){ + if(this.hoverID){ + this.disconnect(this.hoverID); + this.hoverID = null; + } + if(this.keyFocusInID){ + this.disconnect(this.keyFocusInID); + this.keyFocusInID = null; + } + } +}); + +// Menu Category item class +var CategoryMenuItem = GObject.registerClass(class Arc_Menu_CategoryMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, category, displayType) { + super._init(menuLayout); + this.appList = []; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + this._layout = this._settings.get_enum('menu-layout'); + this._category = category; + this._name = ""; + this._horizontalFlip = this._settings.get_boolean('enable-horizontal-flip'); + this._displayType = displayType; + this.layoutProps = this._menuLayout.layoutProperties; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: this._name, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this.label); + + if(this.isRecentlyInstalled) + this.setRecentlyInstalledIndicator(true); + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + this.remove_child(this.label); + } + + this.label_actor = this.label; + this._menuLayout._oldX = -1; + this._menuLayout._oldY = -1; + this.connect('motion-event', this._onMotionEvent.bind(this)); + this.connect('enter-event', this._onEnterEvent.bind(this)); + this.connect('leave-event', this._onLeaveEvent.bind(this)); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + + let defaultIconSize = this.layoutProps.DefaultCategoryIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + let defaultIconSize = this.layoutProps.DefaultButtonsIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + let icon = new St.Icon({ + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + + let categoryIconType = this._settings.get_enum('category-icon-type'); + let [name, gicon, iconName, fallbackIconName] = Utils.getCategoryDetails(this._category, categoryIconType); + this._name = _(name); + if(gicon) + icon.gicon = gicon; + else if(iconName) + icon.icon_name = iconName; + else + icon.fallback_icon_name = fallbackIconName; + + return icon; + } + + setRecentlyInstalledIndicator(shouldShow){ + if(this._displayType === Constants.DisplayType.BUTTON) + return; + this.isRecentlyInstalled = shouldShow; + if(shouldShow){ + this._indicator = new St.Icon({ + icon_name: 'message-indicator-symbolic', + style_class: 'arc-menu-menu-item-indicator', + icon_size: INDICATOR_ICON_SIZE, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._indicator); + } + else if(this._indicator && this.contains(this._indicator)) + this.remove_child(this._indicator); + } + + displayAppList(){ + this._menuLayout.searchBox?.clearWithoutSearchChangeEvent(); + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, null); + } + + activate(event) { + this.displayAppList(); + if(this.layoutProps.SupportsCategoryOnHover) + this._menuLayout.setActiveCategory(this, true); + super.activate(event); + } + + _onEnterEvent(actor, event) { + if(this._menuLayout.navigatingCategoryLeaveEventID){ + GLib.source_remove(this._menuLayout.navigatingCategoryLeaveEventID); + this._menuLayout.navigatingCategoryLeaveEventID = null; + } + } + + _onLeaveEvent(actor, event) { + if(!this._menuLayout.navigatingCategoryLeaveEventID){ + this._menuLayout.navigatingCategoryLeaveEventID = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 200, () => { + this._menuLayout.navigatingCategory = null; + this._menuLayout.navigatingCategoryLeaveEventID = null; + return GLib.SOURCE_REMOVE; + }); + } + } + + _onMotionEvent(actor, event) { + if(this.layoutProps.SupportsCategoryOnHover && this._settings.get_boolean('activate-on-hover')){ + if (!this._menuLayout.navigatingCategory) { + this._menuLayout.navigatingCategory = this; + } + + if (this._isInTriangle(event.get_coords())){ + if(this._menuLayout.activeCategoryType !== this._category && this._menuLayout.navigatingCategory === this) + this.activate(Clutter.get_current_event()); + return true; + } + this._menuLayout.navigatingCategory = this; + return true; + } + } + + _isInTriangle([x, y]){ + let [posX, posY] = this._menuLayout.navigatingCategory.get_transformed_position(); + + //the mouse is still in the active category + if (this._menuLayout.navigatingCategory === this){ + this._menuLayout._oldX = x; + this._menuLayout._oldY = y; + return true; + } + + if(!this._menuLayout.navigatingCategory) + return false; + + let width = this._menuLayout.navigatingCategory.width; + let height = this._menuLayout.navigatingCategory.height; + + let maxX = this._horizontalFlip ? posX : posX + width; + let maxY = posY + height; + + let distance = Math.abs(maxX - this._menuLayout._oldX); + let point1 = [this._menuLayout._oldX, this._menuLayout._oldY] + let point2 = [maxX, posY - distance]; + let point3 = [maxX, maxY + distance]; + + let area = Utils.areaOfTriangle(point1, point2, point3); + let a1 = Utils.areaOfTriangle([x, y], point2, point3); + let a2 = Utils.areaOfTriangle(point1, [x, y], point3); + let a3 = Utils.areaOfTriangle(point1, point2, [x, y]); + return area === a1 + a2 + a3; + } +}); + +var SimpleMenuItem = GObject.registerClass(class Arc_Menu_SimpleMenuItem extends CategoryMenuItem{ + _init(menuLayout, category) { + super._init(menuLayout, category); + this.subMenu = new PopupMenu.PopupMenu(this.actor,.5,St.Side.LEFT); + this.subMenu.connect("open-state-changed", (menu, open) => { + if(!open){ + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + }); + + Main.uiGroup.add_child(this.subMenu.actor); + this.section = new PopupMenu.PopupMenuSection(); + this.subMenu.addMenuItem(this.section); + + this.applicationsScrollBox = this._menuLayout._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this._menuLayout.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + this._menuLayout.subMenuManager.addMenu(this.subMenu); + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.applicationsScrollBox.style = 'max-height: 25em;'; + this.applicationsBox._delegate = this.applicationsBox; + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.section.actor.add_child(this.applicationsScrollBox); + + if(this.subMenu._keyPressId) + this.actor.disconnect(this.subMenu._keyPressId); + this.applicationsScrollBox.connect("key-press-event",(actor, event)=>{ + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Right: + case Clutter.KEY_Left: + this.subMenu.toggle(); + this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + case Clutter.KEY_Escape: + if(this.subMenu.isOpen){ + this.subMenu.toggle(); + this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + return Clutter.EVENT_STOP; + default: + return Clutter.EVENT_PROPAGATE; + } + }); + this.actor.connect("key-press-event",(actor, event)=>{ + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Escape: + if(this.subMenu.isOpen){ + this.subMenu.toggle(); + } + return Clutter.EVENT_STOP; + case Clutter.KEY_Left: + case Clutter.KEY_Right: + case Clutter.KEY_Return: + if(!this.subMenu.isOpen){ + let navigateFocus = true; + this.activate(event, navigateFocus); + this.subMenu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + return Clutter.EVENT_STOP; + } + else{ + return Clutter.EVENT_PROPAGATE; + } + default: + return Clutter.EVENT_PROPAGATE; + } + }); + this.updateStyle(); + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + + this.subMenu.actor.hide(); + if(customStyle){ + this.subMenu.actor.style_class = 'arc-menu-boxpointer'; + this.subMenu.actor.add_style_class_name('arc-menu'); + } + else + { + this.subMenu.actor.style_class = 'popup-menu-boxpointer'; + this.subMenu.actor.add_style_class_name('popup-menu'); + } + } + + displayAppList(){ + this._menuLayout.activeCategory = this._name; + } + + activate(event, navigateFocus = true) { + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, true); + this.subMenu.toggle(); + if(navigateFocus) + this.subMenu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + this._menuLayout.setActiveCategory(this, true); + } + + _onMotionEvent(actor, event) { + if (!this._menuLayout.navigatingCategory) { + this._menuLayout.navigatingCategory = this; + } + + if (this._isInTriangle(event.get_coords())){ + if(this._menuLayout.activeCategory !== this._name && this._menuLayout.navigatingCategory === this){ + let navigateFocus = false; + this.activate(event, navigateFocus); + } + return true; + } + this._menuLayout.navigatingCategory = this; + return true; + } +}); +// SubMenu Category item class +var CategorySubMenuItem = GObject.registerClass(class Arc_Menu_CategorySubMenuItem extends PopupMenu.PopupSubMenuMenuItem{ + _init(menuLayout, category) { + super._init('', true); + this.add_style_class_name("arcmenu-menu-item"); + this.add_style_class_name('margin-box'); + this._category = category; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + this._name = ""; + this.isSimpleMenuItem = false; + this._active = false; + this.applicationsMap = new Map(); + this.appList = []; + + let categoryIconType = this._settings.get_enum('category-icon-type'); + let [name, gicon, iconName, fallbackIconName] = Utils.getCategoryDetails(this._category, categoryIconType); + this._name = _(name); + if(gicon) + this.icon.gicon = gicon; + else if(iconName) + this.icon.icon_name = iconName; + else + this.icon.fallback_icon_name = fallbackIconName; + + this.label.text = this._name; + + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultCategoryIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + this.icon.icon_size = iconSize; + + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', (action) => { + this._menuLayout._blockActivateEvent = true; + this._menuLayout.onPan(action, this.menu.actor); + }); + panAction.connect('gesture-cancel',(action) => this._menuLayout.onPanEnd(action, this.menu.actor)); + panAction.connect('gesture-end', (action) => this._menuLayout.onPanEnd(action, this.menu.actor)); + this.menu.actor.add_action(panAction); + + this.menu.actor.style = 'max-height: 250px;'; + this.menu.actor.overlay_scrollbars = true; + this.menu.actor.style_class = 'popup-sub-menu ' + (this._menuLayout.disableFadeEffect ? '' : 'small-vfade'); + this.menu._needsScrollbar = () => this._needsScrollbar(); + + this.menu.connect('open-state-changed', () => { + if(!this.menu.isOpen){ + let scrollbar= this.menu.actor.get_vscroll_bar().get_adjustment(); + scrollbar.set_value(0); + } + }); + this.menu.box.style_class = 'margin-box'; + } + + setRecentlyInstalledIndicator(shouldShow){ + this.isRecentlyInstalled = shouldShow; + if(shouldShow){ + this._indicator = new St.Icon({ + icon_name: 'message-indicator-symbolic', + style_class: 'arc-menu-menu-item-indicator', + icon_size: INDICATOR_ICON_SIZE, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(this._indicator); + } + else if(this._indicator && this.actor.contains(this._indicator)) + this.actor.remove_child(this._indicator); + } + + _needsScrollbar() { + let topMenu = this.menu; + let [, topNaturalHeight] = topMenu.actor.get_preferred_height(-1); + let topThemeNode = topMenu.actor.get_theme_node(); + + let topMaxHeight = topThemeNode.get_max_height(); + let needsScrollbar = topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight; + if(needsScrollbar) + this.menu.actor.style = 'min-height:150px; max-height: 250px;'; + else + this.menu.actor.style = 'max-height: 250px;'; + + this.menu.actor.vscrollbar_policy = St.PolicyType.AUTOMATIC; + + if (needsScrollbar) + this.menu.actor.add_style_pseudo_class('scrolled'); + else + this.menu.actor.remove_style_pseudo_class('scrolled'); + + return needsScrollbar; + } + + loadMenu(){ + let children = this.menu.box.get_children(); + for (let i = 0; i < children.length; i++) { + let item = children[i]; + this.menu.box.remove_child(item); + } + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + for (let i = 0; i < appList.length; i++) { + let app = appList[i]; + let item = this.applicationsMap.get(app); + if(item.actor.get_parent()){ + item.actor.get_parent().remove_child(item.actor); + } + if (!item.actor.get_parent()) { + this.menu.box.add_child(item.actor); + } + } + } + + _setOpenState(open){ + if(this.isSimpleMenuItem && open){ + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, true); + } + else if(open) + this.loadMenu(); + + this.setSubmenuShown(open); + } +}); + +// Place Info class +var PlaceInfo = class Arc_Menu_PlaceInfo { + constructor(file, name, icon) { + this.file = file; + this.name = name ? name : this._getFileName(); + this.icon = icon ? icon : null; + this.gicon = icon ? null : this.getIcon(); + } + + launch(timestamp) { + let context = global.create_app_launch_context(timestamp, -1); + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + Main.notifyError(_('Failed to open “%s”').format(this._getFileName()), e.message); + reject(e); + } + }); + }); + } + + getIcon() { + try { + let info = this.file.query_info('standard::symbolic-icon', 0, null); + return info.get_symbolic_icon(); + + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + if (!this.file.is_native()) { + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + } else { + return new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + } + } + + _getFileName() { + try { + let info = this.file.query_info('standard::display-name', 0, null); + return info.get_display_name(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + return this.file.get_basename(); + } + } + } + + destroy(){ + } +}; +Signals.addSignalMethods(PlaceInfo.prototype); + +// Menu Place Shortcut item class +var PlaceMenuItem = GObject.registerClass(class Arc_Menu_PlaceMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, info, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._displayType = displayType; + this._info = info; + this._settings = menuLayout._settings; + this.isContainedInCategory = isContainedInCategory; + this.hasContextMenu = true; + + this.label = new St.Label({ + text: _(info.name), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.x_expand = this.y_expand = false; + this.x_align = this.y_align = Clutter.ActorAlign.CENTER; + } + else{ + this.add_child(this.label); + } + + this._changedId = this._info.connect('changed', this._propertiesChanged.bind(this)); + } + + createIcon(){ + let iconSizeEnum; + if(this.isContainedInCategory) + iconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + else + iconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + return new St.Icon({ + gicon: this._info.gicon ? this._info.gicon : this._info.icon, + icon_size: iconSize, + }); + } + + _onDestroy() { + if (this._changedId) { + this._info.disconnect(this._changedId); + this._changedId = null; + } + if(this._info) + this._info.destroy(); + super._onDestroy(); + } + + popupContextMenu(){ + if(this.tooltip) + this.tooltip.hide(); + if(!this._app && !this._path) + return; + + if(this.contextMenu === undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._path) + this.contextMenu.path = this._path; + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + activate(event) { + this._info.launch(event.get_time()); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _propertiesChanged(info) { + this._info = info; + this.createIcon(); + if(this.label) + this.label.text = info.name; + } +}); + +var SearchBox = GObject.registerClass({ +Signals: { + 'search-changed': { param_types: [GObject.TYPE_STRING] }, + 'entry-key-focus-in': { }, + 'entry-key-press': { param_types: [Clutter.Event.$gtype] }, +},}, +class Arc_Menu_SearchBox extends St.Entry { + _init(menuLayout) { + super._init({ + hint_text: _("Search…"), + track_hover: true, + can_focus: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + name: "ArcSearchEntry" + }); + this.searchResults = menuLayout.searchResults; + this._settings = menuLayout._settings; + this.triggerSearchChangeEvent = true; + + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.EXTRA_SMALL_ICON_SIZE); + + this._findIcon = new St.Icon({ + style_class: 'search-entry-icon', + icon_name: 'edit-find-symbolic', + icon_size: iconSize + }); + + this._clearIcon = new St.Icon({ + style_class: 'search-entry-icon', + icon_name: 'edit-clear-symbolic', + icon_size: iconSize + }); + + this.set_primary_icon(this._findIcon); + + this._text = this.get_clutter_text(); + this._textChangedId = this._text.connect('text-changed', this._onTextChanged.bind(this)); + this._keyPressId = this._text.connect('key-press-event', this._onKeyPress.bind(this)); + this._keyFocusInId = this._text.connect('key-focus-in', this._onKeyFocusIn.bind(this)); + this._keyFocusInId = this._text.connect('key-focus-out', this._onKeyFocusOut.bind(this)); + this._searchIconClickedId = this.connect('secondary-icon-clicked', () => this.clear()); + this.connect('destroy', this._onDestroy.bind(this)); + } + + updateStyle(removeBorder){ + let style = this.style; + this.style = style.replace("border-width: 0;", ""); + if(removeBorder) + this.style += 'border-width: 0;'; + } + + get entryBox(){ + return this; + } + + get actor(){ + return this; + } + + getText() { + return this.get_text(); + } + + setText(text) { + this.set_text(text); + } + + clearWithoutSearchChangeEvent(){ + this.triggerSearchChangeEvent = false; + this.set_text(''); + this.triggerSearchChangeEvent = true; + } + + hasKeyFocus() { + return this.contains(global.stage.get_key_focus()); + } + + clear() { + this.set_text(''); + } + + isEmpty() { + return this.get_text() == ''; + } + + _onKeyFocusOut(){ + if(!this.isEmpty()){ + this.add_style_pseudo_class('focus'); + return Clutter.EVENT_STOP; + } + } + + _onTextChanged() { + let searchString = this.get_text(); + if(!this.isEmpty()){ + if(!this.hasKeyFocus()) + this.grab_key_focus(); + if (!this.searchResults.getTopResult()?.has_style_pseudo_class("active")) + this.searchResults.getTopResult()?.add_style_pseudo_class("active") + this.add_style_pseudo_class('focus'); + this.set_secondary_icon(this._clearIcon); + } + else{ + if(!this.hasKeyFocus()) + this.remove_style_pseudo_class('focus'); + this.set_secondary_icon(null); + } + + if(this.triggerSearchChangeEvent) + this.emit('search-changed', searchString); + } + + _onKeyPress(actor, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Return || + symbol == Clutter.KEY_KP_Enter) { + if (!this.isEmpty()) { + if (this.searchResults.getTopResult()) { + this.searchResults.getTopResult().activate(event); + } + } + return Clutter.EVENT_STOP; + } + this.emit('entry-key-press', event); + return Clutter.EVENT_PROPAGATE; + } + + _onKeyFocusIn() { + this.add_style_pseudo_class('focus'); + this.emit('entry-key-focus-in'); + return Clutter.EVENT_PROPAGATE; + } + + _onDestroy() { + if (this._textChangedId) { + this._text.disconnect(this._textChangedId); + this._textChangedId = null; + } + if (this._keyPressId) { + this._text.disconnect(this._keyPressId); + this._keyPressId = null; + } + if (this._keyFocusInId) { + this._text.disconnect(this._keyFocusInId); + this._keyFocusInId = null; + } + if(this._searchIconClickedId){ + this.disconnect(this._searchIconClickedId); + this._searchIconClickedId = null; + } + } +}); + +/** + * This class is responsible for the appearance of the menu button. + */ +var MenuButtonWidget = class Arc_Menu_MenuButtonWidget{ + constructor() { + this.actor = new St.BoxLayout({ + style_class: 'panel-status-menu-box', + pack_start: false + }); + this._arrowIcon = PopupMenu.arrowIcon(St.Side.BOTTOM); + this._arrowIcon.add_style_class_name('arc-menu-arrow'); + + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + track_hover:true, + reactive: true, + }); + this._label = new St.Label({ + text: _("Applications"), + y_expand: true, + style_class: 'arc-menu-text', + y_align: Clutter.ActorAlign.CENTER, + }); + + this.actor.add_child(this._icon); + this.actor.add_child(this._label); + this.actor.add_child(this._arrowIcon); + } + + setActiveStylePseudoClass(enable){ + if(enable){ + this._arrowIcon.add_style_pseudo_class('active'); + this._icon.add_style_pseudo_class('active'); + this._label.add_style_pseudo_class('active'); + } + else{ + this._arrowIcon.remove_style_pseudo_class('active'); + this._icon.remove_style_pseudo_class('active'); + this._label.remove_style_pseudo_class('active'); + } + } + + updateArrowIconSide(side){ + let iconName; + switch (side) { + case St.Side.TOP: + iconName = 'pan-down-symbolic'; + break; + case St.Side.RIGHT: + iconName = 'pan-start-symbolic'; + break; + case St.Side.BOTTOM: + iconName = 'pan-up-symbolic'; + break; + case St.Side.LEFT: + iconName = 'pan-end-symbolic'; + break; + } + this._arrowIcon.icon_name = iconName; + } + + getPanelLabel() { + return this._label; + } + + getPanelIcon() { + return this._icon; + } + + showArrowIcon() { + if (!this.actor.contains(this._arrowIcon)) { + this.actor.add_child(this._arrowIcon); + } + } + + hideArrowIcon() { + if (this.actor.contains(this._arrowIcon)) { + this.actor.remove_child(this._arrowIcon); + } + } + + showPanelIcon() { + if (!this.actor.contains(this._icon)) { + this.actor.add_child(this._icon); + } + } + + hidePanelIcon() { + if (this.actor.contains(this._icon)) { + this.actor.remove_child(this._icon); + } + } + + showPanelText() { + if (!this.actor.contains(this._label)) { + this.actor.add_child(this._label); + } + } + + hidePanelText() { + this._label.style = ''; + if (this.actor.contains(this._label)) { + this.actor.remove_child(this._label); + } + } + + setPanelTextStyle(style){ + this._label.style = style; + } +}; + +var DashMenuButtonWidget = class Arc_Menu_DashMenuButtonWidget{ + constructor(menuButton, settings) { + this._menuButton = menuButton; + this._settings = settings; + this.actor = new St.Button({ + style_class: 'show-apps', + track_hover: true, + can_focus: true, + toggle_mode: false, + reactive: false + }); + this.actor._delegate = this; + this.icon = new imports.ui.iconGrid.BaseIcon(_("ArcMenu"), + { setSizeManually: true, + showLabel: false, + createIcon: this._createIcon.bind(this) }); + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + icon_size: 15, + track_hover:true, + reactive: true + }); + this.icon._delegate = this.actor; + this._labelText = _("ArcMenu"); + this.label = new St.Label({ style_class: 'dash-label' }); + this.label.hide(); + Main.layoutManager.addChrome(this.label); + this.label_actor = this.label; + this.actor.set_child(this.icon); + + this.child = this.actor; + } + showLabel() { + if (!this._labelText) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.actor.get_transformed_position(); + let node = this.label.get_theme_node(); + + let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1; + let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1; + + let labelWidth = this.label.get_width(); + let labelHeight = this.label.get_height(); + + let x, y, xOffset, yOffset; + + let position = this._menuButton._panel._settings.get_enum('dock-position'); + this._isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); + let labelOffset = node.get_length('-x-offset'); + switch (position) { + case St.Side.LEFT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = stageX + this.actor.get_width() + xOffset; + break; + case St.Side.RIGHT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = Math.round(stageX) - labelWidth - xOffset; + break; + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + case St.Side.BOTTOM: + yOffset = labelOffset; + y = stageY - labelHeight - yOffset; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + } + + // keep the label inside the screen border + // Only needed fot the x coordinate. + + // Leave a few pixel gap + let gap = 5; + let monitor = Main.layoutManager.findMonitorForActor(this.actor); + if (x - monitor.x < gap) + x += monitor.x - x + labelOffset; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; + + this.label.remove_all_transitions(); + this.label.set_position(x, y); + this.label.ease({ + opacity: 255, + duration: Dash.DASH_ITEM_LABEL_SHOW_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD + }); + } + hideLabel() { + this.label.ease({ + opacity: 0, + duration: Dash.DASH_ITEM_LABEL_HIDE_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => this.label.hide() + }); + } + _createIcon(size) { + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + track_hover:true, + icon_size: size, + reactive: true + }); + let path = this._settings.get_string('custom-menu-button-icon'); + let iconString = Utils.getMenuButtonIcon(this._settings, path); + this._icon.set_gicon(Gio.icon_new_for_string(iconString)); + + return this._icon; + } + getPanelIcon() { + return this._icon; + } +}; + +var WorldClocksSection = GObject.registerClass(class Arc_Menu_WorldClocksSection extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, null, null); + + this.x_expand = true; + this._clock = new imports.gi.GnomeDesktop.WallClock(); + this._clockNotifyId = 0; + + this._locations = []; + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._grid = new St.Widget({ style_class: 'world-clocks-grid', + x_expand: true, + layout_manager: layout }); + layout.hookup_style(this._grid); + + this.add_child(this._grid); + + this._clocksApp = null; + this._clocksProxy = new ClocksProxy( + Gio.DBus.session, + 'org.gnome.clocks', + '/org/gnome/clocks', + this._onProxyReady.bind(this), + null /* cancellable */, + Gio.DBusProxyFlags.DO_NOT_AUTO_START | Gio.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); + + this._clockSettings = new Gio.Settings({ + schema_id: 'org.gnome.shell.world-clocks', + }); + this.clocksChangedID = this._clockSettings.connect('changed', this._clocksChanged.bind(this)); + this._clocksChanged(); + + this._appSystem = Shell.AppSystem.get_default(); + this.syncID = this._appSystem.connect('installed-changed', + this._sync.bind(this)); + this._sync(); + } + + _onDestroy(){ + if(this.syncID){ + this._appSystem.disconnect(this.syncID); + this.syncID = null; + } + if(this.clocksChangedID){ + this._clockSettings.disconnect(this.clocksChangedID); + this.clocksChangedID = null; + } + if(this.clocksProxyID){ + this._clocksProxy.disconnect(this.clocksProxyID); + this.clocksProxyID = null; + } + if (this._clockNotifyId){ + this._clock.disconnect(this._clockNotifyId); + this._clockNotifyId = null; + } + } + + activate(event) { + super.activate(event); + if (this._clocksApp){ + this._clocksApp.activate(); + } + } + + _sync() { + this._clocksApp = this._appSystem.lookup_app('org.gnome.clocks.desktop'); + this.visible = this._clocksApp != null; + } + + _clocksChanged() { + this._grid.destroy_all_children(); + this._locations = []; + + let world = imports.gi.GWeather.Location.get_world(); + let clocks = this._clockSettings.get_value('locations').deep_unpack(); + for (let i = 0; i < clocks.length; i++) { + let l = world.deserialize(clocks[i]); + if (l && l.get_timezone() != null) + this._locations.push({ location: l }); + } + + this._locations.sort((a, b) => { + return a.location.get_timezone().get_offset() - + b.location.get_timezone().get_offset(); + }); + + let layout = this._grid.layout_manager; + let title = this._locations.length == 0 + ? _("Add world clocks…") + : _("World Clocks"); + let header = new St.Label({ x_align: Clutter.ActorAlign.START, + text: title }); + header.style = "font-weight: bold;"; + layout.attach(header, 0, 0, 2, 1); + this.label_actor = header; + + let localOffset = GLib.DateTime.new_now_local().get_utc_offset(); + + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i].location; + + let name = l.get_city_name() || l.get_name(); + let label = new St.Label({ text: name, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true }); + label.style = "font-weight: normal; font-size: 0.9em;"; + let time = new St.Label(); + time.style = "font-feature-settings: \"tnum\"; font-size: 1.2em;"; + let otherOffset = this._getTimeAtLocation(l).get_utc_offset(); + let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR; + let fmt = Math.trunc(offset) == offset ? '%s%.0f' : '%s%.1f'; + let prefix = offset >= 0 ? '+' : '-'; + let tz = new St.Label({ text: fmt.format(prefix, Math.abs(offset)), + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER }); + tz.style = "font-feature-settings: \"tnum\"; font-size: 0.9em;"; + if (this._grid.text_direction == Clutter.TextDirection.RTL) { + layout.attach(tz, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(label, 2, i + 1, 1, 1); + } else { + layout.attach(label, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(tz, 2, i + 1, 1, 1); + } + + this._locations[i].actor = time; + } + + if (this._grid.get_n_children() > 1) { + if (!this._clockNotifyId) { + this._clockNotifyId = + this._clock.connect('notify::clock', this._updateLabels.bind(this)); + } + this._updateLabels(); + } else { + if (this._clockNotifyId) + this._clock.disconnect(this._clockNotifyId); + this._clockNotifyId = 0; + } + } + + _getTimeAtLocation(location) { + let tz = GLib.TimeZone.new(location.get_timezone().get_tzid()); + return GLib.DateTime.new_now(tz); + } + + _updateLabels() { + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i]; + let now = this._getTimeAtLocation(l.location); + l.actor.text = Util.formatTime(now, { timeOnly: true }); + } + } + + _onProxyReady(proxy, error) { + if (error) { + log(`Failed to create GNOME Clocks proxy: ${error}`); + return; + } + + this.clocksProxyID = this._clocksProxy.connect('g-properties-changed', + this._onClocksPropertiesChanged.bind(this)); + this._onClocksPropertiesChanged(); + } + + _onClocksPropertiesChanged() { + if (this._clocksProxy.g_name_owner == null) + return; + + this._clockSettings.set_value('locations', + new GLib.Variant('av', this._clocksProxy.Locations)); + } +}); + +var WeatherSection = GObject.registerClass(class Arc_Menu_WeatherSection extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, null, null); + + this.x_expand = true; + this.x_align = Clutter.ActorAlign.FILL; + this._weatherClient = new imports.misc.weather.WeatherClient(); + + let box = new St.BoxLayout({ + vertical: true, + x_expand: true, + }); + + this.add_child(box); + + let titleBox = new St.BoxLayout({ }); + let label = new St.Label({ + x_align: Clutter.ActorAlign.START, + x_expand: true, + y_align: Clutter.ActorAlign.END, + text: _('Weather'), + }) + label.style = "font-weight: bold; padding-bottom: 5px;"; + titleBox.add_child(label); + box.add_child(titleBox); + + this._titleLocation = new St.Label({ + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.END, + }); + this._titleLocation.style = "font-weight: bold; padding-bottom: 5px;"; + titleBox.add_child(this._titleLocation); + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._forecastGrid = new St.Widget({ + style_class: 'weather-grid', + layout_manager: layout, + }); + layout.hookup_style(this._forecastGrid); + box.add_child(this._forecastGrid); + + this.syncID = this._weatherClient.connect('changed', this._sync.bind(this)); + this._sync(); + + } + _onDestroy(){ + if(this.syncID){ + this._weatherClient.disconnect(this.syncID); + this.syncID = null; + } + this._weatherClient = null; + } + vfunc_map() { + this._weatherClient.update(); + super.vfunc_map(); + } + + activate(event) { + super.activate(event); + this._weatherClient.activateApp(); + } + + _getInfos() { + let forecasts = this._weatherClient.info.get_forecast_list(); + + let now = GLib.DateTime.new_now_local(); + let current = GLib.DateTime.new_from_unix_local(0); + let infos = []; + for (let i = 0; i < forecasts.length; i++) { + const [valid, timestamp] = forecasts[i].get_value_update(); + if (!valid || timestamp === 0) + continue; // 0 means 'never updated' + + const datetime = GLib.DateTime.new_from_unix_local(timestamp); + if (now.difference(datetime) > 0) + continue; // Ignore earlier forecasts + + if (datetime.difference(current) < GLib.TIME_SPAN_HOUR) + continue; // Enforce a minimum interval of 1h + + if (infos.push(forecasts[i]) == 5) + break; // Use a maximum of five forecasts + + current = datetime; + } + return infos; + } + + _addForecasts() { + let layout = this._forecastGrid.layout_manager; + + let infos = this._getInfos(); + if (this._forecastGrid.text_direction == Clutter.TextDirection.RTL) + infos.reverse(); + + let col = 0; + infos.forEach(fc => { + const [valid_, timestamp] = fc.get_value_update(); + let timeStr = Util.formatTime(new Date(timestamp * 1000), { + timeOnly: true + }); + const [, tempValue] = fc.get_value_temp(imports.gi.GWeather.TemperatureUnit.DEFAULT); + const tempPrefix = tempValue >= 0 ? ' ' : ''; + + let time = new St.Label({ + text: timeStr, + x_align: Clutter.ActorAlign.CENTER, + }); + time.style = "font-size: 0.8em;" + let icon = new St.Icon({ + style_class: 'weather-forecast-icon', + icon_name: fc.get_symbolic_icon_name(), + x_align: Clutter.ActorAlign.CENTER, + x_expand: true, + }); + let temp = new St.Label({ + text: '%s%.0f°'.format(tempPrefix, tempValue), + x_align: Clutter.ActorAlign.CENTER, + }); + + temp.clutter_text.ellipsize = imports.gi.Pango.EllipsizeMode.NONE; + time.clutter_text.ellipsize = imports.gi.Pango.EllipsizeMode.NONE; + + layout.attach(time, col, 0, 1, 1); + layout.attach(icon, col, 1, 1, 1); + layout.attach(temp, col, 2, 1, 1); + col++; + }); + } + + _setStatusLabel(text) { + let layout = this._forecastGrid.layout_manager; + let label = new St.Label({ text }); + layout.attach(label, 0, 0, 1, 1); + } + + _updateForecasts() { + this._forecastGrid.destroy_all_children(); + + if (!this._weatherClient.hasLocation) { + this._setStatusLabel(_("Select a location…")); + return; + } + + let info = this._weatherClient.info; + let loc = info.get_location(); + if (loc.get_level() !== imports.gi.GWeather.LocationLevel.CITY && loc.has_coords()) { + let world = imports.gi.GWeather.Location.get_world(); + loc = world.find_nearest_city(...loc.get_coords()); + } + this._titleLocation.text = loc.get_name(); + + if (this._weatherClient.loading) { + this._setStatusLabel(_("Loading…")); + return; + } + + if (info.is_valid()) { + this._addForecasts(); + return; + } + + if (info.network_error()) + this._setStatusLabel(_("Go online for weather information")); + else + this._setStatusLabel(_("Weather information is currently unavailable")); + } + + _sync() { + this.visible = this._weatherClient.available; + + if (!this.visible) + return; + + this._titleLocation.visible = this._weatherClient.hasLocation; + + this._updateForecasts(); + } +}); + +function _isToday(date) { + let now = new Date(); + return now.getYear() == date.getYear() && + now.getMonth() == date.getMonth() && + now.getDate() == date.getDate(); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js new file mode 100644 index 0000000..a0c1d16 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js @@ -0,0 +1,456 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.buttonPressEventID = global.stage.connect("button-press-event", () => { + if(this.arcMenu.isOpen && this.backButton.visible){ + let event = Clutter.get_current_event(); + if(event.get_button() === 8){ + this.backButton.activate(event); + } + } + }); + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'left-panel' + }); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true, + reactive:true + }); + this.leftBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ vertical: true }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBox.add_child(separator); + + this.backButton = new MW.BackMenuItem(this); + this.navigateBox.add_child(this.backButton.actor); + + this.viewProgramsButton = new MW.ViewAllPrograms(this); + this.navigateBox.add_child(this.viewProgramsButton.actor); + this.leftBox.add_child(this.navigateBox); + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 5px 10px 0px 10px;"; + this.leftBox.add_child(this.searchBox.actor); + } + + this.rightBox = new St.BoxLayout({ + vertical: true, + style_class: 'right-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.placesShortcuts = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this.bookmarksShorctus = false; + this.softwareShortcuts = false; + + if(!this._settings.get_boolean('disable-user-avatar')){ + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.rightBox.add_child(this.user.actor); + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.rightBox.add_child(separator); + } + + this.shortcutsBox = new St.BoxLayout({ + vertical: true + }); + + this.shortcutsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.rightBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //draw bottom right horizontal separator + logic to determine if should show + let shouldDraw = false; + if(this._settings.get_value('directory-shortcuts-list').deep_unpack().length > 0){ + this.placesShortcuts = true; + } + if(this._settings.get_value('application-shortcuts-list').deep_unpack().length > 0){ + this.softwareShortcuts = true; + } + + //check to see if should draw separator + if(this.placesShortcuts && (this._settings.get_boolean('show-external-devices') || this.softwareShortcuts || this._settings.get_boolean('show-bookmarks')) ) + shouldDraw = true; + if(shouldDraw){ + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //External Devices and Bookmarks Shortcuts + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this.shortcutsBox.add_child(this.externalDevicesBox); + + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + //create new section for Power, Lock, Logout, Suspend Buttons + this.actionsBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.END, + style: "spacing: 6px; padding: 0px;" + }); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + this.rightBox.add_child(this.actionsBox); + + this.extraCategoriesLinksBox = new St.BoxLayout({ + vertical: true + }); + this.extraCategoriesLinksBox.hide(); + this.extraCategoriesSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + + let extraCategoriesLinksLocation = this._settings.get_enum('arcmenu-extra-categories-links-location'); + if(extraCategoriesLinksLocation === Constants.MenuItemLocation.TOP) + this.leftBox.insert_child_below(this.extraCategoriesLinksBox, this.applicationsScrollBox); + else + this.navigateBox.insert_child_above(this.extraCategoriesLinksBox, this.navigateBox.get_child_at_index(0)); + this.extraCategoriesLinksBox.add_child(this.extraCategoriesSeparator); + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + _createExtraCategoriesLinks(){ + this.showExtraCategoriesLinksBox = false; + let extraCategories = this._settings.get_value("arcmenu-extra-categories-links").deep_unpack(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + + //Don't create extra categories quick links if + //the default menu view is the categories list + if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST) + return; + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + //If ArcMenu layout set to "Pinned Apps" default view and Extra Categories "Pinned Apps" is enabled, + //do not display "Pinned Apps" as an extra category -- Same for "Frequent Apps" + if(categoryEnum == Constants.CategoryType.PINNED_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.FREQUENT_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.ALL_PROGRAMS && shouldShow && defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS) + shouldShow = false; + if(shouldShow){ + let extraCategoryItem = this.categoryDirectories.get(categoryEnum); + if(!extraCategoryItem) + continue; + + this.showExtraCategoriesLinksBox = true; + if(extraCategoryItem.get_parent()) + extraCategoryItem.get_parent().remove_child(extraCategoryItem); + + this.extraCategoriesLinksBox.insert_child_below(extraCategoryItem, this.extraCategoriesSeparator); + } + } + if(this.showExtraCategoriesLinksBox) + this.extraCategoriesLinksBox.show(); + else + this.extraCategoriesLinksBox.hide(); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + this.hasPinnedApps = true; + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + //If ArcMenu layout set to "Pinned Apps" default view and Extra Categories "Pinned Apps" is enabled, + //do not display "Pinned Apps" as an extra category -- Same for "Frequent Apps" + if(categoryEnum == Constants.CategoryType.PINNED_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.FREQUENT_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + + this._createExtraCategoriesLinks(); + } + + displayPinnedApps(){ + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS){ + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + } + else if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else if(defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else if(defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + super.displayPinnedApps(); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayAllApps(showBackButton = true){ + super.displayAllApps(); + this.viewProgramsButton.actor.hide(); + + if(showBackButton){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + } + else{ + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.backButton.actor.hide(); + } + } + + displayCategories(){ + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS || defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else{ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + } + + super.displayCategories(); + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + this.displayPinnedApps(); + else if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST) + this.displayCategories(); + else if(defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + this.displayFrequentApps(); + else if(defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS) + this.displayAllApps(false); + } + + displayCategoryAppList(appList, category){ + super.displayCategoryAppList(appList, category); + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + } + + displayFrequentApps(){ + this._clearActorsFromBox(); + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + let appList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let isContainedInCategory = false; + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST, null, isContainedInCategory); + appList.push(item); + } + } + let activeMenuItemSet = false; + for (let i = 0; i < appList.length; i++) { + let item = appList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_child(item.actor); + if(!activeMenuItemSet){ + activeMenuItemSet = true; + this.activeMenuItem = item; + } + } + } + + displayRecentFiles(){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + super.displayRecentFiles(); + } + + _clearActorsFromBox(box){ + //keep track of the previous category for the back button. + this.previousCategoryType = this.activeCategoryType; + super._clearActorsFromBox(box); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(!searchBox.isEmpty()){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } + + destroy(){ + if(this.buttonPressEventID){ + global.stage.disconnect(this.buttonPressEventID); + this.buttonPressEventID = null; + } + super.destroy() + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js new file mode 100644 index 0000000..dce09de --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js @@ -0,0 +1,285 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 4, + RowSpacing: 4, + VerticalMainBox: true, + DefaultMenuWidth: 460, + DefaultIconGridStyle: 'LargeRectIconGrid', + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBoxStyle = "margin: 0px 0px 10px 0px; spacing: 0px; background-color: rgba(186, 196,201, 0.1); padding: 11px 5px;"+ + "border-color:rgba(186, 196,201, 0.2); border-bottom-width: 1px;"; + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: this.topBoxStyle + }); + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.style = "margin: 5px 15px 5px 15px;"; + this.topBox.add_child(this.searchBox.actor); + this.subMainBox.add_child(this.topBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + style: "padding-bottom: 10px;" + }); + this.applicationsScrollBox = this._createScrollBox({ + clip_to_allocation: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px;background-color:rgba(186, 196,201, 0.1) ; padding: 12px 5px;"+ + "border-color:rgba(186, 196,201, 0.2) ; border-top-width: 1px;"; + + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "margin: 0px 15px; spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.user.x_expand = true; + this.user.x_align = Clutter.ActorAlign.FILL; + this.actionsBox.add_child(this.user.actor); + + + let filesButton = new MW.ShortcutMenuItem(this, _("Files"), "system-file-manager", "org.gnome.Nautilus.desktop", Constants.DisplayType.BUTTON); + if(filesButton.shouldShow) + this.actionsBox.add_child(filesButton.actor); + + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + + this.leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(this.leaveButton.actor); + + this.backButton = this._createNavigationButtons(_("All Apps"), MW.BackButton) + this.allAppsButton = this._createNavigationButtons(_("Pinned"), MW.AllAppsButton) + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.IconGridSize = 42; + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + } + + setDefaultMenuView(){ + this.setGridLayout(Constants.DisplayType.GRID, 4, 4); + this.layoutProperties.IconGridSize = 42; + super.setDefaultMenuView(); + this.activeCategory = _("Pinned"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + + displayAllApps(){ + this.activeCategory = _("All Apps"); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + + this.setGridLayout(Constants.DisplayType.LIST, 1, 3); + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 4, 4, false); + } + + updateStyle(){ + super.updateStyle(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + const RoundBottomBorder = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + const RoundTopBorder = "border-radius: " + borderRadius + "px " + borderRadius + "px 0px 0px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + RoundBottomBorder; + this.topBox.style = this.topBoxStyle + RoundTopBorder; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + } + + setGridLayout(displayType, columns, spacing, setStyle = true){ + if(setStyle){ + this.applicationsGrid.x_align = displayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER; + displayType === Constants.DisplayType.LIST ? this.applicationsBox.add_style_class_name('margin-box') : this.applicationsBox.remove_style_class_name('margin-box'); + } + + this.applicationsGrid.layout_manager.column_spacing = spacing; + this.applicationsGrid.layout_manager.row_spacing = spacing; + this.layoutProperties.DisplayType = displayType; + } + + loadCategories() { + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this.layoutProperties.IconGridSize = 26; + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + displayPinnedApps() { + this._clearActorsFromBox(this.applicationsBox); + this.activeCategory = _("Pinned"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + this._hideNavigationButtons(); + + if(category === Constants.CategoryType.PINNED_APPS){ + this.subMainBox.insert_child_at_index(this.allAppsButton, 1); + } + else if(category === Constants.CategoryType.ALL_PROGRAMS){ + this.subMainBox.insert_child_at_index(this.backButton, 1); + } + } + + _hideNavigationButtons(){ + if(this.subMainBox.contains(this.backButton)) + this.subMainBox.remove_child(this.backButton); + if(this.subMainBox.contains(this.allAppsButton)) + this.subMainBox.remove_child(this.allAppsButton); + } + + _createNavigationButtons(buttonTitle, ButtonClass){ + let navButton = this.createLabelRow(buttonTitle); + navButton.remove_child(navButton._ornamentLabel); + navButton.label.y_align = Clutter.ActorAlign.CENTER; + navButton.style = 'padding: 0px 15px 10px 15px;' + navButton.add_child(new ButtonClass(this)); + return navButton; + } + + _onSearchBoxChanged(searchBox, searchString){ + this.applicationsBox.remove_style_class_name('margin-box'); + if(!searchBox.isEmpty()) + this._hideNavigationButtons(); + super._onSearchBoxChanged(searchBox, searchString); + } + + destroy(){ + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + this.leaveButton.destroy(); + this.backButton.destroy(); + this.allAppsButton.destroy(); + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js new file mode 100644 index 0000000..af9d2c4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js @@ -0,0 +1,1128 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, GMenu, Gtk, Shell, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const appSys = Shell.AppSystem.get_default(); +const ArcSearch = Me.imports.search; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MenuLayouts = Me.imports.menulayouts; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const { RecentFilesManager } = Me.imports.recentFilesManager; +const Utils = Me.imports.utils; + +//This class handles the core functionality of all the menu layouts. +//Each menu layout extends this class. +var BaseLayout = class { + constructor(menuButton, layoutProperties){ + this.menuButton = menuButton; + this._settings = menuButton._settings; + this.mainBox = menuButton.mainBox; + this.contextMenuManager = menuButton.contextMenuManager; + this.subMenuManager = menuButton.subMenuManager; + this.arcMenu = menuButton.arcMenu; + this.section = menuButton.section; + this.layout = this._settings.get_enum('menu-layout'); + this.layoutProperties = layoutProperties; + this._focusChild = null; + this.shouldLoadPinnedApps = true; + this.hasPinnedApps = false; + + if(this.layoutProperties.Search){ + this.searchResults = new ArcSearch.SearchResults(this); + this.searchBox = new MW.SearchBox(this); + this._searchBoxChangedId = this.searchBox.connect('search-changed', this._onSearchBoxChanged.bind(this)); + this._searchBoxKeyPressId = this.searchBox.connect('entry-key-press', this._onSearchBoxKeyPress.bind(this)); + } + + this._mainBoxKeyPressId = this.mainBox.connect('key-press-event', this._onMainBoxKeyPress.bind(this)); + + this._tree = new GMenu.Tree({ menu_basename: 'applications.menu' }); + this._treeChangedId = this._tree.connect('changed', () => this.reloadApplications()); + + this._gnomeFavoritesReloadID = AppFavorites.getAppFavorites().connect('changed', () => { + if(this.categoryDirectories){ + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FAVORITES); + if(categoryMenuItem) + this._loadGnomeFavorites(categoryMenuItem); + } + }); + + this.mainBox.vertical = this.layoutProperties.VerticalMainBox; + + this.createLayout(); + this.updateStyle(); + } + + createLayout(){ + this.disableFadeEffect = this._settings.get_boolean('disable-scrollview-fade-effect'); + this.activeCategoryType = -1; + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.applicationsGrid = new St.Widget({ + x_expand: true, + x_align: this.layoutProperties.DisplayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.applicationsGrid); + } + + setDefaultMenuView(){ + if(this.layoutProperties.Search){ + this.searchBox.clearWithoutSearchChangeEvent(); + this.searchResults.setTerms([]); + } + + this._clearActorsFromBox(); + this.resetScrollBarPosition(); + } + + getColumnsFromActor(actor){ + let gridIconWidth = this.getActorWidthFromStyleClass(actor.name); + return this.getBestFitColumns(gridIconWidth); + } + + getColumnsFromGridIconSizeSetting(){ + let gridIconWidth; + let iconSizeEnum = this._settings.get_enum("menu-item-grid-icon-size"); + + if(iconSizeEnum === Constants.GridIconSize.DEFAULT) + gridIconWidth = this.getActorWidthFromStyleClass(this.layoutProperties.DefaultIconGridStyle); + else{ + Constants.GridIconInfo.forEach((info) => { + if(iconSizeEnum === info.ENUM){ + gridIconWidth = info.SIZE; + return; + } + }); + } + return this.getBestFitColumns(gridIconWidth); + } + + getBestFitColumns(gridIconWidth){ + let width = this.layoutProperties.MenuWidth; + let spacing = this.layoutProperties.ColumnSpacing; + let columns = Math.floor(width / (gridIconWidth + spacing)); + return columns; + } + + getActorWidthFromStyleClass(name){ + let size; + + Constants.GridIconInfo.forEach((info) => { + if(name === info.NAME){ + size = info.SIZE; + return; + } + }); + return size; + } + + resetScrollBarPosition(){ + let appsScrollBoxAdj; + + if(this.applicationsScrollBox){ + appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.categoriesScrollBox){ + appsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.shortcutsScrollBox){ + appsScrollBoxAdj = this.shortcutsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.actionsScrollBox){ + appsScrollBoxAdj = this.actionsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + } + + reloadApplications(){ + //Don't reload applications if the menu is open. + //Instead, reload on menu-closed event. + //Prevents the menu from jumping to its default view + //when reloadApplications() is called. + if(this.arcMenu.isOpen){ + if(!this._menuClosedID){ + this._menuClosedID = this.arcMenu.connect('menu-closed', () => { + this.reloadApplications(); + if(this._menuClosedID){ + this.arcMenu.disconnect(this._menuClosedID); + this._menuClosedID = null; + } + }); + } + return; + } + + if(this.applicationsMap){ + this.applicationsMap.forEach((value,key,map)=>{ + value.destroy(); + }); + this.applicationsMap = null; + } + + if(this.categoryDirectories){ + this.categoryDirectories.forEach((value,key,map)=>{ + value.destroy(); + }); + this.categoryDirectories = null; + } + + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + if(this.layoutProperties.Search){ + this.searchBox.updateStyle(this._settings.get_boolean('disable-searchbox-border')) + customStyle ? this.searchResults.setStyle('arc-menu-status-text') : this.searchResults.setStyle(''); + if(customStyle){ + this.searchBox.remove_style_class_name('default-search-entry'); + this.searchBox.add_style_class_name('arc-search-entry'); + } + else{ + this.searchBox.remove_style_class_name('arc-search-entry'); + this.searchBox.add_style_class_name('default-search-entry'); + } + } + } + + loadCategories(displayType = Constants.DisplayType.LIST){ + this.applicationsMap = new Map(); + this._tree.load_sync(); + let root = this._tree.get_root_directory(); + let iter = root.iter(); + let nextType; + while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) { + if (nextType == GMenu.TreeItemType.DIRECTORY) { + let dir = iter.get_directory(); + if (!dir.get_is_nodisplay()) { + let categoryId = dir.get_menu_id(); + let categoryMenuItem; + if(displayType === Constants.DisplayType.SIMPLE_CATEGORY) + categoryMenuItem = new MW.SimpleMenuItem(this, dir); + else if(displayType === Constants.DisplayType.SUBMENU_CATEGORY) + categoryMenuItem = new MW.CategorySubMenuItem(this, dir); + else + categoryMenuItem = new MW.CategoryMenuItem(this, dir, displayType); + this.categoryDirectories.set(categoryId, categoryMenuItem); + let foundRecentlyInstallApp = this._loadCategory(categoryId, dir); + categoryMenuItem.setRecentlyInstalledIndicator(foundRecentlyInstallApp); + //Sort the App List Alphabetically + categoryMenuItem.appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + } + } + } + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.ALL_PROGRAMS); + if(categoryMenuItem){ + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + //Show Recently Installed Indicator on All Programs category + if(value.isRecentlyInstalled && !categoryMenuItem.isRecentlyInstalled) + categoryMenuItem.setRecentlyInstalledIndicator(true); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + categoryMenuItem.appList = appList; + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FAVORITES); + if(categoryMenuItem){ + this._loadGnomeFavorites(categoryMenuItem); + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FREQUENT_APPS); + if(categoryMenuItem){ + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()) + categoryMenuItem.appList.push(mostUsed[i]); + } + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this.hasPinnedApps = true; + categoryMenuItem.appList = categoryMenuItem.appList.concat(this.pinnedAppsArray); + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + if(categoryMenuItem){ + this._loadRecentFiles(categoryMenuItem); + } + + } + + _loadCategory(categoryId, dir, submenuItem) { + let iter = dir.iter(); + let nextType; + let foundRecentlyInstallApp = false; + let isLayoutSimple2 = this.layout === Constants.MenuLayout.SIMPLE_2; + while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) { + if (nextType == GMenu.TreeItemType.ENTRY) { + let entry = iter.get_entry(); + let id; + try { + id = entry.get_desktop_file_id(); + } catch (e) { + continue; + } + let app = appSys.lookup_app(id); + if (!app) + app = new Shell.App({ app_info: entry.get_app_info() }); + if (app.get_app_info().should_show()){ + let item = this.applicationsMap.get(app); + if (!item) { + let isContainedInCategory = true; + item = new MW.ApplicationMenuItem(this, app, this.layoutProperties.DisplayType, null, isContainedInCategory); + } + let disabled = this._settings.get_boolean("disable-recently-installed-apps") + if(!disabled && item.isRecentlyInstalled) + foundRecentlyInstallApp = true; + if(!submenuItem){ + let categoryMenuItem = this.categoryDirectories.get(categoryId); + categoryMenuItem.appList.push(app); + this.applicationsMap.set(app, item); + } + else{ + submenuItem.applicationsMap.set(app, item); + } + } + } + else if (nextType == GMenu.TreeItemType.DIRECTORY) { + let subdir = iter.get_directory(); + if (!subdir.get_is_nodisplay()){ + if(this._settings.get_boolean('enable-sub-menus') && this.layoutProperties.DisplayType === Constants.DisplayType.LIST && !isLayoutSimple2){ + let submenuItem = this.applicationsMap.get(subdir); + if (!submenuItem) { + submenuItem = new MW.CategorySubMenuItem(this, subdir); + submenuItem._setParent(this.arcMenu); + let categoryMenuItem = this.categoryDirectories.get(categoryId); + categoryMenuItem.appList.push(subdir); + this.applicationsMap.set(subdir, submenuItem); + } + let recentlyInstallApp = this._loadCategory(categoryId, subdir, submenuItem); + if(recentlyInstallApp) + foundRecentlyInstallApp = true; + submenuItem.setRecentlyInstalledIndicator(foundRecentlyInstallApp); + } + else{ + let recentlyInstallApp = this._loadCategory(categoryId, subdir); + if(recentlyInstallApp) + foundRecentlyInstallApp = true; + } + } + } + } + return foundRecentlyInstallApp; + } + + setRecentlyInstalledIndicator(){ + let disabled = this._settings.get_boolean("disable-recently-installed-apps") + if(!disabled){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.setRecentlyInstalledIndicator(false); + for(let i = 0; i < categoryMenuItem.appList.length; i++){ + let item = this.applicationsMap.get(categoryMenuItem.appList[i]); + if(!item) + continue; + if(item instanceof MW.CategorySubMenuItem){ + item.setRecentlyInstalledIndicator(false); + for(let menuItem of item.applicationsMap.values()){ + if(menuItem.isRecentlyInstalled){ + item.setRecentlyInstalledIndicator(true); + break; + } + } + } + if(item.isRecentlyInstalled){ + categoryMenuItem.setRecentlyInstalledIndicator(true); + break; + } + } + } + } + } + + displayCategories(categoriesBox){ + if(!categoriesBox){ + categoriesBox = this.applicationsBox; + } + this._clearActorsFromBox(categoriesBox); + + this._futureActiveItem = false; + + for(let categoryMenuItem of this.categoryDirectories.values()){ + if(categoryMenuItem.get_parent()) + continue; + categoriesBox.add_child(categoryMenuItem.actor); + if(!this._futureActiveItem){ + this._futureActiveItem = categoryMenuItem; + } + } + + this.activeMenuItem = this._futureActiveItem; + } + + _loadGnomeFavorites(categoryMenuItem){ + let appList = AppFavorites.getAppFavorites().getFavorites(); + + //Show Recently Installed Indicator on GNOME favorites category + for(let i = 0; i < appList.length; i++){ + let item = this.applicationsMap.get(appList[i]); + if(item && item.isRecentlyInstalled && !categoryMenuItem.isRecentlyInstalled) + categoryMenuItem.setRecentlyInstalledIndicator(true); + } + + categoryMenuItem.appList = appList; + if(this.activeCategoryType === Constants.CategoryType.FAVORITES) + categoryMenuItem.displayAppList(); + } + + _loadRecentFiles(){ + if(!this.recentFilesManager) + this.recentFilesManager = new RecentFilesManager(); + } + + displayRecentFiles(box = this.applicationsBox, callback){ + const homeRegExp = new RegExp('^(' + GLib.get_home_dir() + ')'); + this._clearActorsFromBox(box); + this._futureActiveItem = false; + + this.recentFilesManager.filterRecentFiles(recentFile => { + let file = Gio.File.new_for_uri(recentFile.get_uri()); + let filePath = file.get_path(); + let name = recentFile.get_display_name(); + let icon = Gio.content_type_get_symbolic_icon(recentFile.get_mime_type()).to_string(); + let isContainedInCategory = true; + + let placeMenuItem = this.createMenuItem([name, icon, filePath], Constants.DisplayType.LIST, isContainedInCategory); + placeMenuItem._path = file.get_parent()?.get_path() // can be null + placeMenuItem.style = "padding-right: 15px;"; + placeMenuItem.description = recentFile.get_uri_display().replace(homeRegExp, '~'); + placeMenuItem.fileUri = recentFile.get_uri(); + + placeMenuItem._removeBtn = new MW.ArcMenuButtonItem(this, null, 'edit-delete-symbolic'); + placeMenuItem._removeBtn.toggleMenuOnClick = false; + placeMenuItem._removeBtn.x_align = Clutter.ActorAlign.END; + placeMenuItem._removeBtn.x_expand = true; + placeMenuItem._removeBtn.add_style_class_name("arcmenu-small-button"); + placeMenuItem._removeBtn.setIconSize(14); + placeMenuItem._removeBtn.connect('activate', () => { + try { + let recentManager = this.recentFilesManager.getRecentManager(); + recentManager.remove_item(placeMenuItem.fileUri); + } catch(err) { + log(err); + } + + placeMenuItem.cancelPopupTimeout(); + placeMenuItem.contextMenu?.close(); + box.remove_child(placeMenuItem); + placeMenuItem.destroy(); + }); + + placeMenuItem.add_child(placeMenuItem._removeBtn); + box.add_child(placeMenuItem); + + if(!this._futureActiveItem){ + this._futureActiveItem = placeMenuItem; + this.activeMenuItem = this._futureActiveItem; + } + + if(callback) + callback(); + }); + } + + _displayPlaces() { + var SHORTCUT_TRANSLATIONS = [_("Home"), _("Documents"), _("Downloads"), _("Music"), _("Pictures"), _("Videos"), _("Computer"), _("Network")]; + let directoryShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + for (let i = 0; i < directoryShortcuts.length; i++) { + let directory = directoryShortcuts[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + if(placeMenuItem) + this.shortcutsBox.add_child(placeMenuItem.actor); + } + } + + loadExtraPinnedApps(pinnedAppsArray, separatorIndex){ + let pinnedApps = pinnedAppsArray; + //if the extraPinnedApps array is empty, create a default list of apps. + if(!pinnedApps.length || !Array.isArray(pinnedApps)){ + pinnedApps = this._createExtraPinnedAppsList(); + } + + for(let i = 0;i < pinnedApps.length; i += 3){ + if(i === separatorIndex * 3 && i !== 0) + this._addSeparator(); + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem([pinnedApps[i], pinnedApps[i + 1], pinnedApps[i + 2]], Constants.DisplayType.BUTTON, isContainedInCategory); + placeMenuItem.actor.x_expand = false; + placeMenuItem.actor.y_expand = false; + placeMenuItem.actor.y_align = Clutter.ActorAlign.CENTER; + placeMenuItem.actor.x_align = Clutter.ActorAlign.CENTER; + this.actionsBox.add_child(placeMenuItem.actor); + } + } + + createMenuItem(menuItemArray, displayType, isContainedInCategory){ + let placeInfo, placeMenuItem; + let command = menuItemArray[2]; + let app = Shell.AppSystem.get_default().lookup_app(command); + + if(command === "ArcMenu_Home"){ + let homePath = GLib.get_home_dir(); + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(homePath), _("Home")); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Computer"){ + placeInfo = new PlaceDisplay.RootInfo(); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Network"){ + placeInfo = new PlaceDisplay.PlaceInfo('network', Gio.File.new_for_uri('network:///'), _('Network'),'network-workgroup-symbolic'); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Software"){ + let software = Utils.findSoftwareManager(); + if(software) + placeMenuItem = new MW.ShortcutMenuItem(this, _("Software"), 'system-software-install-symbolic', software, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Trash"){ + placeMenuItem = new MW.ShortcutMenuItem(this, _("Trash"), '', "ArcMenu_Trash", displayType, isContainedInCategory); + } + else if(command === Constants.ArcMenuSettingsCommand || command === "ArcMenu_Suspend" || command === "ArcMenu_LogOut" || command === "ArcMenu_PowerOff" + || command === "ArcMenu_Lock" || command === "ArcMenu_Restart" || command === "ArcMenu_HybridSleep" || command === "ArcMenu_Hibernate" || app){ + + placeMenuItem = new MW.ShortcutMenuItem(this, menuItemArray[0], menuItemArray[1], menuItemArray[2], displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Recent"){ + let uri = "recent:///"; + placeInfo = new MW.PlaceInfo(Gio.File.new_for_uri(uri), _(menuItemArray[0])); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command.startsWith("ArcMenu_")){ + let path = command.replace("ArcMenu_",''); + + if(path === "Documents") + path = imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS; + else if(path === "Downloads") + path = imports.gi.GLib.UserDirectory.DIRECTORY_DOWNLOAD; + else if(path === "Music") + path = imports.gi.GLib.UserDirectory.DIRECTORY_MUSIC; + else if(path === "Pictures") + path = imports.gi.GLib.UserDirectory.DIRECTORY_PICTURES; + else if(path === "Videos") + path = imports.gi.GLib.UserDirectory.DIRECTORY_VIDEOS; + + path = GLib.get_user_special_dir(path); + if (path !== null){ + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _(menuItemArray[0])); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + } + else{ + let path = command; + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _(menuItemArray[0]), (menuItemArray[1] !== "ArcMenu_Folder") ? Gio.icon_new_for_string(menuItemArray[1]) : null); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + return placeMenuItem; + } + + loadPinnedApps(){ + let pinnedApps = this._settings.get_strv('pinned-app-list'); + + this.pinnedAppsArray = null; + this.pinnedAppsArray = []; + + let categoryMenuItem = this.categoryDirectories ? this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS) : null; + let isContainedInCategory = categoryMenuItem ? true : false; + + for(let i = 0; i < pinnedApps.length; i += 3){ + if(i === 0 && pinnedApps[0] === "ArcMenu_WebBrowser") + this._updatePinnedAppsWebBrowser(pinnedApps); + + let pinnedAppsMenuItem = new MW.PinnedAppsMenuItem(this, pinnedApps[i], pinnedApps[i + 1], pinnedApps[i + 2], this.layoutProperties.DisplayType, isContainedInCategory); + pinnedAppsMenuItem.connect('saveSettings', ()=> { + let array = []; + for(let i = 0; i < this.pinnedAppsArray.length; i++){ + array.push(this.pinnedAppsArray[i]._name); + array.push(this.pinnedAppsArray[i]._iconPath); + array.push(this.pinnedAppsArray[i]._command); + } + this._settings.set_strv('pinned-app-list',array); + }); + this.pinnedAppsArray.push(pinnedAppsMenuItem); + } + + if(categoryMenuItem){ + categoryMenuItem.appList = null; + categoryMenuItem.appList = []; + categoryMenuItem.appList = categoryMenuItem.appList.concat(this.pinnedAppsArray); + } + } + + _updatePinnedAppsWebBrowser(pinnedApps){ + //Find the Default Web Browser, if found add to pinned apps list, if not found delete the placeholder. + //Will only run if placeholder is found. Placeholder only found with default settings set. + if(pinnedApps[0] === "ArcMenu_WebBrowser"){ + let browserName = ''; + try{ + //user may not have xdg-utils package installed which will throw error + let [res, stdout, stderr, status] = GLib.spawn_command_line_sync("xdg-settings get default-web-browser"); + let webBrowser = String.fromCharCode(...stdout); + browserName = webBrowser.split(".desktop")[0]; + browserName += ".desktop"; + } + catch(error){ + global.log("ArcMenu Error - Failed to find default web browser. Removing placeholder pinned app.") + } + + this._app = appSys.lookup_app(browserName); + if(this._app){ + pinnedApps[0] = this._app.get_name(); + pinnedApps[1] = ''; + pinnedApps[2] = this._app.get_id(); + } + else{ + pinnedApps.splice(0,3); + } + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + } + } + + displayPinnedApps(){ + this._clearActorsFromBox(); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + placesAddSeparator(id){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this._sections[id].add_child(separator); + } + + _redisplayPlaces(id) { + if(this._sections[id].get_n_children() > 0){ + this.bookmarksShorctus = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this._sections[id].destroy_all_children(); + } + this._createPlaces(id); + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + if(this.placesManager.get('network').length > 0) + this.networkDevicesShorctus = true; + if(this.placesManager.get('devices').length > 0) + this.externalDevicesShorctus=true; + if(this.placesManager.get('bookmarks').length > 0) + this.bookmarksShorctus = true; + + if(this._settings.get_boolean('show-bookmarks')){ + if(id === 'bookmarks' && places.length > 0){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + //create a separator if bookmark and software shortcut are both shown + if(this.bookmarksShorctus && this.softwareShortcuts){ + this.placesAddSeparator(id); + } + } + } + if(this._settings.get_boolean('show-external-devices')){ + if(id === 'devices'){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + if((this.externalDevicesShorctus && !this.networkDevicesShorctus) && (this.bookmarksShorctus || this.softwareShortcuts)) + this.placesAddSeparator(id); + } + if(id === 'network'){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + if(this.networkDevicesShorctus && (this.bookmarksShorctus || this.softwareShortcuts)) + this.placesAddSeparator(id); + } + } + } + + setActiveCategory(category, setActive = true){ + this._futureActiveItem = category; + this.activeMenuItem = category; + } + + setFrequentAppsList(categoryMenuItem){ + categoryMenuItem.appList = []; + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()) + categoryMenuItem.appList.push(mostUsed[i]); + } + } + + _clearActorsFromBox(box){ + this.recentFilesManager?.cancelCurrentQueries(); + if(!box){ + box = this.applicationsBox; + this.activeCategoryType = -1; + } + let parent = box.get_parent(); + if(parent instanceof St.ScrollView){ + let scrollBoxAdj = parent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = box.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + box.remove_child(actor); + } + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _displayAppList(apps, category, grid){ + this.activeCategoryType = category; + grid.remove_all_children(); + let count = 0; + let top = -1; + let left = 0; + this._futureActiveItem = false; + let currentCharacter; + let alphabetizeAllPrograms = this._settings.get_boolean("alphabetize-all-programs") && this.layoutProperties.DisplayType === Constants.DisplayType.LIST; + let rtl = this.mainBox.get_text_direction() == Clutter.TextDirection.RTL; + let columns = -1; + + for (let i = 0; i < apps.length; i++) { + let app = apps[i]; + let item; + let shouldShow = true; + + if(category === Constants.CategoryType.PINNED_APPS || category === Constants.CategoryType.HOME_SCREEN){ + item = app; + if(!item.shouldShow) + shouldShow = false; + } + else{ + item = this.applicationsMap.get(app); + if (!item) { + item = new MW.ApplicationMenuItem(this, app, this.layoutProperties.DisplayType); + this.applicationsMap.set(app, item); + } + } + + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + + if(shouldShow){ + if(columns === -1){ + if(grid.layout_manager.forceGridColumns) + columns = grid.layout_manager.forceGridColumns; + else if(this.layoutProperties.DisplayType === Constants.DisplayType.GRID) + columns = this.getColumnsFromActor(item); + else + columns = 1; + grid.layout_manager.gridColumns = columns; + } + + if(!rtl && (count % columns === 0)){ + top++; + left = 0; + } + else if(rtl && (left === 0)){ + top++; + left = columns; + } + + if(alphabetizeAllPrograms && category === Constants.CategoryType.ALL_PROGRAMS){ + if(currentCharacter !== app.get_name().charAt(0).toLowerCase()){ + currentCharacter = app.get_name().charAt(0).toLowerCase(); + + let label = this._createLabelWithSeparator(currentCharacter.toUpperCase()); + grid.layout_manager.attach(label, left, top, 1, 1); + top++; + } + } + + grid.layout_manager.attach(item, left, top, 1, 1); + item.gridLocation = [left, top]; + + if(item instanceof MW.CategorySubMenuItem){ + top++; + grid.layout_manager.attach(item.menu.actor, left, top, 1, 1); + } + + if(!rtl) + left++; + else if(rtl) + left--; + count++; + + if(!this._futureActiveItem && grid === this.applicationsGrid){ + this._futureActiveItem = item; + } + } + } + if(this.applicationsBox && !this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.add_child(this.applicationsGrid); + if(this._futureActiveItem) + this.activeMenuItem = this._futureActiveItem; + } + + displayAllApps(){ + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + } + + get activeMenuItem() { + return this._activeMenuItem; + } + + set activeMenuItem(item) { + let itemChanged = item !== this._activeMenuItem; + if(itemChanged){ + this._activeMenuItem = item; + if(this.arcMenu.isOpen && item && this.layoutProperties.SupportsCategoryOnHover) + item.grab_key_focus(); + else if(this.arcMenu.isOpen) + this.mainBox.grab_key_focus(); + if(this.layout === Constants.MenuLayout.LAUNCHER && !this.layoutProperties.StandaloneRunner && item) + this.createActiveSearchItemPanel(item); + } + } + + _onSearchBoxChanged(searchBox, searchString) { + if(searchBox.isEmpty()){ + this.searchResults.hide(); + this.setDefaultMenuView(); + } + else{ + this._clearActorsFromBox(); + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.applicationsBox.add_child(this.searchResults); + this.searchResults.show(); + searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); + this.searchResults.setTerms(searchString.split(/\s+/)); + } + } + + _onSearchBoxKeyPress(searchBox, event) { + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Up: + case Clutter.KEY_Down: + case Clutter.KEY_Left: + case Clutter.KEY_Right: + let direction; + if (symbol === Clutter.KEY_Down || symbol === Clutter.KEY_Up) + return Clutter.EVENT_PROPAGATE; + if (symbol === Clutter.KEY_Right) + direction = St.DirectionType.RIGHT; + if (symbol === Clutter.KEY_Left) + direction = St.DirectionType.LEFT; + + let cursorPosition = this.searchBox.clutter_text.get_cursor_position(); + + if(cursorPosition === Constants.CaretPosition.END && symbol === Clutter.KEY_Right) + cursorPosition = Constants.CaretPosition.END; + else if(cursorPosition === Constants.CaretPosition.START && symbol === Clutter.KEY_Left) + cursorPosition = Constants.CaretPosition.START; + else + cursorPosition = Constants.CaretPosition.MIDDLE; + + if(cursorPosition === Constants.CaretPosition.END || cursorPosition === Constants.CaretPosition.START){ + let navigateActor = this.activeMenuItem; + if(this.searchResults.hasActiveResult()){ + navigateActor = this.searchResults.getTopResult(); + if(navigateActor.has_style_pseudo_class("active")){ + navigateActor.grab_key_focus(); + return this.mainBox.navigate_focus(navigateActor, direction, false); + } + navigateActor.grab_key_focus(); + return Clutter.EVENT_STOP; + } + if(!navigateActor) + return Clutter.EVENT_PROPAGATE; + return this.mainBox.navigate_focus(navigateActor, direction, false); + } + return Clutter.EVENT_PROPAGATE; + default: + return Clutter.EVENT_PROPAGATE; + } + } + + _onMainBoxKeyPress(actor, event) { + if (event.has_control_modifier()) { + if(this.searchBox) + this.searchBox.grab_key_focus(); + return Clutter.EVENT_PROPAGATE; + } + + let symbol = event.get_key_symbol(); + let unicode = Clutter.keysym_to_unicode(symbol); + + switch (symbol) { + case Clutter.KEY_BackSpace: + if(this.searchBox && !this.searchBox.hasKeyFocus() && !this.searchBox.isEmpty()){ + this.searchBox.grab_key_focus(); + let newText = this.searchBox.getText().slice(0, -1); + this.searchBox.setText(newText); + } + return Clutter.EVENT_PROPAGATE; + case Clutter.KEY_Up: + case Clutter.KEY_Down: + case Clutter.KEY_Left: + case Clutter.KEY_Right: + let direction; + if (symbol === Clutter.KEY_Down) + direction = St.DirectionType.DOWN; + if (symbol === Clutter.KEY_Right) + direction = St.DirectionType.RIGHT + if (symbol === Clutter.KEY_Up) + direction = St.DirectionType.UP; + if (symbol === Clutter.KEY_Left) + direction = St.DirectionType.LEFT; + + if(this.layoutProperties.Search && this.searchBox.hasKeyFocus() && this.searchResults.hasActiveResult() && this.searchResults.get_parent()){ + if(this.searchResults.getTopResult().has_style_pseudo_class("active")){ + this.searchResults.getTopResult().actor.grab_key_focus(); + return actor.navigate_focus(global.stage.key_focus, direction, false); + } + this.searchResults.getTopResult().actor.grab_key_focus(); + return Clutter.EVENT_STOP; + } + else if(global.stage.key_focus === this.mainBox && symbol === Clutter.KEY_Up){ + return actor.navigate_focus(global.stage.key_focus, direction, true); + } + else if(global.stage.key_focus === this.mainBox){ + this.activeMenuItem.grab_key_focus(); + return Clutter.EVENT_STOP; + } + + return actor.navigate_focus(global.stage.key_focus, direction, false); + case Clutter.KEY_Tab: + case Clutter.KEY_KP_Tab: + case Clutter.KEY_KP_Enter: + case Clutter.KEY_Return: + case Clutter.KEY_Escape: + return Clutter.EVENT_PROPAGATE; + default: + if (unicode !== 0 && this.searchBox) { + global.stage.set_key_focus(this.searchBox.clutter_text); + let synthEvent = event.copy(); + synthEvent.set_source(this.searchBox.clutter_text); + this.searchBox.clutter_text.event(synthEvent, false); + } + } + return Clutter.EVENT_PROPAGATE; + } + + destroy(){ + if(this.recentFilesManager){ + this.recentFilesManager.destroy(); + this.recentFilesManager = null; + } + + if(this._treeChangedId){ + this._tree.disconnect(this._treeChangedId); + this._treeChangedId = null; + this._tree = null; + } + + if(this.applicationsBox){ + if(this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.remove_child(this.applicationsGrid); + } + + if(this.network){ + this.network.destroy(); + this.networkMenuItem.destroy(); + } + + if(this.computer){ + this.computer.destroy(); + this.computerMenuItem.destroy(); + } + + if(this.placesManager){ + for(let id in this._sections){ + this._sections[id].get_children().forEach((child) =>{ + child.destroy(); + }); + }; + if(this.placeManagerUpdatedID){ + this.placesManager.disconnect(this.placeManagerUpdatedID); + this.placeManagerUpdatedID = null; + } + this.placesManager.destroy(); + this.placesManager = null + } + + if(this._searchBoxChangedId){ + this.searchBox?.disconnect(this._searchBoxChangedId); + this._searchBoxChangedId = null;; + } + if(this._searchBoxKeyPressId){ + this.searchBox?.disconnect(this._searchBoxKeyPressId); + this._searchBoxKeyPressId = null; + } + if(this._searchBoxKeyFocusInId){ + this.searchBox?.disconnect(this._searchBoxKeyFocusInId); + this._searchBoxKeyFocusInId = null; + } + + if(this.searchBox) + this.searchBox.destroy(); + + if(this.searchResults){ + this.searchResults.setTerms([]); + this.searchResults.destroy(); + this.searchResults = null; + } + + if (this._mainBoxKeyPressId) { + this.mainBox.disconnect(this._mainBoxKeyPressId); + this._mainBoxKeyPressId = null; + } + + if(this._gnomeFavoritesReloadID){ + AppFavorites.getAppFavorites().disconnect(this._gnomeFavoritesReloadID); + this._gnomeFavoritesReloadID = null; + } + + if(this.pinnedAppsArray){ + for(let i = 0; i < this.pinnedAppsArray.length; i++){ + this.pinnedAppsArray[i].destroy(); + } + this.pinnedAppsArray = null; + } + + if(this.applicationsMap){ + this.applicationsMap.forEach((value,key,map)=>{ + value.destroy(); + }); + this.applicationsMap = null; + } + + if(this.categoryDirectories){ + this.categoryDirectories.forEach((value,key,map)=>{ + value.destroy(); + }); + this.categoryDirectories = null; + } + + this.mainBox.destroy_all_children(); + } + + _createScrollBox(params){ + let scrollBox = new St.ScrollView(params); + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', (action) => { + this._blockActivateEvent = true; + this.onPan(action, scrollBox); + }); + panAction.connect('gesture-cancel',(action) => this.onPanEnd(action, scrollBox)); + panAction.connect('gesture-end', (action) => this.onPanEnd(action, scrollBox)); + scrollBox.add_action(panAction); + + scrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + scrollBox.clip_to_allocation = true; + + return scrollBox; + } + + _createLabelWithSeparator(headerLabel){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.HEADER_LABEL, Constants.SeparatorAlignment.HORIZONTAL, headerLabel); + return separator; + } + + createLabelRow(title){ + let labelRow = new PopupMenu.PopupMenuItem(_(title), { + hover: false, + can_focus: false + }); + labelRow.actor.add_style_pseudo_class = () => { return false;}; + labelRow.label.style = 'font-weight: bold;'; + return labelRow; + } + + _keyFocusIn(actor) { + if (this._focusChild == actor) + return; + this._focusChild = actor; + Utils.ensureActorVisibleInScrollView(actor); + } + + onPan(action, scrollbox) { + let [dist_, dx_, dy] = action.get_motion_delta(0); + let adjustment = scrollbox.get_vscroll_bar().get_adjustment(); + adjustment.value -= dy; + return false; + } + + onPanEnd(action, scrollbox) { + let velocity = -action.get_velocity(0)[2]; + let adjustment = scrollbox.get_vscroll_bar().get_adjustment(); + let endPanValue = adjustment.value + velocity * 2; + adjustment.value = endPanValue; + } +}; diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js new file mode 100644 index 0000000..fefdcd6 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js @@ -0,0 +1,206 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true, + style_class: 'right-panel-plus70' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus70 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'left-panel-small ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.leftBox.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + this.actionsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.actionsBox.style = "padding: 5px 0px 0px 0px;" + this.leftBox.add_child(this.actionsBox); + + //create new section for Power, Lock, Logout, Suspend Buttons + this.sessionBox = new St.BoxLayout({ + vertical: false, + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.END, + x_align: Clutter.ActorAlign.CENTER + }); + this.sessionBox.style = "spacing: 6px;"; + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.sessionBox.add_child(powerButton); + } + } + this.leftBox.add_child(this.sessionBox); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.loadCategories(); + this.loadPinnedApps(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + loadExtraPinnedApps(){ + this.actionsBox.destroy_all_children(); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + let pinnedApps = this._settings.get_strv('brisk-shortcuts-list'); + + for(let i = 0;i < pinnedApps.length; i += 3){ + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem([pinnedApps[i],pinnedApps[i+1], pinnedApps[i+2]], Constants.DisplayType.LIST, isContainedInCategory); + if(placeMenuItem){ + this.actionsBox.add_child(placeMenuItem.actor); + } + } + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js new file mode 100644 index 0000000..46107c5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js @@ -0,0 +1,184 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * Budgie.js Layout Created By: MagneFire https://gitlab.com/MagneFire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MAX, Constants.SeparatorAlignment.HORIZONTAL); + separator.style += "margin-bottom: 6px;"; + this.mainBox.add_child(separator); + } + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + vertical: true, + style_class: 'right-panel-plus70', + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus70 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + // Disable horizontal scrolling, hide vertical scrollbar, but allow vertical scrolling. + this.applicationsScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel-small ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + this.leftBox.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + if(this._settings.get_boolean('enable-activities-shortcut')){ + this.activitiesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.activities = new MW.ActivitiesMenuItem(this); + this.activitiesBox.add_child(this.activities.actor); + this.leftBox.add_child(this.activitiesBox); + } + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MAX, Constants.SeparatorAlignment.HORIZONTAL); + separator.style += "margin-top: 6px;"; + this.mainBox.add_child(separator); + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.actor.style = "padding-top: 8px; padding-bottom: 8px; margin: 0; spacing: 0;"; + categoryMenuItem._iconBin.visible = false; + } + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js new file mode 100644 index 0000000..e0d862c --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js @@ -0,0 +1,118 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 450, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START + }); + this.mainBox.add_child(this.subMainBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + reactive: true + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js new file mode 100644 index 0000000..79de6aa --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js @@ -0,0 +1,118 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + DefaultMenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.subMainBox= new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START + }); + this.mainBox.add_child(this.subMainBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + reactive:true + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;" + this.mainBox.add_child(this.searchBox.actor); + } + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js new file mode 100644 index 0000000..1b3f548 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js @@ -0,0 +1,376 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultMenuWidth: 650, + DefaultIconGridStyle: "MediumRectIconGrid", + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.style = "margin: 5px 15px 10px 15px;"; + + this.topBox.add_child(this.searchBox.actor); + this.mainBox.insert_child_at_index(this.topBox, 0); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + style: "padding-bottom: 10px;" + }); + this.applicationsScrollBox = this._createScrollBox({ + clip_to_allocation: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.arcMenu.box.style = "padding-bottom:0px;"; + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px; background-color:rgba(186, 196,201, 0.1); padding: 12px 25px;"+ + "border-color: rgba(186, 196,201, 0.2); border-top-width: 1px;"; + this.themeNodeBorderRadius = ""; + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + this.themeNodeBorderRadius + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true, + style: 'padding: 0px 25px;' + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 10, + row_spacing: 5, + column_homogeneous: true + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + layout.forceGridColumns = 2; + this.shortcutsBox.add_child(this.shortcutsGrid); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.actionsBox.add_child(this.user.actor); + + this.quickLinksBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER, + vertical: false, + style: 'spacing: 10px;' + }); + let path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD); + if (path !== null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Downloads")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.quickLinksBox.add_child(placeMenuItem.actor); + } + + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path !== null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.quickLinksBox.add_child(placeMenuItem.actor); + } + + let settingsButton = new MW.SettingsButton(this); + this.quickLinksBox.add_child(settingsButton.actor); + + this.leaveButton = new MW.LeaveButton(this); + this.quickLinksBox.add_child(this.leaveButton.actor); + + this.actionsBox.add_child(this.quickLinksBox); + + this.backButton = this._createNavigationButtons(_("All Apps"), MW.BackButton); + this.allAppsButton = this._createNavigationButtons(_("Pinned"), MW.AllAppsButton); + this.frequentAppsHeader = this._createNavigationButtons(_("Frequent"), null); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + + this.disableFrequentAppsID = this._settings.connect("changed::eleven-disable-frequent-apps", () => this.setDefaultMenuView()); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + } + + loadFrequentApps(){ + this.frequentAppsList = []; + + if(this._settings.get_boolean("eleven-disable-frequent-apps")) + return; + + let labelRow = this.createLabelRow(_("Frequent")); + this.applicationsBox.add_child(labelRow); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + + if(mostUsed.length < 1) + return; + + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + this.frequentAppsList.push(item); + } + } + + const MaxItems = 8; + if(this.frequentAppsList.length > MaxItems) + this.frequentAppsList.splice(MaxItems); + } + + setDefaultMenuView(){ + this.layoutProperties.IconGridSize = 34; + this.setGridLayout(Constants.DisplayType.GRID, 6, 0); + super.setDefaultMenuView(); + this.loadFrequentApps(); + this.activeCategory = _("Pinned"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + } + + displayAllApps(){ + this.activeCategory = _("All Apps"); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + + this.setGridLayout(Constants.DisplayType.LIST, 1, 5); + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 6, 0, false); + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + this.themeNodeBorderRadius; + + if(removeMenuArrow) + this.arcMenu.box.style = "padding-bottom:0px; margin:0px;"; + else + this.arcMenu.box.style = "padding-bottom:0px;"; + } + + setGridLayout(displayType, columns, spacing, setStyle = true){ + if(setStyle){ + this.applicationsGrid.x_align = displayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER; + displayType === Constants.DisplayType.LIST ? this.applicationsBox.add_style_class_name('margin-box') : this.applicationsBox.remove_style_class_name('margin-box'); + } + this.applicationsGrid.layout_manager.column_spacing = spacing; + this.applicationsGrid.layout_manager.row_spacing = spacing; + this.layoutProperties.DisplayType = displayType; + } + + loadCategories() { + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + displayPinnedApps() { + this._clearActorsFromBox(this.applicationsBox); + this.activeCategory = _("Pinned"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + + if(this.frequentAppsList.length > 0 && !this._settings.get_boolean("eleven-disable-frequent-apps")){ + this.activeCategory = _("Frequent"); + this.setGridLayout(Constants.DisplayType.GRID, 2, 0); + this._displayAppList(this.frequentAppsList, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 6, 0); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + } + else if(this.applicationsBox.contains(this.shortcutsBox)){ + this.applicationsBox.remove_child(this.shortcutsBox); + } + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + this._hideNavigationButtons(); + + if(category === Constants.CategoryType.PINNED_APPS){ + this.applicationsBox.insert_child_at_index(this.allAppsButton, 0); + } + else if(category === Constants.CategoryType.HOME_SCREEN){ + this.applicationsBox.insert_child_at_index(this.frequentAppsHeader, 2); + } + else if(category === Constants.CategoryType.ALL_PROGRAMS){ + this.mainBox.insert_child_at_index(this.backButton, 1); + } + } + + _hideNavigationButtons(){ + if(this.mainBox.contains(this.backButton)) + this.mainBox.remove_child(this.backButton); + } + + _createNavigationButtons(buttonTitle, ButtonClass){ + let navButton = this.createLabelRow(buttonTitle); + navButton.remove_child(navButton._ornamentLabel); + navButton.label.y_align = Clutter.ActorAlign.CENTER; + navButton.label.style = 'padding: 15px 0px;'; + navButton.style = 'padding: 0px 25px;' + if(ButtonClass) + navButton.add_child(new ButtonClass(this)); + return navButton; + } + + _onSearchBoxChanged(searchBox, searchString){ + this.applicationsBox.remove_style_class_name('margin-box'); + if(!searchBox.isEmpty()) + this._hideNavigationButtons(); + super._onSearchBoxChanged(searchBox, searchString); + } + + destroy(){ + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + this.backButton.destroy(); + this.allAppsButton.destroy(); + if(this.disableFrequentAppsID){ + this._settings.disconnect(this.disableFrequentAppsID); + this.disableFrequentAppsID = null; + } + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js new file mode 100644 index 0000000..8b66793 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js @@ -0,0 +1,161 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + this.activitiesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + let activities = new MW.ActivitiesMenuItem(this); + this.activitiesBox.add_child(activities.actor); + this.leftBox.add_child(this.activitiesBox); + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.actor.style = "padding-top: 8px; padding-bottom: 8px;"; + categoryMenuItem._iconBin.visible = false; + } + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js new file mode 100644 index 0000000..e298283 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js @@ -0,0 +1,337 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + PinnedAppsColumns: 1, + DefaultMenuWidth: 525, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.actionsBox.style = "margin: 0px 5px 0px 10px; spacing: 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.pinnedAppsButton = new MW.PinnedAppsButton(this); + this.pinnedAppsButton.actor.y_expand = true; + this.pinnedAppsButton.actor.y_align= Clutter.ActorAlign.START; + this.pinnedAppsButton.actor.margin = 5; + this.actionsBox.add_child(this.pinnedAppsButton.actor); + let userButton = new MW.UserMenuItem(this, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(userButton.actor); + let path = GLib.get_user_special_dir(imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path != null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(placeMenuItem.actor); + } + let settingsButton = new MW.SettingsButton(this); + settingsButton.actor.expand = false; + settingsButton.actor.margin = 5; + this.actionsBox.add_child(settingsButton.actor); + this.leaveButton = new MW.LeaveButton(this); + this.leaveButton.actor.expand = false; + this.leaveButton.actor.margin = 5; + this.actionsBox.add_child(this.leaveButton.actor); + + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + let userMenuBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.START, + vertical: false, + }) + this.user = new MW.UserMenuIcon(this, 55, true); + this.user.actor.x_align = Clutter.ActorAlign.CENTER; + this.user.actor.y_align = Clutter.ActorAlign.CENTER; + this.user.label.x_align = Clutter.ActorAlign.CENTER; + this.user.label.style = "margin-left: 10px;" + userMenuBox.add_child(this.user.actor); + userMenuBox.add_child(this.user.label); + this.subMainBox.add_child(userMenuBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 15px 10px 10px 10px;"; + this.subMainBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor( this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + + this._createPinnedAppsMenu(); + this.setDefaultMenuView(); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + super.loadPinnedApps(); + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + } + + _createPinnedAppsMenu(){ + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.pinnedAppsMenu = new PopupMenu.PopupMenu(this.dummyCursor, 0, St.Side.TOP); + this.pinnedAppsMenu.blockSourceEvents = true; + this.section = new PopupMenu.PopupMenuSection(); + this.pinnedAppsMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + let headerBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.leftPanelPopup.add_child(headerBox); + + this.backButton = new MW.BackMenuItem(this); + this.backButton.connect("activate", () => this.togglePinnedAppsMenu()); + headerBox.add_child(this.backButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + headerBox.add_child(separator); + headerBox.add_child(this.createLabelRow(_("Pinned Apps"))); + + this.pinnedAppsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + overlay_scrollbars: true, + reactive:true + }); + + this.leftPanelPopup.add_child(this.pinnedAppsScrollBox); + + this.pinnedAppsBox = new St.BoxLayout({ + vertical: true + }); + this.pinnedAppsScrollBox.add_actor(this.pinnedAppsBox); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 0, + row_spacing: 0 + }); + this.pinnedAppsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + layout_manager: layout + }); + layout.forceGridColumns = 1; + layout.hookup_style(this.pinnedAppsGrid); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor) - 1; + this.leftPanelPopup.style = `height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this.displayPinnedApps(); + this.subMenuManager.addMenu(this.pinnedAppsMenu); + this.pinnedAppsMenu.actor.hide(); + Main.uiGroup.add_child(this.pinnedAppsMenu.actor); + this.pinnedAppsMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.pinnedAppsButton.tooltip){ + this.pinnedAppsButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.pinnedAppsButton.active = false; + this.pinnedAppsButton.sync_hover(); + this.pinnedAppsButton.hovered = this.pinnedAppsButton.hover; + } + }); + } + + togglePinnedAppsMenu(){ + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.pinnedAppsMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.pinnedAppsMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + this.pinnedAppsButton.tooltip.hide(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let backgroundColor = themeNode.get_color('-arrow-background-color'); + let borderWidth = themeNode.get_length('-arrow-border-width'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + let drawBoxShadow = true; + if(backgroundColor?.alpha === 0){ + backgroundColor = themeNode.get_color('background-color'); + if(backgroundColor?.alpha === 0){ + drawBoxShadow = false; + } + } + + let styleProperties, shadowColor; + if(drawBoxShadow){ + shadowColor = backgroundColor.shade(.35); + backgroundColor = Utils.clutterColorToRGBA(backgroundColor); + shadowColor = Utils.clutterColorToRGBA(shadowColor); + styleProperties = "box-shadow: 3px 0px 2px " + shadowColor + "; background-color: " + backgroundColor + ";"; + } + + this.pinnedAppsMenu.actor.style = "-boxpointer-gap: 0px; -arrow-border-color: transparent; -arrow-border-width: 0px; width: 250px;" + +"-arrow-base: 0px; -arrow-rise: 0px; -arrow-background-color: transparent;" + +"border-radius: " + borderRadius + "px;" + styleProperties; + + this.arcMenu.actor.get_allocation_box(); + let [x, y] = this.arcMenu.actor.get_transformed_position(); + let rise = themeNode.get_length('-arrow-rise'); + + if(this.arcMenu._arrowSide === St.Side.TOP) + y += rise + 1; + else + y += 1; + + if(this.arcMenu._arrowSide === St.Side.LEFT) + x = x + (borderRadius * 2) + rise + 1; + else + x = x + (borderRadius * 2); + + this.dummyCursor.set_position(Math.round(x + borderWidth), Math.round(y + borderWidth)); + this.pinnedAppsMenu.toggle(); + if(this.pinnedAppsMenu.isOpen){ + this.activeMenuItem = this.backButton; + this.backButton.grab_key_focus(); + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + this.activeMenuItem = this.applicationsGrid.layout_manager.get_child_at(0, 0); + if(!this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.add_child(this.applicationsGrid); + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayPinnedApps() { + this._clearActorsFromBox(this.pinnedAppsBox); + this.layoutProperties.GridColumns = 1; + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.pinnedAppsGrid); + if(!this.pinnedAppsBox.contains(this.pinnedAppsGrid)) + this.pinnedAppsBox.add_child(this.pinnedAppsGrid); + this.updateStyle(); + this.layoutProperties.GridColumns = 5; + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js new file mode 100644 index 0000000..7dbeccc --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js @@ -0,0 +1,465 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const MORE_PROVIDERS_POP_UP = -1; +const MAX_VISIBLE_PROVIDERS = 4; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + SearchDisplayType: Constants.DisplayType.LIST, + DisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + MenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.activeResult = null; + this.searchProvidersBoxStyle = "padding: 0px 15px; margin-bottom: 10px; height: 50px; background-color: rgba(186, 196, 201, 0.1); border-color:rgba(186, 196, 201, 0.2); border-bottom-width: 1px;" + this.themeNodeBorderRadius = ""; + this.searchProvidersBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: this.searchProvidersBoxStyle + this.themeNodeBorderRadius + }); + this.searchProvidersBox.clip_to_allocation = true; + this.mainBox.add_child(this.searchProvidersBox); + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 10px;"; + this.searchTermsChangedID = this.searchResults.connect('have-results', () => { + this.searchResultsChangedEvent(); + }); + this.searchNoResultsID = this.searchResults.connect('no-results', () => { + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + }) + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.subMainBox.style = "width:750px; spacing: 8px;"; + + this.searchResultDetailsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + style: 'width: 415px; spacing: 20px;' + }); + + this.searchResultDetailsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.searchResultDetailsScrollBox.add_actor(this.searchResultDetailsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + this.mainBox.add_child(this.searchBox); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.arcMenu.box.style = "padding-top: 0px;"; + this.hasPinnedApps = true; + this.loadPinnedApps(); + this.loadCategories(); + + this.moreItem = this.createProviderMenuItem(_("More"), MORE_PROVIDERS_POP_UP); + let arrowIcon = PopupMenu.arrowIcon(St.Side.BOTTOM); + arrowIcon.y_expand = false; + this.moreItem.add_child(arrowIcon); + this._createMoreProvidersMenu(); + + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + super.loadPinnedApps(); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.FREQUENT_APPS, Constants.DisplayType.LIST); + this.categoryDirectories.set(Constants.CategoryType.FREQUENT_APPS, categoryMenuItem); + + super.loadCategories(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.moveProvidersMenuItems = []; + this.moreProvidersBox.remove_all_children(); + this.searchResults.setProvider(Constants.CategoryType.SEARCH_RESULTS); + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + this.displayPinnedApps(); + this.searchProvidersBox.remove_all_children(); + let allProvidersItem = this.createProviderMenuItem(_("All"), Constants.CategoryType.SEARCH_RESULTS); + this.searchProvidersBox.add_child(allProvidersItem); + let searchProviders = this.searchResults.getProviders(); + + let currentItems = 1; + for(let provider of searchProviders){ + provider = provider.appInfo ? provider : _("Applications"); + let item = this.createProviderMenuItem(provider, provider.appInfo ? null : Constants.CategoryType.ALL_PROGRAMS); + + if(currentItems < MAX_VISIBLE_PROVIDERS) + this.searchProvidersBox.add_child(item); + else{ + this.moveProvidersMenuItems.push(item); + item.moreIndex = currentItems - MAX_VISIBLE_PROVIDERS; + item.x_expand = true; + item.x_align = Clutter.ActorAlign.FILL; + this.moreProvidersBox.add_child(item); + } + + currentItems++; + } + + this.searchProvidersBox.add_child(this.moreItem); + + this.activeProvider = allProvidersItem; + this.activeProvider.add_style_class_name("active-item"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + createProviderMenuItem(provider, providerEnum){ + let providerName = provider.appInfo ? provider.appInfo.get_name() : provider; + + let providerMenuItem = new MW.ArcMenuPopupBaseMenuItem(this); + providerMenuItem.name = "arc-menu-launcher-button"; + providerMenuItem.x_expand = false; + providerMenuItem.remove_child(providerMenuItem._ornamentLabel); + providerMenuItem.x_align = Clutter.ActorAlign.START; + providerMenuItem.style = 'padding: 10px 14px; margin: 0px;'; + providerMenuItem.provider = provider; + let label = new St.Label({ + text: _(providerName), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER, + }); + providerMenuItem.label = label; + providerMenuItem.add_child(label); + + providerMenuItem.connect("activate", () => this.activateProviderMenuItem(providerMenuItem, providerEnum)); + return providerMenuItem; + } + + activateProviderMenuItem(providerMenuItem, providerEnum){ + if(providerEnum && providerEnum === MORE_PROVIDERS_POP_UP){ + this.moreItem.add_style_class_name("active-item"); + this.toggleMoreProvidersMenu(); + } + else{ + if(this.activeProvider) + this.activeProvider.remove_style_class_name("active-item"); + + if(this.moreProvidersMenu.isOpen) + this.moreProvidersMenu.toggle(); + + this.moreItem.remove_style_class_name("active-item"); + this.moreItem.active = false; + + let potentialMovedItem = this.searchProvidersBox.get_child_at_index(MAX_VISIBLE_PROVIDERS); + + if(potentialMovedItem.wasMoved) + this.moveProviderMenuItem(potentialMovedItem, this.searchProvidersBox, this.moreProvidersBox, true); + + if(providerMenuItem.get_parent() === this.moreProvidersBox) + this.moveProviderMenuItem(providerMenuItem, this.moreProvidersBox, this.searchProvidersBox, false); + + this.activeProvider = providerMenuItem; + providerMenuItem.add_style_class_name("active-item"); + + this.displayProviderPage(providerMenuItem.provider, providerEnum); + this.searchResults.setProvider(providerMenuItem.provider.appInfo ? providerMenuItem.provider.appInfo.get_id() : providerEnum); + + if(!this.searchBox.isEmpty()){ + this._clearActorsFromBox(); + let searchString = this.searchBox.get_text(); + searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); + this.searchResults.setTerms([]); + + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.applicationsBox.add_child(this.searchResults); + this.searchResults.setTerms(searchString.split(/\s+/)); + this.searchResults.highlightDefault(true); + this.activeProvider.grab_key_focus(); + } + } + } + + moveProviderMenuItem(menuItem, currentBox, newBox, wasMoved){ + let expand = wasMoved ? true : false; + let align = wasMoved ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.START; + let index = wasMoved ? menuItem.moreIndex : MAX_VISIBLE_PROVIDERS; + + currentBox.remove_child(menuItem); + newBox.insert_child_at_index(menuItem, index); + menuItem.x_expand = expand; + menuItem.x_align = align; + menuItem.wasMoved = !wasMoved; + } + + displayProviderPage(provider, providerEnum){ + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + if(providerEnum){ + if(providerEnum === Constants.CategoryType.SEARCH_RESULTS) + this.displayPinnedApps(); + if(providerEnum === Constants.CategoryType.ALL_PROGRAMS) + this.displayFrequentApps(); + return; + } + this._clearActorsFromBox(); + let providerName = provider.appInfo ? provider.appInfo.get_name() : provider; + let providerIcon = provider.appInfo ? provider.appInfo.get_icon() : Gio.icon_new_for_string(''); + + this.setSearchHintText(providerName); + + let providerBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + }); + let icon = new St.Icon({ + icon_size: 76, + gicon: providerIcon, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + }); + let label = new St.Label({ + text: _("Search") + " " + _(providerName), + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: false, + y_align: Clutter.ActorAlign.START, + }); + providerBox.add_child(icon); + providerBox.add_child(label); + this.applicationsBox.add_child(providerBox); + } + + _createMoreProvidersMenu(){ + this.moreProvidersMenu = new PopupMenu.PopupMenu(this.moreItem, 0.5, St.Side.TOP); + this.moreProvidersMenu.connect('open-state-changed', (menu, open) => { + if(!open) + this.moreItem.remove_style_class_name("active-item"); + }); + + this.section = new PopupMenu.PopupMenuSection(); + this.moreProvidersMenu.addMenuItem(this.section); + + this.moreProvidersBox = new St.BoxLayout({ + vertical: true + }); + + this.moreProvidersScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'vfade', + overlay_scrollbars: true, + reactive: true + }); + this.moreProvidersScrollBox._delegate = this.moreProvidersBoxScrollBox; + this.moreProvidersScrollBox.add_actor(this.moreProvidersBox); + this.moreProvidersScrollBox.clip_to_allocation = true; + + this.moreProvidersScrollBox.style = "max-height: 350px;"; + this.section.actor.add_child(this.moreProvidersScrollBox); + this.subMenuManager.addMenu(this.moreProvidersMenu); + this.moreProvidersMenu.actor.hide(); + Main.uiGroup.add_child(this.moreProvidersMenu.actor); + } + + toggleMoreProvidersMenu(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.moreProvidersMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.moreProvidersMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + + this.moreProvidersMenu.toggle(); + } + + displayFrequentApps(){ + this._clearActorsFromBox(); + this.setSearchHintText(_("Applications")); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FREQUENT_APPS); + let label = this.createLabelRow(_("Frequent Apps")); + this.applicationsBox.add_child(label); + this.layoutProperties.GridColumns = 5; + super._displayAppList(categoryMenuItem.appList, Constants.CategoryType.FREQUENT_APPS, this.applicationsGrid); + } + + setSearchHintText(providerName){ + this.searchBox.hint_text = _("Search") + " " + _(providerName) + "…"; + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: " + borderRadius + "px " + borderRadius + "px 0px 0px;"; + this.searchProvidersBox.style = this.searchProvidersBoxStyle + this.themeNodeBorderRadius; + if(removeMenuArrow) + this.arcMenu.box.style = "padding-top: 0px; margin: 0px;"; + else + this.arcMenu.box.style = "padding-top: 0px;"; + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + } + + displayPinnedApps() { + super._clearActorsFromBox(); + let label = this.createLabelRow(_("Pinned Apps")); + this.searchBox.hint_text = _("Search…"); + this.applicationsBox.add_child(label); + this.layoutProperties.GridColumns = 5; + super._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + searchResultsChangedEvent(){ + if(!this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.add_child(this.searchResultDetailsScrollBox); + if(this.activeResult === this.searchResults.getTopResult()) + return; + + this.activeResult = this.searchResults.getTopResult(); + if(!this.activeResult || this.activeResult === null){ + return; + } + + this.createActiveSearchItemPanel(this.searchResults.getTopResult()); + } + + createActiveSearchItemPanel(activeResult){ + if(!activeResult) + return; + if(!this.subMainBox.contains(this.searchResultDetailsScrollBox)) + return; + if(!activeResult.provider || activeResult === this.activeResultMenuItem) + return; + this.activeCategoryType = -1; + this.searchResultDetailsBox.destroy_all_children(); + + if(!activeResult.metaInfo) + return; + + let app = activeResult.app ? activeResult.app : null; + let path = activeResult._path ? activeResult._path : null; + + this.activeResultMenuItem = new MW.ApplicationMenuItem(this, app, Constants.DisplayType.GRID, activeResult.metaInfo); + this.activeResultMenuItem.name = "ExtraLargeIconGrid"; + this.activeResultMenuItem.provider = activeResult.provider; + this.activeResultMenuItem.resultsView = activeResult.resultsView; + this.activeResultMenuItem._path = path; + this.activeResultMenuItem.x_expand = false; + this.activeResultMenuItem.x_align = Clutter.ActorAlign.CENTER; + let iconSize = 76; + let icon = activeResult.metaInfo ?activeResult.metaInfo['createIcon'](iconSize) : app.create_icon_texture(iconSize); + this.activeResultMenuItem._iconBin.set_child(icon); + if(!this.activeResultMenuItem._iconBin.get_child()){ + let icon = new St.Icon({ + icon_size: iconSize, + gicon: activeResult.provider.appInfo.get_icon() + }); + this.activeResultMenuItem._iconBin.set_child(icon); + } + this.searchResultDetailsBox.add_child(this.activeResultMenuItem); + this.searchResultContextItems = new MW.ApplicationContextItems(this.activeResultMenuItem, app, this); + this.searchResultContextItems.path = path; + this.searchResultContextItems.rebuildItems(); + this.searchResultDetailsBox.add_child(this.searchResultContextItems); + } + + destroy(){ + this.arcMenu.box.style = null; + + if(this.searchTermsChangedID){ + this.searchResults.disconnect(this.searchTermsChangedID); + this.searchTermsChangedID = null; + } + + if(this.searchNoResultsID){ + this.searchResults.disconnect(this.searchNoResultsID); + this.searchNoResultsID = null; + } + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js new file mode 100644 index 0000000..3185f2d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js @@ -0,0 +1,250 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + //Stores the Pinned Icons on the left side + this.actionsScrollBox = new St.ScrollView({ + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'small-vfade' + }); + this.actionsScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); + this.actionsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsScrollBox.add_actor(this.actionsBox); + this.actionsScrollBox.clip_to_allocation = true; + + this.actionsScrollBox.style = "padding: 21px 0px; width: 62px; margin: 0px 10px 10px 20px; background-color:rgba(186, 196,201, 0.1); border-color:rgba(186, 196,201, 0.2); border-width: 1px; border-radius: 5px;"; + this.actionsBox.style = "spacing: 10px;"; + //check if custom ArcMenu is enabled + if( this._settings.get_boolean('enable-custom-arc-menu')) + this.actionsBox.add_style_class_name('arc-menu'); + + this.mainBox.add_child(this.actionsScrollBox); + this.rightMenuBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.rightMenuBox); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 20px 10px 8px;"; + this.rightMenuBox.add_child(this.searchBox.actor); + } + else + this.rightMenuBox.style = "margin-top: 10px;"; + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.rightMenuBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + + this.categoriesScrollBox.add_actor( this.categoriesBox); + this.categoriesScrollBox.clip_to_allocation = true; + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 20px 10px 8px;"; + this.rightMenuBox.add_child(this.searchBox.actor); + } + this.loadCategories(); + this.loadPinnedApps(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + _addSeparator(){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + loadExtraPinnedApps(){ + this.actionsBox.destroy_all_children(); + super.loadExtraPinnedApps(this._settings.get_strv('mint-pinned-app-list'), this._settings.get_int('mint-separator-index')); + } + + _createExtraPinnedAppsList(){ + let pinnedApps = []; + //Find the Default Web Browser, if found add to pinned apps list, if not found delete the placeholder. + //Will only run if placeholder is found. Placeholder only found with default settings set. + let browserName = ''; + try{ + //user may not have xdg-utils package installed which will throw error + let [res, stdout, stderr, status] = GLib.spawn_command_line_sync("xdg-settings get default-web-browser"); + let webBrowser = String.fromCharCode(...stdout); + browserName = webBrowser.split(".desktop")[0]; + browserName += ".desktop"; + } + catch(error){ + global.log("ArcMenu Error - Failed to find default web browser. Removing placeholder pinned app.") + } + this._app = appSys.lookup_app(browserName); + if(this._app){ + let appIcon = this._app.create_icon_texture(25); + let iconName = ''; + if(appIcon.icon_name) + iconName = appIcon.icon_name; + else if(appIcon.gicon) + iconName = appIcon.gicon.to_string(); + pinnedApps.push(this._app.get_name(), iconName, this._app.get_id()); + } + else{ + pinnedApps.push(_("Home"), "ArcMenu_Home", "ArcMenu_Home"); + } + pinnedApps.push(_("Terminal"), "utilities-terminal", "org.gnome.Terminal.desktop"); + pinnedApps.push(_("Settings"), "emblem-system-symbolic", "gnome-control-center.desktop"); + + let software = Utils.findSoftwareManager(); + if(software) + pinnedApps.push(_("Software"), 'system-software-install-symbolic', software); + else + pinnedApps.push(_("Documents"), "ArcMenu_Documents", "ArcMenu_Documents"); + + pinnedApps.push(_("Files"), "system-file-manager", "org.gnome.Nautilus.desktop"); + pinnedApps.push(_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"); + pinnedApps.push(_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"); + pinnedApps.push(_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"); + + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('mint-pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + return pinnedApps; + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js new file mode 100644 index 0000000..2135cc5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js @@ -0,0 +1,453 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 450, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START + }); + this.leftTopBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + vertical: false, + y_align: Clutter.ActorAlign.CENTER, + style: "padding-left: 10px; margin-left: 0.4em" + }); + this.rightTopBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + style_class: 'popup-menu-item', + style: "padding: 0px; margin: 0px; spacing: 0px;" + }); + + this.user = new MW.UserMenuIcon(this, 55, true); + this.user.actor.x_expand = false; + this.user.actor.y_expand = true; + this.user.actor.x_align = Clutter.ActorAlign.CENTER; + this.user.actor.y_align = Clutter.ActorAlign.CENTER; + this.leftTopBox.add_child(this.user.actor); + this.rightTopBox.add_child(this.user.label); + this.user.label.style = "padding-left: 0.4em; margin: 0px 10px 0px 15px; font-weight: bold;"; + this.user.label.y_expand = false; + this.user.label.x_expand = true; + this.user.label.x_align = Clutter.ActorAlign.START; + this.rightTopBox.add_child(this.searchBox.actor); + + this.topBox.add_child(this.leftTopBox); + this.topBox.add_child(this.rightTopBox); + + this.searchBarLocation = this._settings.get_enum('searchbar-default-top-location'); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? 'margin-box' : 'margin-box small-vfade', + overlay_scrollbars: true, + reactive:true, + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBoxContainer = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START + }); + this.navigateBox = new St.BoxLayout({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + style: "spacing: 6px;", + }); + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_homogeneous: true, + column_spacing: 10, + row_spacing: 10 + }); + this.grid = new St.Widget({ + layout_manager: layout + }); + layout.hookup_style(this.grid); + this.navigateBox.add_child(this.grid); + + this.pinnedAppsButton = new MW.PlasmaMenuItem(this, _("Pinned Apps"), Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'); + this.pinnedAppsButton.connect("activate", () => this.displayPinnedApps() ); + this.grid.layout_manager.attach(this.pinnedAppsButton, 0, 0, 1, 1); + this.pinnedAppsButton.set_style_pseudo_class("active-item"); + + this.applicationsButton = new MW.PlasmaMenuItem(this, _("Applications"), 'preferences-desktop-apps-symbolic'); + this.applicationsButton.connect("activate", () => this.displayCategories() ); + this.grid.layout_manager.attach(this.applicationsButton, 1, 0, 1, 1); + + this.computerButton = new MW.PlasmaMenuItem(this, _("Computer"), 'computer-symbolic'); + this.computerButton.connect("activate", () => this.displayComputerCategory() ); + this.grid.layout_manager.attach(this.computerButton, 2, 0, 1, 1); + + this.leaveButton = new MW.PlasmaMenuItem(this, _("Leave"), 'system-shutdown-symbolic'); + this.leaveButton.connect("activate", () => this.displayPowerItems() ); + this.grid.layout_manager.attach(this.leaveButton, 3, 0, 1, 1); + + this.categoryHeader = new MW.PlasmaCategoryHeader(this); + this.categoryHeader.add_style_class_name('margin-box'); + + if(this.searchBarLocation === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 3px 10px 5px 10px;"; + this.topBox.style = 'padding-top: 0.5em;' + + this.navigateBoxContainer.add_child(this.navigateBox); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBoxContainer.add_child(separator); + this.navigateBoxContainer.y_expand = false; + this.navigateBoxContainer.y_align = Clutter.ActorAlign.START; + this.mainBox.add_child(this.navigateBoxContainer); + this.mainBox.add_child(this.applicationsScrollBox); + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + + this.mainBox.add_child(this.topBox); + } + else if(this.searchBarLocation === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 3px 10px 10px 10px;"; + + this.mainBox.add_child(this.topBox); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + this.mainBox.add_child(this.applicationsScrollBox); + this.navigateBoxContainer.y_expand = true; + this.navigateBoxContainer.y_align = Clutter.ActorAlign.END; + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBoxContainer.add_child(separator); + this.navigateBoxContainer.add_child(this.navigateBox); + this.mainBox.add_child(this.navigateBoxContainer); + } + + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcutsList = this._settings.get_value('application-shortcuts-list').deep_unpack(); + this.applicationShortcuts = []; + for(let i = 0; i < applicationShortcutsList.length; i++){ + let applicationName = applicationShortcutsList[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcutsList[i][1], applicationShortcutsList[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.applicationShortcuts.push(shortcutMenuItem.actor); + } + + let directoryShortcutsList = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + this._loadPlaces(directoryShortcutsList); + + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + this.updateWidth(); + this._createPowerItems(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setFrequentAppsList(categoryMenuItem){ + categoryMenuItem.appList = []; + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + categoryMenuItem.appList.push(mostUsed[i]); + let item = this.applicationsMap.get(mostUsed[i]); + if (!item) { + item = new MW.ApplicationMenuItem(this, mostUsed[i], this.layoutProperties.DisplayType); + this.applicationsMap.set(mostUsed[i], item); + } + } + } + } + + _clearActorsFromBox(box){ + this.categoryHeader.setActiveCategory(null); + if(this.mainBox.contains(this.categoryHeader)) + this.mainBox.remove_child(this.categoryHeader); + super._clearActorsFromBox(box); + } + + clearActiveItem(){ + this.pinnedAppsButton.setActive(false); + this.computerButton.setActive(false); + this.applicationsButton.setActive(false); + this.leaveButton.setActive(false); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum === Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayComputerCategory(){ + this._clearActorsFromBox(this.applicationsBox); + this.applicationsBox.add_child(this.createLabelRow(_("Application Shortcuts"))); + for(let i = 0; i < this.applicationShortcuts.length; i++){ + this.applicationsBox.add_child(this.applicationShortcuts[i]); + } + this.applicationsBox.add_child(this.createLabelRow(_("Places"))); + for(let i = 0; i < this.directoryShortcuts.length; i++){ + this.applicationsBox.add_child(this.directoryShortcuts[i]); + } + this.applicationsBox.add_child(this.externalDevicesBox); + this.activeMenuItem = this.applicationShortcuts[0]; + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + + if(id === 'bookmarks' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Bookmarks"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'devices' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Devices"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'network' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Network"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + } + + displayPinnedApps(){ + this.activeCategoryType = Constants.CategoryType.PINNED_APPS; + super.displayPinnedApps(); + } + + _loadPlaces(directoryShortcutsList) { + this.directoryShortcuts = []; + for (let i = 0; i < directoryShortcutsList.length; i++) { + let isContainedInCategory = false; + let directory = directoryShortcutsList[i]; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + this.directoryShortcuts.push(placeMenuItem); + } + } + + _createPowerItems(){ + this.lock = new MW.PowerMenuItem(this, Constants.PowerType.LOCK); + this.logOut = new MW.PowerMenuItem(this, Constants.PowerType.LOGOUT); + Utils.canHybridSleep((canHybridSleep, needsAuth) => { + if(canHybridSleep){ + this.sleep = new MW.PowerMenuItem(this, Constants.PowerType.HYBRID_SLEEP); + } + }); + + + Utils.canHibernate((canHibernate, needsAuth) => { + if(canHibernate){ + this.hibernate = new MW.PowerMenuItem(this, Constants.PowerType.HIBERNATE); + } + }); + this.suspend = new MW.PowerMenuItem(this, Constants.PowerType.SUSPEND); + this.restart = new MW.PowerMenuItem(this, Constants.PowerType.RESTART); + this.powerOff = new MW.PowerMenuItem(this, Constants.PowerType.POWER_OFF); + } + + displayPowerItems(){ + this._clearActorsFromBox(this.applicationsBox); + this.applicationsBox.add_child(this.createLabelRow(_("Session"))); + this.applicationsBox.add_child(this.lock); + this.applicationsBox.add_child(this.logOut); + this.applicationsBox.add_child(this.createLabelRow(_("System"))); + this.applicationsBox.add_child(this.suspend); + if(this.sleep) + this.applicationsBox.insert_child_at_index(this.sleep, 4); + + if(this.hibernate) + this.applicationsBox.insert_child_at_index(this.hibernate, 5); + this.applicationsBox.add_child(this.restart); + this.applicationsBox.add_child(this.powerOff); + this.activeMenuItem = this.lock; + } + + displayCategories(){ + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + this._clearActorsFromBox(this.applicationsBox); + + this.categoryHeader.setActiveCategory(null); + this._insertCategoryHeader(); + + let isActiveMenuItemSet = false; + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.applicationsBox.add_child(categoryMenuItem.actor); + if(!isActiveMenuItemSet){ + isActiveMenuItemSet = true; + this.activeMenuItem = categoryMenuItem; + } + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.clearActiveItem(); + this.pinnedAppsButton.set_style_pseudo_class("active-item"); + this.displayPinnedApps(); + } + + _insertCategoryHeader(){ + if(this.mainBox.contains(this.categoryHeader)) + this.mainBox.remove_child(this.categoryHeader); + if(this.searchBarLocation === Constants.SearchbarLocation.BOTTOM) + this.mainBox.insert_child_at_index(this.categoryHeader, 1); + else + this.mainBox.insert_child_at_index(this.categoryHeader, 2); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._insertCategoryHeader(); + this.categoryHeader.setActiveCategory(this.activeCategory); + this._displayAppList(appList, category, this.applicationsGrid); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + this._insertCategoryHeader(); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.categoryHeader.setActiveCategory(this.activeCategory); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(!searchBox.isEmpty()){ + this.clearActiveItem(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } + + destroy(){ + if(this.sleep) + this.sleep.destroy(); + if(this.hibernate) + this.hibernate.destroy(); + + this.lock.destroy(); + this.logOut.destroy(); + this.suspend.destroy(); + this.restart.destroy(); + this.powerOff.destroy(); + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js new file mode 100644 index 0000000..2630ef5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js @@ -0,0 +1,395 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 410, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + SupportsCategoryOnHover: true, + DefaultCategoryIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.ravenPositionChangedID = this._settings.connect('changed::raven-position', () => this._updatePosition()); + + this.dummyCursor = new St.Widget({ width: 1, height: 0, opacity: 0}); + Main.uiGroup.add_child(this.dummyCursor); + this.updateLocation(); + + //store old ArcMenu variables + this.oldSourceActor = this.arcMenu.sourceActor; + this.oldFocusActor = this.arcMenu.focusActor; + this.oldArrowAlignment = this.arcMenu.actor._arrowAlignment; + + this.arcMenu.sourceActor = this.dummyCursor; + this.arcMenu.focusActor = this.dummyCursor; + this.arcMenu._boxPointer.setPosition(this.dummyCursor, 0); + this.arcMenu.close(); + this.arcMenu._boxPointer.hide(); + + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen) + this.activeCategory = _("Pinned Apps"); + else + this.activeCategory = _("All Programs"); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px; -boxpointer-gap: 0px; -arrow-border-radius: 0px"; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + this.actionsBoxContainer = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + + this.actionsBox = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + this.actionsBoxContainer.add_child(this.actionsBox); + this.actionsBox.style = "spacing: 5px;"; + this.actionsBoxContainerStyle = "margin: 0px 0px 0px 0px; spacing: 10px; background-color: rgba(186, 196,201, 0.1); padding: 5px 5px;"+ + "border-color: rgba(186, 196,201, 0.2);"; + + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + //Sub Main Box -- stores left and right box + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.subMainBox.add_child(this.topBox); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 25px 10px 10px 10px;"; + this.topBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + x_align: Clutter.ActorAlign.FILL, + vertical: true, + style: "padding-bottom: 10px;" + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.weatherBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END, + vertical: true + }); + + this._weatherItem = new MW.WeatherSection(this); + this._weatherItem.style = "border-radius:4px; padding: 10px; margin: 0px 25px 25px 25px;"; + this._clocksItem = new MW.WorldClocksSection(this); + this._clocksItem.x_expand = true; + this._clocksItem.x_align = Clutter.ActorAlign.FILL; + this._clocksItem.style = "border-radius:4px; padding: 10px; margin: 0px 25px 25px 25px;"; + + this.weatherBox.add_child(this._clocksItem); + this.weatherBox.add_child(this._weatherItem); + + this.appShortcuts = []; + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + + this.shortcutsBox.add_child(this.shortcutsGrid); + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.GRID); + this.appShortcuts.push(shortcutMenuItem); + } + + this.updateWidth(); + this._updatePosition(); + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.weatherBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _updatePosition(){ + let ravenPosition = this._settings.get_enum('raven-position'); + if(this.mainBox.contains(this.actionsBoxContainer)){ + this.mainBox.remove_child(this.actionsBoxContainer); + } + if(ravenPosition === Constants.RavenPosition.LEFT){ + this.mainBox.insert_child_at_index(this.actionsBoxContainer, 0); + this.actionsBoxContainer.style = "border-right-width: 1px;" + this.actionsBoxContainerStyle; + } + else if(ravenPosition === Constants.RavenPosition.RIGHT){ + this.mainBox.insert_child_at_index(this.actionsBoxContainer, 1); + this.actionsBoxContainer.style = "border-left-width: 1px;" + this.actionsBoxContainerStyle; + } + } + + updateLocation(){ + let ravenPosition = this._settings.get_enum('raven-position'); + + let alignment = ravenPosition === Constants.RavenPosition.LEFT ? 0 : 1; + this.arcMenu._boxPointer.setSourceAlignment(alignment); + this.arcMenu._arrowAlignment = alignment; + + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let monitorWorkArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + + let positionX = ravenPosition === Constants.RavenPosition.LEFT ? monitorWorkArea.x : monitorWorkArea.x + monitorWorkArea.width - 1; + let positionY = this.arcMenu._arrowSide === St.Side.BOTTOM ? monitorWorkArea.y + monitorWorkArea.height : monitorWorkArea.y; + + this.dummyCursor.set_position(positionX, positionY); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + let screenHeight = monitorWorkArea.height; + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderWidth = themeNode.get_length('-arrow-border-width'); + + let height = Math.round((screenHeight - borderWidth * 2) / scaleFactor); + this.mainBox.style = `height: ${height}px;`; + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen){ + this.activeCategory = _("Pinned Apps"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + else{ + this.activeCategory = _("All Programs"); + let isGridLayout = true; + this.displayAllApps(isGridLayout); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + } + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + updateStyle(){ + super.updateStyle(); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px; -boxpointer-gap: 0px; -arrow-border-radius: 0px;"; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + this.updateLocation(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.HOME_SCREEN, Constants.DisplayType.BUTTON); + this.categoryDirectories.set(Constants.CategoryType.HOME_SCREEN, categoryMenuItem); + this.hasPinnedApps = true; + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum == Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.BUTTON); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.BUTTON); + this.displayCategories(); + } + + displayCategories(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.actionsBox.add_child(categoryMenuItem.actor); + } + } + + displayPinnedApps() { + if(this.activeCategoryType === Constants.CategoryType.HOME_SCREEN) + this._clearActorsFromBox(this.applicationsBox); + else + this._clearActorsFromBox(); + this.activeCategory = _("Pinned Apps"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + this.activeCategory = _("Shortcuts"); + this._displayAppList(this.appShortcuts, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + let actors = this.weatherBox.get_children(); + for (let i = 0; i < actors.length; i++) { + this.weatherBox.remove_child(actors[i]); + } + if(this._settings.get_boolean('enable-clock-widget-raven')){ + this.weatherBox.add_child(this._clocksItem); + } + if(this._settings.get_boolean('enable-weather-widget-raven')){ + this.weatherBox.add_child(this._weatherItem); + } + if(!this.subMainBox.contains(this.weatherBox)) + this.subMainBox.add_child(this.weatherBox); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + let label = this._createLabelWithSeparator(_("Recent Files")); + label.actor.style += "padding-left: 10px;"; + this.applicationsBox.insert_child_at_index(label, 0); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.applicationsBox.add_style_class_name('margin-box'); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _clearActorsFromBox(box) { + if(this.subMainBox.contains(this.weatherBox)){ + this.subMainBox.remove_child(this.weatherBox); + } + + this.applicationsBox.remove_style_class_name('margin-box'); + super._clearActorsFromBox(box); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + let label = this._createLabelWithSeparator(this.activeCategory); + + if(grid === this.applicationsGrid){ + label.actor.style += "padding-left: 10px;"; + this.applicationsBox.insert_child_at_index(label.actor, 0); + } + else{ + label.actor.style += "padding-left: 10px; padding-top: 20px;"; + this.applicationsBox.insert_child_at_index(label.actor, 2); + } + } + + destroy(){ + if(this._clocksItem) + this._clocksItem.destroy(); + if(this._weatherItem) + this._weatherItem.destroy(); + + if(this.ravenPositionChangedID){ + this._settings.disconnect(this.ravenPositionChangedID); + this.ravenPositionChangedID = null; + } + + this.arcMenu.actor.style = null; + this.arcMenu.box.style = null; + this.arcMenu.sourceActor = this.oldSourceActor; + this.arcMenu.focusActor = this.oldFocusActor; + this.arcMenu._boxPointer.setPosition(this.oldSourceActor, this.oldArrowAlignment); + this.arcMenu.close(); + this.arcMenu._boxPointer.hide(); + Main.uiGroup.remove_child(this.dummyCursor); + this.dummyCursor.destroy(); + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js new file mode 100644 index 0000000..d0cb17d --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js @@ -0,0 +1,229 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 450, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP) + this.subMainBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.subMainBox.add_child(this.searchBox.actor); + } + + this.rightBox = new St.BoxLayout({ + y_align: Clutter.ActorAlign.FILL, + y_expand: true, + vertical: true, + style_class: 'right-panel margin-box' + }); + + this.placesShortcuts = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this.bookmarksShorctus = false; + this.softwareShortcuts = false; + + if(!this._settings.get_boolean('disable-user-avatar')){ + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.rightBox.add_child(this.user.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.rightBox.add_child(separator); + } + + this.shortcutsBox = new St.BoxLayout({ + vertical: true + }); + + this.shortcutsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.rightBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //draw bottom right horizontal separator + logic to determine if should show + let shouldDraw = false; + if(this._settings.get_value('directory-shortcuts-list').deep_unpack().length>0){ + this.placesShortcuts=true; + } + if(this._settings.get_value('application-shortcuts-list').deep_unpack().length>0){ + this.softwareShortcuts = true; + } + + //check to see if should draw separator + if(this.placesShortcuts && (this._settings.get_boolean('show-external-devices') || this.softwareShortcuts || this._settings.get_boolean('show-bookmarks')) ) + shouldDraw=true; + if(shouldDraw){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //External Devices and Bookmarks Shortcuts + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this.shortcutsBox.add_child(this.externalDevicesBox); + + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + //create new section for Power, Lock, Logout, Suspend Buttons + this.actionsBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.END, + style: "spacing: 6px;" + }); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + this.rightBox.add_child(this.actionsBox); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.mainBox.add_child(horizonalFlip ? this.rightBox : this.subMainBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.mainBox.add_child(verticalSeparator); + this.mainBox.add_child(horizonalFlip ? this.subMainBox: this.rightBox); + horizonalFlip ? this.rightBox.style += "margin-right: 0px" : this.rightBox.style += "margin-left: 0px" + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js new file mode 100644 index 0000000..7386301 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js @@ -0,0 +1,208 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PanelMenu = imports.ui.panelMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton, isStandalone) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + StandaloneRunner: isStandalone + }); + } + + createLayout(){ + super.createLayout(); + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.updateLocation(); + + //store old ArcMenu variables + this.oldSourceActor = this.arcMenu.sourceActor; + this.oldFocusActor = this.arcMenu.focusActor; + this.oldArrowAlignment = this.arcMenu.actor._arrowAlignment; + + this.arcMenu.sourceActor = this.dummyCursor; + this.arcMenu.focusActor = this.dummyCursor; + this.arcMenu._boxPointer.setPosition(this.dummyCursor, 0.5); + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: false, + style: "margin: 5px 0px 0px 0px;" + }); + + this.searchBox.style = "margin: 0px 0px 0px 16px;"; + this.runnerTweaksButton = new MW.RunnerTweaksButton(this); + this.runnerTweaksButton.actor.x_expand = false; + this.runnerTweaksButton.actor.y_expand = true; + this.runnerTweaksButton.actor.y_align = this.searchBox.y_align = Clutter.ActorAlign.CENTER; + this.runnerTweaksButton.actor.x_align = Clutter.ActorAlign.CENTER; + this.runnerTweaksButton.actor.style = "margin: 0px 6px;"; + + this.topBox.add_child(this.searchBox.actor); + this.topBox.add_child(this.runnerTweaksButton); + this.mainBox.add_child(this.topBox); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: false, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + reactive:true + }); + + this.mainBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style: "margin: 5px 6px 0px 16px;" + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.activeMenuItem = null; + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + this.activeMenuItem = null; + super.setDefaultMenuView(); + if(this._settings.get_boolean("runner-show-frequent-apps")) + this.displayFrequentApps(); + } + + displayFrequentApps(){ + let labelRow = this.createLabelRow(_("Frequent Apps")); + this.applicationsBox.add_child(labelRow); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + let appList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + appList.push(item); + } + } + let activeMenuItemSet = false; + for (let i = 0; i < appList.length; i++) { + let item = appList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_actor(item.actor); + if(!activeMenuItemSet){ + activeMenuItemSet = true; + this.activeMenuItem = item; + } + } + } + + /** + * if button is hidden, menu should appear on current monitor, unless preference is to always show on primary monitor + * @returns index of monitor where menu should appear + */ + _getMonitorIndexForPlacement() { + if (this.layoutProperties.StandaloneRunner) { + return this._settings.get_boolean('runner-hotkey-open-primary-monitor') ? Main.layoutManager.primaryMonitor.index : Main.layoutManager.currentMonitor.index; + } + else if (this._settings.get_enum('menu-button-appearance') === Constants.MenuButtonAppearance.NONE) + return this._settings.get_boolean('hotkey-open-primary-monitor') ? Main.layoutManager.primaryMonitor.index : Main.layoutManager.currentMonitor.index; + else + return Main.layoutManager.findIndexForActor(this.menuButton); + } + + updateLocation(){ + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px;"; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = 0.5; + + let rect = Main.layoutManager.getWorkAreaForMonitor(this._getMonitorIndexForPlacement()); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY = rect.y + (this._settings.get_boolean('runner-use-theme-gap') ? this.rise : 0); + if(this._settings.get_enum('runner-position') == 1) + positionY = Math.round(rect.y + (rect.height / 2) - 125); + this.dummyCursor.set_position(positionX, positionY); + + if(!this.topBox) + return; + + this._runnerWidth = this._settings.get_int("runner-menu-width"); + this._runnerHeight = this._settings.get_int("runner-menu-height"); + this._runnerFontSize = this._settings.get_int("runner-font-size"); + this.mainBox.style = `max-height: ${this._runnerHeight}px;`; + if(this._runnerFontSize > 0){ + this.mainBox.style += `font-size: ${this._runnerFontSize}pt;` + this.searchBox.style += `font-size: ${this._runnerFontSize}pt;` + } + else{ + this.searchBox.style = "margin: 0px 0px 0px 16px;"; + } + this.topBox.style = `width: ${this._runnerWidth}px; margin: 5px 0px 0px 0px;`; + this.applicationsScrollBox.style = `width: ${this._runnerWidth}px;`; + } + + updateStyle(){ + super.updateStyle(); + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px;"; + } + + loadCategories(){ + } + + destroy(){ + this.arcMenu.actor.style = null; + this.arcMenu.sourceActor = this.oldSourceActor; + this.arcMenu.focusActor = this.oldFocusActor; + this.arcMenu._boxPointer.setPosition(this.oldSourceActor, this.oldArrowAlignment); + Main.uiGroup.remove_child(this.dummyCursor); + this.dummyCursor.destroy(); + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js new file mode 100644 index 0000000..0e971e4 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js @@ -0,0 +1,159 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GMenu, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.mainBox.style = null; + this.mainBox.style_class = 'margin-box'; + this.section = this.menuButton.section; + let actors = this.section.actor.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + this.section.actor.remove_child(actor); + } + this.section.actor.add_child(this.mainBox); + + this.loadPinnedApps(); + this.loadCategories(); + this._display(); + } + + setDefaultMenuView(){ + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + _display() { + this.displayCategories(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + updateStyle(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.updateStyle(); + } + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.SimpleMenuItem(this, categoryEnum); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.SIMPLE_CATEGORY); + } + + displayCategories(){ + super.displayCategories(this.mainBox); + } + + displayPinnedApps() { + this._clearActorsFromBox(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, categoryMenuItem); + } + } + + _clearActorsFromBox(box) { + let parent = this.applicationsGrid.get_parent(); + if(!parent) + return; + let scrollViewParent = parent.get_parent(); + + if(scrollViewParent && scrollViewParent instanceof St.ScrollView){ + let scrollBoxAdj = scrollViewParent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = parent.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + parent.remove_child(actor); + } + } + + displayCategoryAppList(appList, category, categoryMenuItem){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, categoryMenuItem); + } + + displayRecentFiles(){ + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + let children = categoryMenuItem.applicationsBox.get_children(); + for (let i = 0; i < children.length; i++) { + let actor = children[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + categoryMenuItem.applicationsBox.remove_child(actor); + } + super.displayRecentFiles(categoryMenuItem.applicationsBox); + } + + _displayAppList(apps, category, categoryMenuItem) { + super._displayAppList(apps, category, this.applicationsGrid); + if(!categoryMenuItem.applicationsBox.contains(this.applicationsGrid)) + categoryMenuItem.applicationsBox.add_child(this.applicationsGrid); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js new file mode 100644 index 0000000..ec5b2cf --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js @@ -0,0 +1,179 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + this.mainBox.style = null; + this.mainBox.style_class = 'margin-box'; + this.loadPinnedApps(); + this.loadCategories(); + this._display(); + this.arcMenu.actor.style = 'max-height: ' + (this.arcMenu.actor.height + 250) + 'px;'; + } + + setDefaultMenuView(){ + this.activeMenuItem = this.categoryDirectories.values().next().value; + let actors = this.mainBox.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + } + } + + _display() { + this.displayCategories(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategorySubMenuItem(this, categoryEnum); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.SUBMENU_CATEGORY); + + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem._setParent(this.arcMenu); + categoryMenuItem.isSimpleMenuItem = true; + } + } + + displayCategories(){ + this._clearActorsFromBox(); + let isActiveMenuItemSet = false; + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.arcMenu.addMenuItem(categoryMenuItem); + if(!isActiveMenuItemSet){ + isActiveMenuItemSet = true; + this.activeMenuItem = categoryMenuItem; + } + } + } + + _clearActorsFromBox(box) { + let parent = this.applicationsGrid.get_parent(); + if(!parent) + return; + let scrollViewParent = parent.get_parent(); + + if(scrollViewParent && scrollViewParent instanceof St.ScrollView){ + let scrollBoxAdj = scrollViewParent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = parent.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + parent.remove_child(actor); + } + super._clearActorsFromBox(this.mainBox); + } + + displayCategoryAppList(appList, category, categoryMenuItem){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, categoryMenuItem); + } + + displayRecentFiles(){ + this._clearActorsFromBox(); + this.applicationsGrid.remove_all_children(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + + let children = categoryMenuItem.menu.box.get_children(); + for (let i = 0; i < children.length; i++) { + let actor = children[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + categoryMenuItem.menu.box.remove_child(actor); + } + super.displayRecentFiles(categoryMenuItem.menu.box, () => categoryMenuItem._needsScrollbar()); + if(!categoryMenuItem.menu.box.contains(this.applicationsGrid)) + categoryMenuItem.menu.box.add_child(this.applicationsGrid); + + } + + displayPinnedApps() { + this._clearActorsFromBox(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, categoryMenuItem); + } + } + + _displayAppList(apps, category, categoryMenuItem) { + super._displayAppList(apps, category, this.applicationsGrid); + let box = categoryMenuItem.menu.box; + if(!box.contains(this.applicationsGrid)) + box.add_child(this.applicationsGrid); + } + + destroy(){ + this.arcMenu.actor.style = null; + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js new file mode 100644 index 0000000..9d279ee --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js @@ -0,0 +1,290 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * tognee Layout Created By: tognee https://gitlab.com/tognee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 290, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + // The "Left Box" + // Contains the app list and the searchbar + this.appBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: true, + y_align: Clutter.ActorAlign.FILL, + }); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true, + reactive:true + }); + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.appBox.add_child(this.searchBox.actor); + } + this.appBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ vertical: true }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.backButton = new MW.BackMenuItem(this); + this.navigateBox.add_child(new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL)); + this.navigateBox.add_child(this.backButton.actor); + this.appBox.add_child(this.navigateBox); + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.appBox.add_child(this.searchBox.actor); + } + + // The "Right Box" + // Contains some useful shortcuts + this.quickBox = new St.BoxLayout({ + vertical: true, + style: "margin: 0px 1px;", + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + this.subMainBox.add_child(horizonalFlip ? this.appBox : this.quickBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.quickBox : this.appBox); + + this.placesShortcuts= this._settings.get_value('directory-shortcuts-list').deep_unpack().length>0; + this.softwareShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack().length>0; + + this.shortcutsBox = new St.BoxLayout({ + vertical: true, + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + style: "spacing: 5px; padding-bottom: 5px;" + }); + + this.shortcutsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + }); + this.shortcutsScrollBox.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.EXTERNAL); + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.quickBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //check to see if should draw separator + if(this.placesShortcuts && this.softwareShortcuts){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.LONG, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let isContainedInCategory = false; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.BUTTON, isContainedInCategory); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + // Bottom Section for Power etc... + this.actionsScrollBox = new St.ScrollView({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.END, + x_align: Clutter.ActorAlign.CENTER + }); + this.actionsScrollBox.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.EXTERNAL); + this.actionsScrollBox.clip_to_allocation = true; + + //create new section for Leave Button + this.actionsBox = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.CENTER, + style: "spacing: 3px;" + }); + this.actionsScrollBox.add_actor(this.actionsBox); + + let leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(leaveButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.LONG, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.insert_child_at_index(separator, 0); + this.quickBox.add_child(this.actionsScrollBox); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 175px minimum limit for the menu width + menuWidth = Math.max(175, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _displayPlaces() { + let directoryShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + for (let i = 0; i < directoryShortcuts.length; i++) { + let directory = directoryShortcuts[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.BUTTON, isContainedInCategory); + this.shortcutsBox.add_child(placeMenuItem.actor); + } + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayPinnedApps(){ + super.displayPinnedApps(); + this.activeCategoryType = Constants.CategoryType.PINNED_APPS; + this.navigateBox.show(); + } + + displayAllApps(){ + this.navigateBox.hide(); + super.displayAllApps() + } + + displayCategories(){ + super.displayCategories(); + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + this.navigateBox.hide(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let defaultMenuView = this._settings.get_enum('default-menu-view-tognee'); + + if(defaultMenuView === Constants.DefaultMenuViewTognee.CATEGORIES_LIST) + this.displayCategories(); + else if(defaultMenuView === Constants.DefaultMenuViewTognee.ALL_PROGRAMS) + this.displayAllApps(); + } + + displayCategoryAppList(appList, category){ + super.displayCategoryAppList(appList, category); + this.navigateBox.show(); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.navigateBox.show(); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(searchBox.isEmpty()){ + this.navigateBox.hide(); + } + else if(!searchBox.isEmpty()){ + this.navigateBox.show(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js new file mode 100644 index 0000000..290a169 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js @@ -0,0 +1,1286 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Prefs = Me.imports.prefs; +const PW = Me.imports.prefsWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var TweaksPage = GObject.registerClass({ + Signals: { + 'response': { param_types: [GObject.TYPE_INT] }, + }, +}, class Arc_Menu_TweaksPage extends Gtk.Box { + _init(settings, layoutName) { + this._settings = settings; + this.addResponse = false; + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.layoutNameLabel = new Gtk.Label({ + label: "" + _(layoutName) + "", + use_markup: true, + xalign: 0, + hexpand: true, + halign: Gtk.Align.CENTER + }) + + let backButton = new PW.Button({ + icon_name: 'go-previous-symbolic', + title: _("Back"), + icon_first: true, + }); + backButton.halign = Gtk.Align.START; + backButton.connect('clicked', ()=> { + this.emit('response', -20); + }); + this.headerBox = new Gtk.Grid({ + hexpand: true, + halign: Gtk.Align.FILL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + }); + + this.headerBox.attach(backButton, 0, 0, 1, 1); + this.headerBox.attach(this.layoutNameLabel, 0, 0, 1, 1); + this.mainScrollWindow = new Gtk.ScrolledWindow(); + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.append(this.headerBox); + this.mainScrollWindow.set_child(this.mainBox); + this.mainScrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.append(this.mainScrollWindow); + this._createLayout(); + } + + setActiveLayout(menuLayout, layoutName){ + if(layoutName) + this.layoutNameLabel.label = "" + _(layoutName) + ""; + let children = [...this.mainBox]; + for(let child of children){ + this.mainBox.remove(child); + } + this._createLayout(menuLayout); + } + + _createLayout(menuLayout) { + if(!menuLayout) + menuLayout = this._settings.get_enum('menu-layout'); + + if(menuLayout == Constants.MenuLayout.ARCMENU) + this._loadArcMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.BRISK) + this._loadBriskMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.WHISKER) + this._loadWhiskerMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.GNOME_MENU) + this._loadGnomeMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.MINT) + this._loadMintMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.ELEMENTARY) + this._loadElementaryTweaks(); + else if(menuLayout == Constants.MenuLayout.GNOME_OVERVIEW) + this._loadGnomeOverviewTweaks(); + else if(menuLayout == Constants.MenuLayout.SIMPLE) + this._loadPlaceHolderTweaks(); + else if(menuLayout == Constants.MenuLayout.SIMPLE_2) + this._loadPlaceHolderTweaks(); + else if(menuLayout == Constants.MenuLayout.REDMOND) + this._loadRedmondMenuTweaks() + else if(menuLayout == Constants.MenuLayout.UNITY) + this._loadUnityTweaks(); + else if(menuLayout == Constants.MenuLayout.RAVEN) + this._loadRavenTweaks(); + else if(menuLayout == Constants.MenuLayout.BUDGIE) + this._loadBudgieMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.INSIDER) + this._loadInsiderMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.RUNNER) + this._loadRunnerMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.CHROMEBOOK) + this._loadChromebookTweaks(); + else if(menuLayout == Constants.MenuLayout.TOGNEE) + this._loadTogneeMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.PLASMA) + this._loadPlasmaMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.WINDOWS) + this._loadWindowsTweaks(); + else if(menuLayout == Constants.MenuLayout.ELEVEN) + this._loadElevenTweaks(); + else + this._loadPlaceHolderTweaks(); + } + + _createActivateOnHoverRow(){ + let activateOnHoverRow = new PW.FrameBoxRow(); + let activateOnHoverLabel = new Gtk.Label({ + label: _("Category Activation"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let activateOnHoverCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + activateOnHoverCombo.append_text(_("Mouse Click")); + activateOnHoverCombo.append_text(_("Mouse Hover")); + if(this._settings.get_boolean('activate-on-hover')) + activateOnHoverCombo.set_active(1); + else + activateOnHoverCombo.set_active(0); + activateOnHoverCombo.connect('changed', (widget) => { + if(widget.get_active()==0) + this._settings.set_boolean('activate-on-hover',false); + if(widget.get_active()==1) + this._settings.set_boolean('activate-on-hover',true); + }); + + activateOnHoverRow.add(activateOnHoverLabel); + activateOnHoverRow.add(activateOnHoverCombo); + return activateOnHoverRow; + } + _createAvatarShapeRow(){ + let avatarStyleRow = new PW.FrameBoxRow(); + let avatarStyleLabel = new Gtk.Label({ + label: _('Avatar Icon Shape'), + xalign:0, + hexpand: true, + }); + let avatarStyleCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + avatarStyleCombo.append_text(_("Circular")); + avatarStyleCombo.append_text(_("Square")); + avatarStyleCombo.set_active(this._settings.get_enum('avatar-style')); + avatarStyleCombo.connect('changed', (widget) => { + this._settings.set_enum('avatar-style', widget.get_active()); + this._settings.set_boolean('reload-theme', true); + }); + avatarStyleRow.add(avatarStyleLabel); + avatarStyleRow.add(avatarStyleCombo); + return avatarStyleRow; + } + _createSearchBarLocationRow(bottomDefault){ + let searchBarLocationSetting = bottomDefault ? 'searchbar-default-bottom-location' : 'searchbar-default-top-location'; + + let searchbarLocationRow = new PW.FrameBoxRow(); + let searchbarLocationLabel = new Gtk.Label({ + label: _("Searchbar Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let searchbarLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + searchbarLocationCombo.append_text(_("Bottom")); + searchbarLocationCombo.append_text(_("Top")); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting )); + searchbarLocationCombo.connect('changed', (widget) => { + this._settings.set_enum(searchBarLocationSetting , widget.get_active()); + }); + + searchbarLocationRow.add(searchbarLocationLabel); + searchbarLocationRow.add(searchbarLocationCombo); + return searchbarLocationRow; + } + _createFlipHorizontalRow(){ + let horizontalFlipRow = new PW.FrameBoxRow(); + let horizontalFlipLabel = new Gtk.Label({ + label: _("Flip Layout Horizontally"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let horizontalFlipSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + horizontalFlipSwitch.set_active(this._settings.get_boolean('enable-horizontal-flip')); + horizontalFlipSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-horizontal-flip', widget.get_active()); + }); + horizontalFlipRow.add(horizontalFlipLabel); + horizontalFlipRow.add(horizontalFlipSwitch); + return horizontalFlipRow; + } + _disableAvatarRow(){ + let disableAvatarRow = new PW.FrameBoxRow(); + let disableAvatarLabel = new Gtk.Label({ + label: _('Disable User Avatar'), + xalign:0, + hexpand: true, + }); + let disableAvatarSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + disableAvatarSwitch.set_active(this._settings.get_boolean('disable-user-avatar')); + disableAvatarSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('disable-user-avatar', widget.get_active()); + }); + disableAvatarRow.add(disableAvatarLabel); + disableAvatarRow.add(disableAvatarSwitch); + return disableAvatarRow; + } + + _loadElevenTweaks(){ + let elevenTweaksFrame = new PW.FrameBox(); + let disableFrequentAppsRow = new PW.FrameBoxRow(); + let disableFrequentAppsLabel = new Gtk.Label({ + label: _("Disable Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let disableFrequentAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + disableFrequentAppsSwitch.set_active(this._settings.get_boolean('eleven-disable-frequent-apps')); + disableFrequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('eleven-disable-frequent-apps', widget.get_active()); + }); + disableFrequentAppsRow.add(disableFrequentAppsLabel); + disableFrequentAppsRow.add(disableFrequentAppsSwitch); + elevenTweaksFrame.add(disableFrequentAppsRow); + this.mainBox.append(elevenTweaksFrame); + } + + _loadGnomeOverviewTweaks(){ + let gnomeOverviewTweaksFrame = new PW.FrameBox(); + let appsGridRow = new PW.FrameBoxRow(); + let appsGridLabel = new Gtk.Label({ + label: _("Show Applications Grid"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let appsGridSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + appsGridSwitch.set_active(this._settings.get_boolean('gnome-dash-show-applications')); + appsGridSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('gnome-dash-show-applications', widget.get_active()); + }); + appsGridRow.add(appsGridLabel); + appsGridRow.add(appsGridSwitch); + gnomeOverviewTweaksFrame.add(appsGridRow); + this.mainBox.append(gnomeOverviewTweaksFrame); + } + + _loadWindowsTweaks(){ + let windowsTweaksFrame = new PW.FrameBox(); + let frequentAppsRow = new PW.FrameBoxRow(); + let frequentAppsLabel = new Gtk.Label({ + label: _("Disable Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let frequentAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + frequentAppsSwitch.set_active(this._settings.get_boolean('windows-disable-frequent-apps')); + frequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('windows-disable-frequent-apps', widget.get_active()); + }); + frequentAppsRow.add(frequentAppsLabel); + frequentAppsRow.add(frequentAppsSwitch); + windowsTweaksFrame.add(frequentAppsRow); + + let pinnedAppsRow = new PW.FrameBoxRow(); + let pinnedAppsLabel = new Gtk.Label({ + label: _("Disable Pinned Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let pinnedAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + pinnedAppsSwitch.set_active(this._settings.get_boolean('windows-disable-pinned-apps')); + pinnedAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('windows-disable-pinned-apps', widget.get_active()); + }); + pinnedAppsRow.add(pinnedAppsLabel); + pinnedAppsRow.add(pinnedAppsSwitch); + windowsTweaksFrame.add(pinnedAppsRow); + + this.mainBox.append(windowsTweaksFrame); + } + + _loadPlasmaMenuTweaks(){ + let plasmaMenuTweaksFrame = new PW.FrameBox(); + + let searchBarLocationSetting = 'searchbar-default-top-location'; + + let searchbarLocationRow = new PW.FrameBoxRow(); + let searchbarLocationLabel = new Gtk.Label({ + label: _("Searchbar Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let searchbarLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + searchbarLocationCombo.append_text(_("Bottom")); + searchbarLocationCombo.append_text(_("Top")); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting)); + searchbarLocationCombo.connect('changed', (widget) => { + this._settings.set_enum(searchBarLocationSetting , widget.get_active()); + }); + + searchbarLocationRow.add(searchbarLocationLabel); + searchbarLocationRow.add(searchbarLocationCombo); + plasmaMenuTweaksFrame.add(searchbarLocationRow); + + let hoverRow = new PW.FrameBoxRow(); + let hoverLabel = new Gtk.Label({ + label: _("Activate on Hover"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hoverSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + hoverSwitch.set_active(this._settings.get_boolean('plasma-enable-hover')); + hoverSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('plasma-enable-hover', widget.get_active()); + }); + hoverRow.add(hoverLabel); + hoverRow.add(hoverSwitch); + plasmaMenuTweaksFrame.add(hoverRow); + + let foregroundColorRow = new PW.FrameBoxRow(); + let foregroundColorLabel = new Gtk.Label({ + label: _('Selected Button Border Color'), + xalign:0, + hexpand: true, + }); + let foregroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + let color = new Gdk.RGBA(); + color.parse(this._settings.get_string('plasma-selected-color')); + foregroundColorChooser.set_rgba(color); + foregroundColorChooser.connect('color-set', ()=>{ + this._settings.set_string('plasma-selected-color', foregroundColorChooser.get_rgba().to_string()); + this._settings.set_boolean('reload-theme', true); + }); + foregroundColorRow.add(foregroundColorLabel); + foregroundColorRow.add(foregroundColorChooser); + plasmaMenuTweaksFrame.add(foregroundColorRow); + + let backgroundColorRow = new PW.FrameBoxRow(); + let backgroundColorLabel = new Gtk.Label({ + label: _('Selected Button Background Color'), + xalign:0, + hexpand: true, + }); + let backgroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this._settings.get_string('plasma-selected-background-color')); + backgroundColorChooser.set_rgba(color); + backgroundColorChooser.connect('color-set', ()=>{ + this._settings.set_string('plasma-selected-background-color',backgroundColorChooser.get_rgba().to_string()); + this._settings.set_boolean('reload-theme', true); + }); + backgroundColorRow.add(backgroundColorLabel); + backgroundColorRow.add(backgroundColorChooser); + plasmaMenuTweaksFrame.add(backgroundColorRow); + + this.mainBox.append(plasmaMenuTweaksFrame); + + let resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + halign: Gtk.Align.START, + hexpand: true + }); + resetButton.set_sensitive(true); + resetButton.connect('clicked', ()=> { + let foregroundColor = this._settings.get_default_value('plasma-selected-color').unpack(); + let backgroundColor = this._settings.get_default_value('plasma-selected-background-color').unpack(); + let hoverEnabled = this._settings.get_default_value('plasma-enable-hover').unpack(); + let showDescriptions = this._settings.get_default_value('apps-show-extra-details').unpack(); + this._settings.reset('searchbar-default-top-location'); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting)); + hoverSwitch.set_active(hoverEnabled); + color.parse(foregroundColor); + foregroundColorChooser.set_rgba(color); + color.parse(backgroundColor); + backgroundColorChooser.set_rgba(color); + descriptionsSwitch.set_active(showDescriptions); + this._settings.reset('plasma-selected-color'); + this._settings.reset('plasma-selected-background-color'); + this._settings.reset('plasma-enable-hover'); + this._settings.reset('apps-show-extra-details'); + this._settings.set_boolean('reload-theme', true); + }); + this.mainBox.append(resetButton); + } + _loadBriskMenuTweaks(){ + let briskMenuTweaksFrame = new PW.FrameBox(); + briskMenuTweaksFrame.add(this._createActivateOnHoverRow()); + briskMenuTweaksFrame.add(this._createSearchBarLocationRow()); + briskMenuTweaksFrame.add(this._createFlipHorizontalRow()); + let pinnedAppsFrame = new PW.FrameBox(); + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow(); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_max_content_height(100); + pinnedAppsScrollWindow.set_min_content_height(100); + + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('brisk-shortcuts-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('brisk-shortcuts-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Brisk Menu Shortcuts") + "", + use_markup: true, + xalign: 0 + }); + + this.mainBox.append(briskMenuTweaksFrame); + this.mainBox.append(pinnedAppsHeaderLabel); + this.mainBox.append(pinnedAppsScrollWindow); + this.mainBox.append(savePinnedAppsButton); + } + _loadChromebookTweaks(){ + let chromeBookTweaksFrame = new PW.FrameBox(); + chromeBookTweaksFrame.add(this._createSearchBarLocationRow()); + this.mainBox.append(chromeBookTweaksFrame); + } + _loadElementaryTweaks(){ + let elementaryTweaksFrame = new PW.FrameBox(); + elementaryTweaksFrame.add(this._createSearchBarLocationRow()); + this.mainBox.append(elementaryTweaksFrame); + } + _loadBudgieMenuTweaks(){ + let budgieMenuTweaksFrame = new PW.FrameBox(); + budgieMenuTweaksFrame.add(this._createActivateOnHoverRow()); + budgieMenuTweaksFrame.add(this._createSearchBarLocationRow()); + budgieMenuTweaksFrame.add(this._createFlipHorizontalRow()); + + let enableActivitiesRow = new PW.FrameBoxRow(); + let enableActivitiesLabel = new Gtk.Label({ + label: _('Enable Activities Overview Shortcut'), + xalign:0, + hexpand: true, + }); + let enableActivitiesSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + enableActivitiesSwitch.set_active(this._settings.get_boolean('enable-activities-shortcut')); + enableActivitiesSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-activities-shortcut', widget.get_active()); + }); + enableActivitiesRow.add(enableActivitiesLabel); + enableActivitiesRow.add(enableActivitiesSwitch); + budgieMenuTweaksFrame.add(enableActivitiesRow); + + this.mainBox.append(budgieMenuTweaksFrame); + } + _loadRunnerMenuTweaks(){ + let runnerMenuTweaksFrame = new PW.FrameBox(); + let runnerPositionRow = new PW.FrameBoxRow(); + let runnerPositionLabel = new Gtk.Label({ + label: _('Position'), + xalign:0, + hexpand: true, + }); + let runnerPositionCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + runnerPositionCombo.append_text(_("Top")); + runnerPositionCombo.append_text(_("Centered")); + runnerPositionCombo.set_active(this._settings.get_enum('runner-position')); + runnerPositionCombo.connect('changed', (widget) => { + this._settings.set_enum('runner-position', widget.get_active()); + }); + runnerPositionRow.add(runnerPositionLabel); + runnerPositionRow.add(runnerPositionCombo); + runnerMenuTweaksFrame.add(runnerPositionRow); + + let runnerWidthRow = new PW.FrameBoxRow(); + let runnerWidthLabel = new Gtk.Label({ + label: _("Width"), + use_markup: true, + hexpand: true, + xalign: 0 + }); + let runnerWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: 1000, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + runnerWidthScale.add_mark(500, Gtk.PositionType.TOP, _("Default")); + runnerWidthScale.set_value(this._settings.get_int('runner-menu-width')); + runnerWidthScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-menu-width', widget.get_value()); + }); + runnerWidthRow.add(runnerWidthLabel); + runnerWidthRow.add(runnerWidthScale); + runnerMenuTweaksFrame.add(runnerWidthRow); + + let runnerHeightRow = new PW.FrameBoxRow(); + let runnerHeightLabel = new Gtk.Label({ + label: _("Height"), + use_markup: true, + hexpand: true, + xalign: 0 + }); + let runnerHeightScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: 1000, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + runnerHeightScale.add_mark(400, Gtk.PositionType.TOP, _("Default")); + runnerHeightScale.set_value(this._settings.get_int('runner-menu-height')); + runnerHeightScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-menu-height', widget.get_value()); + }); + + runnerHeightRow.add(runnerHeightLabel); + runnerHeightRow.add(runnerHeightScale); + runnerMenuTweaksFrame.add(runnerHeightRow); + + let runnerFontSizeRow = new PW.FrameBoxRow(); + let runnerFontSizeLabel = new Gtk.Label({ + label: _("Font Size"), + hexpand: true, + use_markup: true, + xalign: 0 + }); + let runnerFontSizeScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 30, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + + runnerFontSizeScale.add_mark(0, Gtk.PositionType.TOP, _("Default")); + runnerFontSizeScale.set_value(this._settings.get_int('runner-font-size')); + runnerFontSizeScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-font-size', widget.get_value()); + }); + runnerFontSizeRow.add(runnerFontSizeLabel); + runnerFontSizeRow.add(runnerFontSizeScale); + runnerMenuTweaksFrame.add(runnerFontSizeRow); + + let frequentAppsRow = new PW.FrameBoxRow(); + let frequentAppsLabel = new Gtk.Label({ + label: _("Show Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let frequentAppsSwitch = new Gtk.Switch(); + if(this._settings.get_boolean('runner-show-frequent-apps')) + frequentAppsSwitch.set_active(true); + frequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('runner-show-frequent-apps', widget.get_active()); + }); + frequentAppsRow.add(frequentAppsLabel); + frequentAppsRow.add(frequentAppsSwitch); + runnerMenuTweaksFrame.add(frequentAppsRow); + + let inheritThemeGapRow = new PW.FrameBoxRow(); + let inheritThemeGapLabel = new Gtk.Label({ + label: _("Inherit Shell Theme Popup Gap"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let inheritThemeGapSwitch = new Gtk.Switch(); + if(this._settings.get_boolean('runner-use-theme-gap')) + inheritThemeGapSwitch.set_active(true); + inheritThemeGapSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('runner-use-theme-gap', widget.get_active()); + }); + inheritThemeGapRow.add(inheritThemeGapLabel); + inheritThemeGapRow.add(inheritThemeGapSwitch); + runnerMenuTweaksFrame.add(inheritThemeGapRow); + + this.mainBox.append(runnerMenuTweaksFrame); + } + _loadUnityTweaks(){ + let pinnedAppsFrame = new PW.FrameBox(); + let generalTweaksFrame = new PW.FrameBox(); + let homeScreenRow = new PW.FrameBoxRow(); + let homeScreenLabel = new Gtk.Label({ + label: _('Default View'), + xalign:0, + hexpand: true, + }); + let homeScreenCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + homeScreenCombo.append_text(_("Home Screen")); + homeScreenCombo.append_text(_("All Programs")); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + homeScreenCombo.set_active(homeScreen ? 0 : 1); + homeScreenCombo.connect('changed', (widget) => { + let enable = widget.get_active() ==0 ? true : false; + this._settings.set_boolean('enable-unity-homescreen', enable); + }); + homeScreenRow.add(homeScreenLabel); + homeScreenRow.add(homeScreenCombo); + generalTweaksFrame.add(homeScreenRow); + this.mainBox.append(generalTweaksFrame); + + let widgetFrame = this._createWidgetsRows(Constants.MenuLayout.UNITY); + this.mainBox.append(widgetFrame); + + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + pinnedAppsScrollWindow.set_min_content_height(400); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('unity-pinned-app-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('unity-pinned-app-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Unity Layout Buttons") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsHeaderLabel); + this.mainBox.append(pinnedAppsScrollWindow); + this.mainBox.append(savePinnedAppsButton); + + let pinnedAppsSeparatorHeaderLabel = new Gtk.Label({ + label: "" + _("Button Separator Position") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsSeparatorHeaderLabel); + + let pinnedAppsSeparatorFrame = new PW.FrameBox(); + let pinnedAppsSeparatorRow = new PW.FrameBoxRow(); + let pinnedAppsSeparatorLabel = new Gtk.Label({ + label: _("Separator Position"), + use_markup: true, + xalign: 0 + }); + let pinnedAppsSeparatorScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 7, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true + }); + pinnedAppsSeparatorScale.add_mark(0, Gtk.PositionType.BOTTOM, _("None")); + pinnedAppsSeparatorScale.set_value(this._settings.get_int('unity-separator-index')); + pinnedAppsSeparatorScale.connect('value-changed', (widget) => { + this._settings.set_int('unity-separator-index', widget.get_value()); + }); + + let infoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + infoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _('Adjust the position of the separator in the button panel'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorLabel); + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorScale); + pinnedAppsSeparatorRow.add(infoButton); + pinnedAppsSeparatorFrame.add(pinnedAppsSeparatorRow); + this.mainBox.append(pinnedAppsSeparatorFrame); + } + _loadRavenTweaks(){ + let generalTweaksFrame = new PW.FrameBox(); + let homeScreenRow = new PW.FrameBoxRow(); + let homeScreenLabel = new Gtk.Label({ + label: _('Default View'), + xalign:0, + hexpand: true, + }); + let homeScreenCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + homeScreenCombo.append_text(_("Home Screen")); + homeScreenCombo.append_text(_("All Programs")); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + homeScreenCombo.set_active(homeScreen ? 0 : 1); + homeScreenCombo.connect('changed', (widget) => { + let enable = widget.get_active() ==0 ? true : false; + this._settings.set_boolean('enable-unity-homescreen', enable); + }); + homeScreenRow.add(homeScreenLabel); + homeScreenRow.add(homeScreenCombo); + generalTweaksFrame.add(homeScreenRow); + this.mainBox.append(generalTweaksFrame); + + let ravenPositionRow = new PW.FrameBoxRow(); + let ravenPositionLabel = new Gtk.Label({ + label: _('Position on Monitor'), + xalign:0, + hexpand: true, + }); + let ravenPositionCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + ravenPositionCombo.append_text(_("Left")); + ravenPositionCombo.append_text(_("Right")); + let ravenPosition = this._settings.get_enum('raven-position'); + ravenPositionCombo.set_active(ravenPosition); + ravenPositionCombo.connect('changed', (widget) => { + this._settings.set_enum('raven-position', widget.get_active()); + }); + ravenPositionRow.add(ravenPositionLabel); + ravenPositionRow.add(ravenPositionCombo); + generalTweaksFrame.add(ravenPositionRow); + generalTweaksFrame.add(this._createActivateOnHoverRow()); + let widgetFrame = this._createWidgetsRows(Constants.MenuLayout.RAVEN); + this.mainBox.append(widgetFrame); + } + _loadMintMenuTweaks(){ + let mintMenuTweaksFrame = new PW.FrameBox(); + mintMenuTweaksFrame.add(this._createActivateOnHoverRow()); + mintMenuTweaksFrame.add(this._createSearchBarLocationRow()); + mintMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(mintMenuTweaksFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Mint Layout Shortcuts") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsHeaderLabel); + + let pinnedAppsFrame = new PW.FrameBox(); + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow(); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_min_content_height(400); + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('mint-pinned-app-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('mint-pinned-app-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + this.mainBox.append(pinnedAppsScrollWindow); + + this.mainBox.append(savePinnedAppsButton); + + let pinnedAppsSeparatorHeaderLabel = new Gtk.Label({ + label: "" + _("Shortcut Separator Position") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsSeparatorHeaderLabel); + + let pinnedAppsSeparatorFrame = new PW.FrameBox(); + let pinnedAppsSeparatorRow = new PW.FrameBoxRow(); + let pinnedAppsSeparatorLabel = new Gtk.Label({ + label: _("Separator Position"), + use_markup: true, + xalign: 0 + }); + let pinnedAppsSeparatorScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 7, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + }); + pinnedAppsSeparatorScale.add_mark(0, Gtk.PositionType.BOTTOM, _("None")); + pinnedAppsSeparatorScale.set_value(this._settings.get_int('mint-separator-index')); + pinnedAppsSeparatorScale.connect('value-changed', (widget) => { + this._settings.set_int('mint-separator-index', widget.get_value()); + }); + + let infoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + infoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _('Adjust the position of the separator in the button panel'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorLabel); + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorScale); + pinnedAppsSeparatorRow.add(infoButton); + pinnedAppsSeparatorFrame.add(pinnedAppsSeparatorRow); + this.mainBox.append(pinnedAppsSeparatorFrame); + } + _loadPinnedApps(array,frame, savePinnedAppsButton, scrollWindow) { + for(let i = 0; i < array.length; i += 3) { + let frameRow = new PW.FrameBoxDragRow(scrollWindow); + frameRow._name = array[i]; + frameRow._icon = Prefs.getIconPath([array[i], array[i+1], array[i+2]]); + frameRow._cmd = array[i+2]; + frameRow.saveButton = savePinnedAppsButton; + frameRow.hasEditButton = true; + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + let arcMenuImage = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + + let arcMenuImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + arcMenuImageBox.append(dragImage); + arcMenuImageBox.append(arcMenuImage); + frameRow.add(arcMenuImageBox); + + let frameLabel = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true + }); + + frameLabel.label = _(frameRow._name); + frameRow.add(frameLabel); + + Prefs.checkIfValidShortcut(frameRow, frameLabel, arcMenuImage); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: frame, + buttons: [savePinnedAppsButton], + modifyButton: true, + changeButton: true + }); + + buttonBox.connect('change', ()=> { + let dialog = new Prefs.AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.OTHER); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + let icon = Prefs.getIconPath(newPinnedApps); + arcMenuImage.gicon = Gio.icon_new_for_string(iconString ? iconString : icon); + dialog.destroy(); + frame.show(); + savePinnedAppsButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new Prefs.AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.OTHER, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + arcMenuImage.gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + dialog.destroy(); + frame.show(); + savePinnedAppsButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + frameRow.add(buttonBox); + frame.add(frameRow); + } + } + _loadWhiskerMenuTweaks(){ + let whiskerMenuTweaksFrame = new PW.FrameBox(); + whiskerMenuTweaksFrame.add(this._createActivateOnHoverRow()); + whiskerMenuTweaksFrame.add(this._createAvatarShapeRow()); + whiskerMenuTweaksFrame.add(this._createSearchBarLocationRow()); + whiskerMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(whiskerMenuTweaksFrame); + } + _loadRedmondMenuTweaks(){ + let redmondMenuTweaksFrame = new PW.FrameBox(); + redmondMenuTweaksFrame.add(this._createSearchBarLocationRow()); + + redmondMenuTweaksFrame.add(this._createFlipHorizontalRow()); + redmondMenuTweaksFrame.add(this._createAvatarShapeRow()); + redmondMenuTweaksFrame.add(this._disableAvatarRow()); + + let placesFrame = new PW.FrameBox(); + let externalDeviceRow = new PW.FrameBoxRow(); + let externalDeviceLabel = new Gtk.Label({ + label: _("External Devices"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let externalDeviceButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-external-devices')) + externalDeviceButton.set_active(true); + externalDeviceButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-external-devices', widget.get_active()); + }); + externalDeviceRow.add(externalDeviceLabel); + externalDeviceRow.add(externalDeviceButton); + + placesFrame.add(externalDeviceRow); + + let bookmarksRow = new PW.FrameBoxRow(); + let bookmarksLabel = new Gtk.Label({ + label: _("Bookmarks"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let bookmarksButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-bookmarks')) + bookmarksButton.set_active(true); + bookmarksButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-bookmarks', widget.get_active()); + }); + bookmarksRow.add(bookmarksLabel); + bookmarksRow.add(bookmarksButton); + + placesFrame.add(bookmarksRow); + this.mainBox.append(redmondMenuTweaksFrame); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Shortcuts") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + this.mainBox.append(placesFrame); + + } + _loadInsiderMenuTweaks(){ + let insiderMenuTweaksFrame = new PW.FrameBox(); + insiderMenuTweaksFrame.add(this._createAvatarShapeRow()); + this.mainBox.append(insiderMenuTweaksFrame); + } + _loadGnomeMenuTweaks(){ + let gnomeMenuTweaksFrame = new PW.FrameBox(); + gnomeMenuTweaksFrame.add(this._createActivateOnHoverRow()); + gnomeMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(gnomeMenuTweaksFrame); + } + _loadPlaceHolderTweaks(){ + let placeHolderFrame = new PW.FrameBox(); + let placeHolderRow = new PW.FrameBoxRow(); + let placeHolderLabel = new Gtk.Label({ + label: _("Nothing Yet!"), + use_markup: true, + halign: Gtk.Align.CENTER, + hexpand: true + }); + placeHolderRow.add(placeHolderLabel); + placeHolderFrame.add(placeHolderRow); + this.mainBox.append(placeHolderFrame); + } + _loadTogneeMenuTweaks(){ + let togneeMenuTweaksFrame = new PW.FrameBox(); + let searchBarBottomDefault = true; + let defaultLeftBoxRow = new PW.FrameBoxRow(); + let defaultLeftBoxLabel = new Gtk.Label({ + label: _("Default View"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let defaultLeftBoxCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END + }); + defaultLeftBoxCombo.append_text(_("Categories List")); + defaultLeftBoxCombo.append_text(_("All Programs")); + defaultLeftBoxCombo.set_active(this._settings.get_enum('default-menu-view-tognee')); + defaultLeftBoxCombo.connect('changed', (widget) => { + this._settings.set_enum('default-menu-view-tognee', widget.get_active()); + }); + + defaultLeftBoxRow.add(defaultLeftBoxLabel); + defaultLeftBoxRow.add(defaultLeftBoxCombo); + togneeMenuTweaksFrame.add(defaultLeftBoxRow); + togneeMenuTweaksFrame.add(this._createSearchBarLocationRow(searchBarBottomDefault)); + togneeMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(togneeMenuTweaksFrame); + } + _loadArcMenuTweaks(){ + let arcMenuTweaksFrame = new PW.FrameBox(); + let defaultLeftBoxRow = new PW.FrameBoxRow(); + let defaultLeftBoxLabel = new Gtk.Label({ + label: _("Default View"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let defaultLeftBoxCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + defaultLeftBoxCombo.append_text(_("Pinned Apps")); + defaultLeftBoxCombo.append_text(_("Categories List")); + defaultLeftBoxCombo.append_text(_("Frequent Apps")); + defaultLeftBoxCombo.append_text(_("All Programs")); + defaultLeftBoxCombo.set_active(this._settings.get_enum('default-menu-view')); + defaultLeftBoxCombo.connect('changed', (widget) => { + this._settings.set_enum('default-menu-view', widget.get_active()); + }); + + defaultLeftBoxRow.add(defaultLeftBoxLabel); + defaultLeftBoxRow.add(defaultLeftBoxCombo); + arcMenuTweaksFrame.add(defaultLeftBoxRow); + + let searchBarBottomDefault = true; + arcMenuTweaksFrame.add(this._createSearchBarLocationRow(searchBarBottomDefault)); + arcMenuTweaksFrame.add(this._createFlipHorizontalRow()); + arcMenuTweaksFrame.add(this._createAvatarShapeRow()); + arcMenuTweaksFrame.add(this._disableAvatarRow()); + + let placesFrame = new PW.FrameBox(); + let externalDeviceRow = new PW.FrameBoxRow(); + let externalDeviceLabel = new Gtk.Label({ + label: _("External Devices"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let externalDeviceButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-external-devices')) + externalDeviceButton.set_active(true); + externalDeviceButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-external-devices', widget.get_active()); + }); + externalDeviceRow.add(externalDeviceLabel); + externalDeviceRow.add(externalDeviceButton); + + placesFrame.add(externalDeviceRow); + + let bookmarksRow = new PW.FrameBoxRow(); + let bookmarksLabel = new Gtk.Label({ + label: _("Bookmarks"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let bookmarksButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-bookmarks')) + bookmarksButton.set_active(true); + bookmarksButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-bookmarks', widget.get_active()); + }); + bookmarksRow.add(bookmarksLabel); + bookmarksRow.add(bookmarksButton); + + placesFrame.add(bookmarksRow); + this.mainBox.append(arcMenuTweaksFrame); + + let extraCategoriesFrame = new PW.FrameBox(); + let extraCategoriesRow = new PW.FrameBoxRow(); + let extraCategoriesButtonRow = new PW.FrameBoxRow(); + let extraCategoriesLocationRow = new PW.FrameBoxRow(); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Shortcuts") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + this.mainBox.append(placesFrame); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Categories Quick Links") + "" + + "\n" + '' + _("Display quick links of extra categories on the home page") + "" + + "\n" + '' + _("See Customize Menu -> Extra Categories") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + let extraCategoriesLinksBox = new Prefs.MenuSettingsCategoriesPage(this._settings, "arcmenu-extra-categories-links"); + extraCategoriesLinksBox.categoriesFrame.unparent(); + extraCategoriesLinksBox.buttonRow.unparent(); + extraCategoriesRow.add(extraCategoriesLinksBox.categoriesFrame); + extraCategoriesLinksBox.categoriesFrame.hexpand = true; + extraCategoriesLinksBox.categoriesFrame.halign = Gtk.Align.FILL; + extraCategoriesButtonRow.add(extraCategoriesLinksBox.buttonRow); + extraCategoriesFrame.add(extraCategoriesRow); + extraCategoriesFrame.add(extraCategoriesButtonRow); + + this.mainBox.append(extraCategoriesFrame); + + let extraCategoriesLocationFrame = new PW.FrameBox(); + let extraCategoriesLocationLabel = new Gtk.Label({ + label: _("Quick Links Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let extraCategoriesLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + extraCategoriesLocationCombo.append_text(_("Bottom")); + extraCategoriesLocationCombo.append_text(_("Top")); + extraCategoriesLocationCombo.set_active(this._settings.get_enum('arcmenu-extra-categories-links-location')); + extraCategoriesLocationCombo.connect('changed', (widget) => { + this._settings.set_enum('arcmenu-extra-categories-links-location' , widget.get_active()); + }); + + extraCategoriesLocationRow.add(extraCategoriesLocationLabel); + extraCategoriesLocationRow.add(extraCategoriesLocationCombo); + extraCategoriesLocationFrame.add(extraCategoriesLocationRow); + this.mainBox.append(extraCategoriesLocationFrame); + } + _createWidgetsRows(layout){ + let weatherWidgetSetting = 'enable-weather-widget-raven'; + let clockWidgetSetting = 'enable-clock-widget-raven'; + if(layout == Constants.MenuLayout.RAVEN){ + weatherWidgetSetting = 'enable-weather-widget-raven'; + clockWidgetSetting = 'enable-clock-widget-raven'; + } + else{ + weatherWidgetSetting = 'enable-weather-widget-unity'; + clockWidgetSetting = 'enable-clock-widget-unity'; + } + + let widgetFrame = new PW.FrameBox(); + let weatherWidgetRow = new PW.FrameBoxRow(); + let weatherWidgetLabel = new Gtk.Label({ + label: _("Enable Weather Widget"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let weatherWidgetSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + weatherWidgetSwitch.set_active(this._settings.get_boolean(weatherWidgetSetting)); + weatherWidgetSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(weatherWidgetSetting, widget.get_active()); + }); + + weatherWidgetRow.add(weatherWidgetLabel); + weatherWidgetRow.add(weatherWidgetSwitch); + widgetFrame.add(weatherWidgetRow); + + let clockWidgetRow = new PW.FrameBoxRow(); + let clockWidgetLabel = new Gtk.Label({ + label: _("Enable Clock Widget"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let clockWidgetSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + clockWidgetSwitch.set_active(this._settings.get_boolean(clockWidgetSetting)); + clockWidgetSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(clockWidgetSetting, widget.get_active()); + }); + + clockWidgetRow.add(clockWidgetLabel); + clockWidgetRow.add(clockWidgetSwitch); + widgetFrame.add(clockWidgetRow); + + return widgetFrame; + } +}); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js new file mode 100644 index 0000000..b29a5bb --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js @@ -0,0 +1,445 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + VerticalMainBox: true, + DefaultMenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen) + this.activeCategory = _("Pinned Apps"); + else + this.activeCategory = _("All Programs"); + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: 'padding-bottom: 10px; padding-right: 15px;' + }); + + this.mainBox.add_child(this.topBox); + this.categoriesButton = new MW.CategoriesButton(this); + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.actor.y_align = Clutter.ActorAlign.CENTER; + this.searchBox.actor.y_expand = true; + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 15px 0px 15px;"; + this.topBox.add_child(this.searchBox.actor); + this.topBox.add_child(this.categoriesButton.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style: "padding-bottom: 10px;" + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.arcMenu.box.style = "padding-bottom:0px;"; + + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px;background-color:rgba(186, 196,201, 0.1) ; padding: 5px 5px;"+ + "border-color:rgba(186, 196,201, 0.2) ; border-top-width: 1px;"; + this.themeNodeBorderRadius = ""; + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + this.themeNodeBorderRadius + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.widgetBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END, + vertical: false, + style_class: 'datemenu-displays-box' + }); + + this.widgetBox.style = "margin: 0px; spacing: 10px; padding: 10px 50px;"; + this._weatherItem = new MW.WeatherSection(this); + this._weatherItem.style = "border-radius:4px; width: 350px; padding: 10px; margin: 0px"; + this._clocksItem = new MW.WorldClocksSection(this); + this._clocksItem.style = "border-radius:4px; padding: 10px; margin: 0px"; + + this.appShortcuts = []; + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + + this.shortcutsBox.add_child(this.shortcutsGrid); + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let isContainedInCategory = false; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.GRID, isContainedInCategory); + this.appShortcuts.push(shortcutMenuItem); + } + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this._createCategoriesMenu(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _addSeparator(){ + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.ALWAYS_SHOW, Constants.SeparatorAlignment.VERTICAL); + this.actionsBox.add_child(verticalSeparator); + } + + loadExtraPinnedApps(){ + this.actionsContainerBox.remove_child(this.actionsBox); + this.actionsBox.destroy_all_children(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px; padding: 5px 0px;"; + this.actionsContainerBox.add_child(this.actionsBox); + + super.loadExtraPinnedApps(this._settings.get_strv('unity-pinned-app-list'), this._settings.get_int('unity-separator-index')); + } + + _createExtraPinnedAppsList(){ + let pinnedApps = []; + pinnedApps.push(_("Home"), "ArcMenu_Home", "ArcMenu_Home"); + pinnedApps.push(_("Documents"), "ArcMenu_Documents", "ArcMenu_Documents"); + pinnedApps.push(_("Downloads"), "ArcMenu_Downloads", "ArcMenu_Downloads"); + + let software = Utils.findSoftwareManager(); + if(software) + pinnedApps.push(_("Software"), 'system-software-install-symbolic', software); + else + pinnedApps.push(_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"); + + pinnedApps.push(_("Files"), "system-file-manager", "org.gnome.Nautilus.desktop"); + pinnedApps.push(_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"); + pinnedApps.push(_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"); + pinnedApps.push(_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"); + + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('unity-pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + return pinnedApps; + } + + _createCategoriesMenu(){ + this.categoriesMenu = new PopupMenu.PopupMenu(this.categoriesButton.actor, 0.5, St.Side.TOP); + this.categoriesMenu.blockSourceEvents = true; + this.categoriesMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.categoriesButton.tooltip){ + this.categoriesButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.categoriesButton.active = false; + this.categoriesButton.sync_hover(); + this.categoriesButton.hovered = this.categoriesButton.hover; + } + }); + this.section = new PopupMenu.PopupMenuSection(); + this.categoriesMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + overlay_scrollbars: true, + reactive:true + }); + this.leftPanelPopup.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + this.categoriesScrollBox.clip_to_allocation = true; + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(350 / scaleFactor); + this.leftPanelPopup.style = `max-height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this._displayCategories(); + this.subMenuManager.addMenu(this.categoriesMenu); + this.categoriesMenu.actor.hide(); + Main.uiGroup.add_child(this.categoriesMenu.actor); + } + + toggleCategoriesMenu(){ + let appsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.categoriesMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.categoriesMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + this.categoriesButton.tooltip.hide(); + + this.categoriesMenu.toggle(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen){ + this.activeCategory = _("Pinned Apps"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + else{ + this.activeCategory = _("All Programs"); + let isGridLayout = true; + this.displayAllApps(isGridLayout); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + } + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + this.themeNodeBorderRadius; + + if(removeMenuArrow) + this.arcMenu.box.style = "padding-bottom:0px; margin:0px;"; + else + this.arcMenu.box.style = "padding-bottom:0px;"; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.HOME_SCREEN, Constants.DisplayType.LIST); + this.categoryDirectories.set(Constants.CategoryType.HOME_SCREEN, categoryMenuItem); + this.hasPinnedApps = true; + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum == Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + _displayCategories(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.categoriesBox.add_actor(categoryMenuItem.actor); + } + } + + displayPinnedApps() { + if(this.activeCategoryType === Constants.CategoryType.HOME_SCREEN) + this._clearActorsFromBox(this.applicationsBox); + else + this._clearActorsFromBox(); + this.subMainBox.remove_child(this.actionsContainerBox); + this.activeCategory = _("Pinned Apps"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + this.activeCategory = _("Shortcuts"); + this._displayAppList(this.appShortcuts, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + this.widgetBox.remove_all_children(); + if(this._settings.get_boolean('enable-clock-widget-unity')) + this.widgetBox.add_child(this._clocksItem); + if(this._settings.get_boolean('enable-weather-widget-unity')) + this.widgetBox.add_child(this._weatherItem); + if(!this.subMainBox.contains(this.widgetBox)) + this.subMainBox.add_child(this.widgetBox); + this.subMainBox.add_child(this.actionsContainerBox); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + let label = this._createLabelWithSeparator(_("Recent Files")); + this.applicationsBox.insert_child_at_index(label, 0); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.applicationsBox.add_style_class_name('margin-box'); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _clearActorsFromBox(box) { + if(this.categoriesMenu.isOpen) + this.categoriesMenu.toggle(); + if(this.subMainBox.contains(this.widgetBox)){ + this.subMainBox.remove_child(this.widgetBox); + } + this.applicationsBox.remove_style_class_name('margin-box'); + super._clearActorsFromBox(box); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + let label = this._createLabelWithSeparator(this.activeCategory); + if(grid === this.applicationsGrid) + this.applicationsBox.insert_child_at_index(label.actor, 0); + else + this.applicationsBox.insert_child_at_index(label.actor, 2); + } + + destroy(){ + if(this._clocksItem) + this._clocksItem.destroy(); + if(this._weatherItem) + this._weatherItem.destroy(); + + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js new file mode 100644 index 0000000..ab4958e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js @@ -0,0 +1,187 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + this.actionsBox.style = "spacing: 6px; margin: 0px 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.user.actor.x_expand = true; + this.user.actor.x_align = Clutter.ActorAlign.FILL; + this.actionsBox.add_child(this.user.actor); + + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + else{ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + } + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js new file mode 100644 index 0000000..047bd63 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js @@ -0,0 +1,465 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + SearchDisplayType: Constants.DisplayType.LIST, + DisplayType: Constants.DisplayType.LIST, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 300, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.actionsBox.style = "margin: 0px 5px 0px 10px; spacing: 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.extrasButton = new MW.ExtrasButton(this); + this.extrasButton.actor.y_expand = true; + this.extrasButton.actor.y_align= Clutter.ActorAlign.START; + this.actionsBox.add_child(this.extrasButton.actor); + let userButton = new MW.UserMenuItem(this, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(userButton.actor); + let path = GLib.get_user_special_dir(imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path != null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.actionsBox.add_child(placeMenuItem.actor); + } + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + this.leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(this.leaveButton.actor); + + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.pinnedAppsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade' + }); + + this.pinnedAppsBox = new St.BoxLayout({ + vertical: true, + x_expand: true + }); + this.pinnedAppsScrollBox.add_actor(this.pinnedAppsBox); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 10, + row_spacing: 10 + }); + this.pinnedAppsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.pinnedAppsGrid); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 15px 10px 0px 10px;"; + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + this.subMainBox.add_child(this.searchBox.actor); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcutsList = this._settings.get_value('application-shortcuts-list').deep_unpack(); + this.applicationShortcuts = []; + for(let i = 0; i < applicationShortcutsList.length; i++){ + let applicationName = applicationShortcutsList[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcutsList[i][1], applicationShortcutsList[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.applicationShortcuts.push(shortcutMenuItem.actor); + } + + let directoryShortcutsList = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + this._loadPlaces(directoryShortcutsList); + + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + + this._createExtrasMenu(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.pinnedAppsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView){ + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + this.pinnedAppsGrid.layout_manager.forceGridColumns = this.getColumnsFromGridIconSizeSetting(); + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + + if(id === 'bookmarks' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Bookmarks"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'devices' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Devices"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'network' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Network"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + } + + _loadPlaces(directoryShortcutsList) { + this.directoryShortcuts = []; + for (let i = 0; i < directoryShortcutsList.length; i++) { + let directory = directoryShortcutsList[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + this.directoryShortcuts.push(placeMenuItem); + } + } + + _createExtrasMenu(){ + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.extrasMenu = new PopupMenu.PopupMenu(this.dummyCursor, 0, St.Side.TOP); + this.section = new PopupMenu.PopupMenuSection(); + this.extrasMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + let headerBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.leftPanelPopup.add_child(headerBox); + + this.backButton = new MW.BackMenuItem(this); + this.backButton.connect("activate", () => this.toggleExtrasMenu()); + headerBox.add_child(this.backButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + headerBox.add_child(separator); + + this.computerScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + reactive:true, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + }); + + this.leftPanelPopup.add_child(this.computerScrollBox); + + this.computerBox = new St.BoxLayout({ + vertical: true + }); + this.computerScrollBox.add_actor(this.computerBox); + + this.computerBox.add_child(this.createLabelRow(_("Application Shortcuts"))); + for(let i = 0; i < this.applicationShortcuts.length; i++){ + this.computerBox.add_child(this.applicationShortcuts[i]); + } + this.computerBox.add_child(this.createLabelRow(_("Places"))); + for(let i = 0; i < this.directoryShortcuts.length; i++){ + this.computerBox.add_child(this.directoryShortcuts[i]); + } + this.computerBox.add_child(this.externalDevicesBox); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor) - 1; + this.leftPanelPopup.style = `height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this.subMenuManager.addMenu(this.extrasMenu); + this.extrasMenu.actor.hide(); + Main.uiGroup.add_child(this.extrasMenu.actor); + this.extrasMenu.connect('open-state-changed', (menu, open) => { + if(!open){ + this.extrasButton.active = false; + this.extrasButton.sync_hover(); + this.extrasButton.hovered = this.extrasButton.hover; + } + else{ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.extrasButton.tooltip){ + this.extrasButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + }); + } + + toggleExtrasMenu(){ + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.extrasMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.extrasMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + this.extrasButton.tooltip.hide(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let backgroundColor = themeNode.get_color('-arrow-background-color'); + let borderWidth = themeNode.get_length('-arrow-border-width'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + let drawBoxShadow = true; + if(backgroundColor?.alpha === 0){ + backgroundColor = themeNode.get_color('background-color'); + if(backgroundColor?.alpha === 0){ + drawBoxShadow = false; + } + } + + let styleProperties, shadowColor; + if(drawBoxShadow){ + shadowColor = backgroundColor.shade(.35); + backgroundColor = Utils.clutterColorToRGBA(backgroundColor); + shadowColor = Utils.clutterColorToRGBA(shadowColor); + styleProperties = "box-shadow: 3px 0px 2px " + shadowColor + "; background-color: " + backgroundColor + ";"; + } + + this.extrasMenu.actor.style = "-boxpointer-gap: 0px; -arrow-border-color: transparent; -arrow-border-width: 0px; width: 250px;" + +"-arrow-base:0px; -arrow-rise: 0px; -arrow-background-color: transparent;" + +"border-radius: " + borderRadius + "px;" + styleProperties; + + this.arcMenu.actor.get_allocation_box(); + let [x, y] = this.arcMenu.actor.get_transformed_position(); + let rise = themeNode.get_length('-arrow-rise'); + + if(this.arcMenu._arrowSide === St.Side.TOP) + y += rise + 1; + else + y += 1; + + if(this.arcMenu._arrowSide === St.Side.LEFT) + x = x + (borderRadius * 2) + rise + 1; + else + x = x + (borderRadius * 2); + + this.dummyCursor.set_position(Math.round(x + borderWidth), Math.round(y + borderWidth)); + this.extrasMenu.toggle(); + if(this.extrasMenu.isOpen){ + this.activeMenuItem = this.backButton; + this.backButton.grab_key_focus(); + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + + this.displayAllApps(); + if(!this._settings.get_boolean('windows-disable-pinned-apps')){ + if(!this.mainBox.contains(this.pinnedAppsScrollBox)) + this.mainBox.add_child(this.pinnedAppsScrollBox); + this.displayPinnedApps(); + } + + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + + displayAllApps(){ + this._clearActorsFromBox(); + let label = this._createLabelWithSeparator(_("Frequent")); + this.activeMenuItemSet = false; + + if(!this._settings.get_boolean('windows-disable-frequent-apps')){ + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + this.frequentAppsList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + this.frequentAppsList.push(item); + } + } + const MaxItems = 8; + if(this.frequentAppsList.length > 0){ + this.applicationsBox.add_child(label.actor); + for (let i = 0; i < this.frequentAppsList.length && i < MaxItems; i++) { + let item = this.frequentAppsList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_child(item.actor); + if(!this.activeMenuItemSet){ + this._frequentActiveItem = item; + this.activeMenuItemSet = true; + } + } + } + } + + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + + if(this.activeMenuItemSet) + this.activeMenuItem = this._frequentActiveItem; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayPinnedApps() { + super._clearActorsFromBox(this.pinnedAppsBox); + this.pinnedAppsGrid.remove_all_children(); + let label = this.createLabelRow(_("Pinned Apps")); + label.remove_child(label._ornamentLabel); + this.pinnedAppsBox.add_child(label); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.HOME_SCREEN, this.pinnedAppsGrid); + if(!this.pinnedAppsBox.contains(this.pinnedAppsGrid)) + this.pinnedAppsBox.add_child(this.pinnedAppsGrid); + + if(this.activeMenuItemSet) + this.activeMenuItem = this._frequentActiveItem; + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/metadata.json b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/metadata.json new file mode 100644 index 0000000..f6d4800 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/metadata.json @@ -0,0 +1,15 @@ +{ + "_generated": "Generated by SweetTooth, do not edit", + "description": "Application menu for GNOME Shell\n\nFeatures include: various menu layouts, built in GNOME search, quick access to system shortcuts, and much more!\n\nCommon solutions for ERROR message:\n - Restart your GNOME session after updating ArcMenu.\n - Install one of the following packages: 'gir1.2-gmenu-3.0' or 'gnome-menus'\n\nGeneral Help:\n - Visit https://gitlab.com/arcmenu/ArcMenu/-/wikis/home\n\nPlease report all bugs or issues at https://gitlab.com/arcmenu/ArcMenu", + "extension-id": "arcmenu", + "gettext-domain": "arcmenu", + "name": "ArcMenu", + "settings-schema": "org.gnome.shell.extensions.arcmenu", + "shell-version": [ + "40", + "41" + ], + "url": "https://gitlab.com/arcmenu/ArcMenu", + "uuid": "arcmenu@arcmenu.com", + "version": 27 +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js new file mode 100644 index 0000000..4e58333 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js @@ -0,0 +1,764 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: This file leverages the work from places-menu extension + * (https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/tree/master/extensions/places-menu) + * and Dash to Dock extension 'location.js' file to implement a trash shortcut + * (https://github.com/micheleg/dash-to-dock/blob/master/locations.js) + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {St, Gio, GLib, Shell } = imports.gi; +const Clutter = imports.gi.Clutter; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const GObject = imports.gi.GObject; +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const ShellMountOperation = imports.ui.shellMountOperation; +const Signals = imports.signals; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; +const Hostname1Iface = ' \ + \ + \ + \ +'; +const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface); + +var PlaceMenuItem = GObject.registerClass(class Arc_Menu_PlaceMenuItem2 extends MW.ArcMenuPopupBaseMenuItem{ + _init(menuLayout, info) { + super._init(menuLayout); + this._info = info; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ text: info.name, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER }); + + this.add_child(this.label); + + if (info.isRemovable()) { + this.style = "padding-right: 15px;"; + this._ejectButton = new MW.ArcMenuButtonItem(this._menuLayout, null, 'media-eject-symbolic'); + this._ejectButton.add_style_class_name("arcmenu-small-button") + this._ejectButton.setIconSize(14); + this._ejectButton.x_align = Clutter.ActorAlign.END; + this._ejectButton.x_expand = true; + this._ejectButton.connect('activate', info.eject.bind(info)); + this.add_child(this._ejectButton); + } + + this._changedId = info.connect('changed', + this._propertiesChanged.bind(this)); + this.actor.connect('destroy',()=>{ + if (this._changedId) { + this._info.disconnect(this._changedId); + this._changedId = 0; + } + }); + + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + let defaultIconSize = this._menuLayout.layoutProperties.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: this._info.icon, + icon_size: iconSize + }); + } + + activate(event) { + this._info.launch(event.get_time()); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _propertiesChanged(info) { + this._info = info; + this._iconBin.set_child(this.createIcon()); + this.label.text = info.name; + } +}); + +var PlaceInfo = class Arc_Menu_PlaceInfo2 { + constructor() { + this._init.apply(this, arguments); + } + + _init(kind, file, name, icon) { + this.kind = kind; + this.file = file; + this.name = name || this._getFileName(); + this.icon = icon ? new Gio.ThemedIcon({ name: icon }) : this.getIcon(); + } + + destroy() { + } + + isRemovable() { + return false; + } + + async _ensureMountAndLaunch(context, tryMount) { + try { + await this._launchDefaultForUri(this.file.get_uri(), context, null); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) { + Main.notifyError(_('Failed to launch “%s”').format(this.name), e.message); + return; + } + + let source = { + get_icon: () => this.icon + }; + let op = new ShellMountOperation.ShellMountOperation(source); + try { + await this._mountEnclosingVolume(0, op.mountOp, null); + + if (tryMount) + this._ensureMountAndLaunch(context, false); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED)) + Main.notifyError(_('Failed to mount volume for “%s”').format(this.name), e.message); + } finally { + op.close(); + } + } + } + + launch(timestamp) { + let launchContext = global.create_app_launch_context(timestamp, -1); + this._ensureMountAndLaunch(launchContext, true); + } + + getIcon() { + this.file.query_info_async('standard::symbolic-icon', 0, 0, null, + (file, result) => { + try { + let info = file.query_info_finish(result); + this.icon = info.get_symbolic_icon(); + this.emit('changed'); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) + return; + throw e; + } + }); + + // return a generic icon for this kind for now, until we have the + // icon from the query info above + switch (this.kind) { + case 'network': + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + case 'devices': + return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); + case 'special': + case 'bookmarks': + default: + if (!this.file.is_native()) + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + else + return new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + + _getFileName() { + try { + let info = this.file.query_info('standard::display-name', 0, null); + return info.get_display_name(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) + return this.file.get_basename(); + throw e; + } + } + + _launchDefaultForUri(uri, context, cancel) { + return new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(uri, context, cancel, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + } + + _mountEnclosingVolume(flags, mountOp, cancel) { + return new Promise((resolve, reject) => { + this.file.mount_enclosing_volume(flags, mountOp, cancel, (o, res) => { + try { + this.file.mount_enclosing_volume_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + } +} +Signals.addSignalMethods(PlaceInfo.prototype); + +var RootInfo = class Arc_Menu_RootInfo extends PlaceInfo { + _init() { + super._init('devices', Gio.File.new_for_path('/'), _('Computer')); + + let busName = 'org.freedesktop.hostname1'; + let objPath = '/org/freedesktop/hostname1'; + new Hostname1(Gio.DBus.system, busName, objPath, (obj, error) => { + if (error) + return; + + this._proxy = obj; + this._proxyID = this._proxy.connect('g-properties-changed', + this._propertiesChanged.bind(this)); + this._propertiesChanged(obj); + }); + + } + + getIcon() { + return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); + } + + _propertiesChanged(proxy) { + // GDBusProxy will emit a g-properties-changed when hostname1 goes down + // ignore it + if (proxy.g_name_owner) { + this.name = proxy.PrettyHostname || _('Computer'); + this.emit('changed'); + } + } + + destroy() { + if (this._proxyID) { + this._proxy.disconnect(this._proxyID); + this._proxy = 0; + } + if (this._proxy) { + this._proxy.run_dispose(); + this._proxy = null; + } + super.destroy(); + } +}; + + +var PlaceDeviceInfo = class Arc_Menu_PlaceDeviceInfo extends PlaceInfo { + _init(kind, mount) { + this._mount = mount; + super._init(kind, mount.get_root(), mount.get_name()); + } + + getIcon() { + return this._mount.get_symbolic_icon(); + } + + isRemovable() { + return this._mount.can_eject(); + } + + eject() { + let unmountArgs = [ + Gio.MountUnmountFlags.NONE, + (new ShellMountOperation.ShellMountOperation(this._mount)).mountOp, + null // Gio.Cancellable + ]; + + if (this._mount.can_eject()) + this._mount.eject_with_operation(...unmountArgs, + this._ejectFinish.bind(this)); + else + this._mount.unmount_with_operation(...unmountArgs, + this._unmountFinish.bind(this)); + } + + _ejectFinish(mount, result) { + try { + mount.eject_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } + } + + _unmountFinish(mount, result) { + try { + mount.unmount_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } + } + + _reportFailure(exception) { + let msg = _('Ejecting drive “%s” failed:').format(this._mount.get_name()); + Main.notifyError(msg, exception.message); + } +}; + +var PlaceVolumeInfo = class Arc_Menu_PlaceVolumeInfo extends PlaceInfo { + _init(kind, volume) { + this._volume = volume; + super._init(kind, volume.get_activation_root(), volume.get_name()); + } + + launch(timestamp) { + if (this.file) { + super.launch(timestamp); + return; + } + + this._volume.mount(0, null, null, (volume, result) => { + volume.mount_finish(result); + + let mount = volume.get_mount(); + this.file = mount.get_root(); + super.launch(timestamp); + }); + } + + getIcon() { + return this._volume.get_symbolic_icon(); + } +}; + +const DefaultDirectories = [ + GLib.UserDirectory.DIRECTORY_DOCUMENTS, + GLib.UserDirectory.DIRECTORY_PICTURES, + GLib.UserDirectory.DIRECTORY_MUSIC, + GLib.UserDirectory.DIRECTORY_DOWNLOAD, + GLib.UserDirectory.DIRECTORY_VIDEOS, +]; + +var PlacesManager = class Arc_Menu_PlacesManager { + constructor() { + this._places = { + special: [], + devices: [], + bookmarks: [], + network: [], + }; + + this._settings = new Gio.Settings({ schema_id: BACKGROUND_SCHEMA }); + this._showDesktopIconsChangedId = + this._settings.connect('changed::show-desktop-icons', + this._updateSpecials.bind(this)); + this._updateSpecials(); + + /* + * Show devices, code more or less ported from nautilus-places-sidebar.c + */ + this._volumeMonitor = Gio.VolumeMonitor.get(); + this._connectVolumeMonitorSignals(); + this._updateMounts(); + + this._bookmarksFile = this._findBookmarksFile(); + this._bookmarkTimeoutId = 0; + this._monitor = null; + + if (this._bookmarksFile) { + this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null); + this._monitor.connect('changed', () => { + if (this._bookmarkTimeoutId > 0) + return; + /* Defensive event compression */ + this._bookmarkTimeoutId = GLib.timeout_add( + GLib.PRIORITY_DEFAULT, 100, () => { + this._bookmarkTimeoutId = 0; + this._reloadBookmarks(); + return false; + }); + }); + + this._reloadBookmarks(); + } + } + + _connectVolumeMonitorSignals() { + const signals = [ + 'volume-added', + 'volume-removed', + 'volume-changed', + 'mount-added', + 'mount-removed', + 'mount-changed', + 'drive-connected', + 'drive-disconnected', + 'drive-changed' + ]; + + this._volumeMonitorSignals = []; + let func = this._updateMounts.bind(this); + for (let i = 0; i < signals.length; i++) { + let id = this._volumeMonitor.connect(signals[i], func); + this._volumeMonitorSignals.push(id); + } + } + + destroy() { + if (this._settings) + this._settings.disconnect(this._showDesktopIconsChangedId); + this._settings = null; + + for (let i = 0; i < this._volumeMonitorSignals.length; i++) + this._volumeMonitor.disconnect(this._volumeMonitorSignals[i]); + + if (this._monitor) + this._monitor.cancel(); + if (this._bookmarkTimeoutId) + GLib.source_remove(this._bookmarkTimeoutId); + } + + _updateSpecials() { + this._places.special.forEach(p => p.destroy()); + this._places.special = []; + + let homePath = GLib.get_home_dir(); + + this._places.special.push(new PlaceInfo('special', + Gio.File.new_for_path(homePath), + _('Home'))); + + let specials = []; + let dirs = DefaultDirectories.slice(); + + if (this._settings.get_boolean('show-desktop-icons')) + dirs.push(GLib.UserDirectory.DIRECTORY_DESKTOP); + + for (let i = 0; i < dirs.length; i++) { + let specialPath = GLib.get_user_special_dir(dirs[i]); + if (specialPath == null || specialPath == homePath) + continue; + + let file = Gio.File.new_for_path(specialPath), info; + try { + info = new PlaceInfo('special', file); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + continue; + throw e; + } + + specials.push(info); + } + + specials.sort((a, b) => GLib.utf8_collate(a.name, b.name)); + this._places.special = this._places.special.concat(specials); + + this.emit('special-updated'); + } + + _updateMounts() { + let networkMounts = []; + let networkVolumes = []; + + this._places.devices.forEach(p => p.destroy()); + this._places.devices = []; + this._places.network.forEach(p => p.destroy()); + this._places.network = []; + + /* Add standard places */ + // this._places.devices.push(new RootInfo()); + /* this._places.network.push(new PlaceInfo('network', + Gio.File.new_for_uri('network:///'), + _('Network'), + 'network-workgroup-symbolic'));*/ + + /* first go through all connected drives */ + let drives = this._volumeMonitor.get_connected_drives(); + for (let i = 0; i < drives.length; i++) { + let volumes = drives[i].get_volumes(); + + for (let j = 0; j < volumes.length; j++) { + let identifier = volumes[j].get_identifier('class'); + if (identifier && identifier.includes('network')) { + networkVolumes.push(volumes[j]); + } else { + let mount = volumes[j].get_mount(); + if (mount != null) + this._addMount('devices', mount); + } + } + } + + /* add all volumes that is not associated with a drive */ + let volumes = this._volumeMonitor.get_volumes(); + for (let i = 0; i < volumes.length; i++) { + if (volumes[i].get_drive() != null) + continue; + + let identifier = volumes[i].get_identifier('class'); + if (identifier && identifier.includes('network')) { + networkVolumes.push(volumes[i]); + } else { + let mount = volumes[i].get_mount(); + if (mount != null) + this._addMount('devices', mount); + } + } + + /* add mounts that have no volume (/etc/mtab mounts, ftp, sftp,...) */ + let mounts = this._volumeMonitor.get_mounts(); + for (let i = 0; i < mounts.length; i++) { + if (mounts[i].is_shadowed()) + continue; + + if (mounts[i].get_volume()) + continue; + + let root = mounts[i].get_default_location(); + if (!root.is_native()) { + networkMounts.push(mounts[i]); + continue; + } + this._addMount('devices', mounts[i]); + } + + for (let i = 0; i < networkVolumes.length; i++) { + let mount = networkVolumes[i].get_mount(); + if (mount) { + networkMounts.push(mount); + continue; + } + this._addVolume('network', networkVolumes[i]); + } + + for (let i = 0; i < networkMounts.length; i++) { + this._addMount('network', networkMounts[i]); + } + + this.emit('devices-updated'); + this.emit('network-updated'); + } + + _findBookmarksFile() { + let paths = [ + GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']), + GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']), + ]; + + for (let i = 0; i < paths.length; i++) { + if (GLib.file_test(paths[i], GLib.FileTest.EXISTS)) + return Gio.File.new_for_path(paths[i]); + } + + return null; + } + + _reloadBookmarks() { + + this._bookmarks = []; + + let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path()); + let lines = content.split('\n'); + + let bookmarks = []; + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; + let components = line.split(' '); + let bookmark = components[0]; + + if (!bookmark) + continue; + + let file = Gio.File.new_for_uri(bookmark); + if (file.is_native() && !file.query_exists(null)) + continue; + + let duplicate = false; + for (let i = 0; i < this._places.special.length; i++) { + if (file.equal(this._places.special[i].file)) { + duplicate = true; + break; + } + } + if (duplicate) + continue; + for (let i = 0; i < bookmarks.length; i++) { + if (file.equal(bookmarks[i].file)) { + duplicate = true; + break; + } + } + if (duplicate) + continue; + + let label = null; + if (components.length > 1) + label = components.slice(1).join(' '); + + bookmarks.push(new PlaceInfo('bookmarks', file, label)); + } + + this._places.bookmarks = bookmarks; + + this.emit('bookmarks-updated'); + } + + _addMount(kind, mount) { + let devItem; + + try { + devItem = new PlaceDeviceInfo(kind, mount); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + return; + throw e; + } + + this._places[kind].push(devItem); + } + + _addVolume(kind, volume) { + let volItem; + + try { + volItem = new PlaceVolumeInfo(kind, volume); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + return; + throw e; + } + + this._places[kind].push(volItem); + } + + get(kind) { + return this._places[kind]; + } +}; +Signals.addSignalMethods(PlacesManager.prototype); + +//Trash can class implemented from Dash to Dock https://github.com/micheleg/dash-to-dock/blob/master/locations.js +var Trash = class Arc_Menu_Trash { + constructor(menuItem) { + this._menuItem = menuItem; + let trashPath = GLib.get_home_dir() + '/.local/share/Trash/files/'; + this._file = Gio.file_new_for_path(trashPath); + try { + this._monitor = this._file.monitor_directory(0, null); + this._signalId = this._monitor.connect( + 'changed', + this._onTrashChange.bind(this) + ); + } catch (e) { + log(`Impossible to monitor trash: ${e}`); + } + this._lastEmpty = true; + this._empty = true; + this._schedUpdateId = 0; + this._updateTrash(); + } + + destroy() { + if (this._monitor) { + this._monitor.disconnect(this._signalId); + this._monitor.run_dispose(); + } + this._file.run_dispose(); + } + + _onTrashChange() { + if (this._schedUpdateId) { + GLib.source_remove(this._schedUpdateId); + } + this._schedUpdateId = GLib.timeout_add( + GLib.PRIORITY_DEFAULT, 500, () => { + this._schedUpdateId = 0; + this._updateTrash(); + return GLib.SOURCE_REMOVE; + }); + } + + _updateTrash() { + try { + let children = this._file.enumerate_children('*', 0, null); + this._empty = children.next_file(null) == null; + children.close(null); + } catch (e) { + log(`Impossible to enumerate trash children: ${e}`) + return; + } + + this._ensureApp(); + } + + _ensureApp() { + if (this._trashApp == null || + this._lastEmpty != this._empty) { + let trashKeys = new GLib.KeyFile(); + trashKeys.set_string('Desktop Entry', 'Name', _('Trash')); + trashKeys.set_string('Desktop Entry', 'Id', 'ArcMenu_Trash'); + trashKeys.set_string('Desktop Entry', 'Icon', + this._empty ? 'user-trash-symbolic' : 'user-trash-full-symbolic'); + trashKeys.set_string('Desktop Entry', 'Type', 'Application'); + trashKeys.set_string('Desktop Entry', 'Exec', 'gio open trash:///'); + trashKeys.set_string('Desktop Entry', 'StartupNotify', 'false'); + trashKeys.set_string('Desktop Entry', 'XdtdUri', 'trash:///'); + if (!this._empty) { + trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash;'); + trashKeys.set_string('Desktop Action empty-trash', 'Name', _('Empty Trash')); + trashKeys.set_string('Desktop Action empty-trash', 'Exec', + 'dbus-send --print-reply --dest=org.gnome.Nautilus /org/gnome/Nautilus org.gnome.Nautilus.FileOperations.EmptyTrash'); + } + else{ + trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash-inactive;'); + trashKeys.set_string('Desktop Action empty-trash-inactive', 'Name', _('Empty Trash')); + } + + let trashAppInfo = Gio.DesktopAppInfo.new_from_keyfile(trashKeys); + this._trashApp = new Shell.App({appInfo: trashAppInfo}); + this._lastEmpty = this._empty; + + this._menuItem._app = this._trashApp; + if(this._menuItem.contextMenu) + this._menuItem.contextMenu._app = this._trashApp; + let trashIcon = this._trashApp.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(this._menuItem._iconBin && trashIcon) + this._menuItem.iconName = trashIcon.gicon.to_string(); + this._menuItem._updateIcon(); + this.emit('changed'); + } + } + + getApp() { + this._ensureApp(); + return this._trashApp; + } +} +Signals.addSignalMethods(Trash.prototype); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefs.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefs.js new file mode 100644 index 0000000..916491b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefs.js @@ -0,0 +1,6786 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const ByteArray = imports.byteArray; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const LayoutTweaks = Me.imports.menulayouts.tweaks; +const PW = Me.imports.prefsWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const SCHEMA_PATH = '/org/gnome/shell/extensions/arcmenu/'; +const GSET = 'gnome-shell-extension-tool'; + +var MenuSettingsPinnedAppsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsPinnedAppsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + + this.pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.pinnedAppsScrollWindow.set_min_content_height(300); + this.pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + this.frame = new PW.FrameBox(); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + halign: Gtk.Align.END, + vexpand: false, + valign: Gtk.Align.END + }); + this._loadPinnedApps(this._settings.get_strv('pinned-app-list')); + this.pinnedAppsScrollWindow.set_child(this.frame); + this.mainBox.append(this.pinnedAppsScrollWindow); + + let addPinnedAppsFrame = new PW.FrameBox(); + let addPinnedAppsFrameRow = new PW.FrameBoxRow(); + let addPinnedAppsFrameLabel = new Gtk.Label({ + label: _("Add More Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addPinnedAppsButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addPinnedAppsButton.connect('clicked', ()=> { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.DEFAULT); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array = []; + for(let i = 0; i < newPinnedApps.length; i++){ + array.push(newPinnedApps[i]._name); + array.push(newPinnedApps[i]._icon); + array.push(newPinnedApps[i]._cmd); + } + this._loadPinnedApps(array); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addPinnedAppsFrameRow.add(addPinnedAppsFrameLabel); + addPinnedAppsFrameRow.add(addPinnedAppsButton); + addPinnedAppsFrame.add(addPinnedAppsFrameRow); + this.mainBox.append(addPinnedAppsFrame); + + let addCustomAppFrame = new PW.FrameBox(); + let addCustomAppFrameRow = new PW.FrameBoxRow(); + let addCustomAppFrameLabel = new Gtk.Label({ + label: _("Add Custom Shortcut"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addCustomAppButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addCustomAppButton.connect('clicked', ()=> { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DEFAULT); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps(newPinnedApps); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let x = 0; x < this.frame.count; x++) { + array.push(this.frame.get_index(x)._name); + array.push(this.frame.get_index(x)._icon); + array.push(this.frame.get_index(x)._cmd); + } + this._settings.set_strv('pinned-app-list',array); + this.saveButton.set_sensitive(false); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + _loadPinnedApps(array) { + for(let i = 0; i < array.length; i += 3) { + let frameRow = new PW.FrameBoxDragRow(this.pinnedAppsScrollWindow); + let iconString; + frameRow._name = array[i]; + frameRow._icon = array[i + 1]; + frameRow._cmd = array[i + 2]; + frameRow.saveButton = this.saveButton; + if(frameRow._icon === "ArcMenu_ArcMenuIcon"){ + frameRow._icon = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + } + iconString = frameRow._icon; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString); + let arcMenuImage = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + + let arcMenuImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + arcMenuImageBox.append(dragImage); + arcMenuImageBox.append(arcMenuImage); + frameRow.add(arcMenuImageBox); + + let frameLabel = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true + }); + + frameLabel.label = _(frameRow._name); + + checkIfValidShortcut(frameRow, frameLabel, arcMenuImage); + + frameRow.add(frameLabel); + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.frame, + buttons: [this.saveButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DEFAULT, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)) + arcMenuImage.gicon = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon(); + else + arcMenuImage.gicon = Gio.icon_new_for_string(frameRow._icon); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + frameRow.add(buttonBox); + this.frame.add(frameRow); + } + } +}); + +var AddAppsToPinnedListWindow = GObject.registerClass( + class Arc_Menu_AddAppsToPinnedListWindow extends PW.DialogWindow { + _init(settings, parent, dialogType) { + this._settings = settings; + this._dialogType = dialogType; + if(this._dialogType == Constants.DiaglogType.DEFAULT) + super._init(_('Add to your Pinned Apps'), parent); + else if(this._dialogType == Constants.DiaglogType.OTHER) + super._init(_('Change Selected Pinned App'), parent); + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS) + super._init(_('Select Application Shortcuts'), parent); + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + super._init(_('Select Directory Shortcuts'), parent); + this.newPinnedAppsArray=[]; + this.addResponse = false; + } + + _createLayout(vbox) { + let searchBar = new Gtk.SearchEntry({ + placeholder_text: _("Search…") + }); + searchBar.connect('search-changed', ()=> { + this._loadCategories(); + let applist = Gio.app_info_get_all(); + + let pattern = searchBar.text; + let searchResults = []; + let res = []; + for (let i in applist) { + let app = applist[i]; + let match; + + match = app.get_name().toLowerCase() + " "; + let info = Gio.DesktopAppInfo.new(app.get_id()); + + if (info.get_display_name()) + match += info.get_display_name().toLowerCase() + " "; + if (info.get_executable()) + match += info.get_executable().toLowerCase() + " "; + if (info.get_keywords()) + match += info.get_keywords().toString().toLowerCase() + " "; + if (app.get_description()) + match += app.get_description().toLowerCase(); + + + let index = match.indexOf(pattern); + if (index != -1) { + searchResults.push([index, app]); + } + } + let arcMenuSettings = _("ArcMenu Settings").toLowerCase(); + let index = arcMenuSettings.indexOf(pattern); + let showArcMenuSettings = false; + if (index != -1) { + showArcMenuSettings = true; + } + + searchResults.sort(function(a,b) { + return a[0] > b[0]; + }); + res = searchResults.map(function(value,index) { return value[1]; }); + this.appsFrame.remove_all_children(); + this._loadCategories(res, showArcMenuSettings); + this.appsFrame.show(); + + }); + + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_min_content_height(400); + pinnedAppsScrollWindow.set_min_content_width(650); + this.appsFrame = new PW.FrameBox(); + let addAppsButton; + if(this._dialogType == Constants.DiaglogType.DEFAULT || this._dialogType == Constants.DiaglogType.APPLICATIONS + || this._dialogType == Constants.DiaglogType.DIRECTORIES){ + addAppsButton = new Gtk.Button({ + label: _("Add") + }); + + addAppsButton.connect('clicked', ()=> { + this.addResponse = true; + this.response(-10); + }); + addAppsButton.set_halign(Gtk.Align.END); + } + + pinnedAppsScrollWindow.set_child(this.appsFrame); + vbox.append(pinnedAppsScrollWindow); + if(this._dialogType == Constants.DiaglogType.DEFAULT){ + this._loadCategories(); + vbox.append(addAppsButton); + vbox.prepend(searchBar); + } + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES){ + let defaultApplicationShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"]); + defaultApplicationShortcuts.push([_("Network"), "ArcMenu_Network", "ArcMenu_Network"]); + defaultApplicationShortcuts.push([_("Trash"), "user-trash-symbolic", "ArcMenu_Trash"]); + defaultApplicationShortcuts.push([_("Recent"), "document-open-recent-symbolic", "ArcMenu_Recent"]); + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(getIconPath(defaultApplicationShortcuts[i])), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) + this.newPinnedAppsArray.push(frameRow); + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + this.appsFrame.add(frameRow); + } + vbox.append(addAppsButton); + } + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS){ + this._loadCategories(); + let defaultApplicationShortcutsFrame = new PW.FrameBox(); + let defaultApplicationShortcuts = this._settings.get_default_value('application-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("ArcMenu Settings"), Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg', Constants.ArcMenuSettingsCommand]); + defaultApplicationShortcuts.push([_("Run Command..."), "system-run-symbolic", "ArcMenu_RunCommand"]); + defaultApplicationShortcuts.push([_("Show All Applications"), "view-fullscreen-symbolic", "ArcMenu_ShowAllApplications"]); + + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(frameRow._icon), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) { + this.newPinnedAppsArray.push(frameRow); + } + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + + defaultApplicationShortcutsFrame.add(frameRow); + + } + let notebook = new PW.Notebook(); + + let defaultAppsPage = new PW.NotebookPage(_("Default Apps")); + notebook.append_page(defaultAppsPage); + defaultAppsPage.append(defaultApplicationShortcutsFrame); + vbox.remove(pinnedAppsScrollWindow); + let systemAppsPage = new PW.NotebookPage(_("System Apps")); + notebook.append_page(systemAppsPage); + systemAppsPage.append(pinnedAppsScrollWindow); + systemAppsPage.prepend(searchBar); + + vbox.append(notebook); + vbox.append(addAppsButton); + } + else{ + this._loadCategories(); + let defaultAppsWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + defaultAppsWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + defaultAppsWindow.set_min_content_width(500); + defaultAppsWindow.set_min_content_width(500); + + let defaultApplicationShortcutsFrame = new PW.FrameBox(); + defaultAppsWindow.set_child(defaultApplicationShortcutsFrame); + let defaultApplicationShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"]); + defaultApplicationShortcuts.push([_("Network"), "ArcMenu_Network", "ArcMenu_Network"]); + defaultApplicationShortcuts.push([_("Trash"), "user-trash-symbolic", "ArcMenu_Trash"]); + defaultApplicationShortcuts.push([_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"]); + defaultApplicationShortcuts.push([_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"]); + defaultApplicationShortcuts.push([_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"]); + defaultApplicationShortcuts.push([_("Restart"), 'system-reboot-symbolic', "ArcMenu_Restart"]); + defaultApplicationShortcuts.push([_("Suspend"), "media-playback-pause-symbolic", "ArcMenu_Suspend"]); + defaultApplicationShortcuts.push([_("Hybrid Sleep"), Me.path + Constants.SleepIcon.PATH, "ArcMenu_HybridSleep"]); + defaultApplicationShortcuts.push([_("Hibernate"), "document-save-symbolic", "ArcMenu_Hibernate"]); + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(getIconPath(defaultApplicationShortcuts[i])), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + + let checkButton = new PW.Button({ + icon_name: 'list-add-symbolic' + }); + checkButton.margin_end = 20; + checkButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(frameRow._name, frameRow._icon, frameRow._cmd); + this.addResponse = true; + this.response(-10); + }); + frameRow.add(checkButton); + + defaultApplicationShortcutsFrame.add(frameRow); + + } + let notebook = new PW.Notebook(); + + let defaultAppsPage = new PW.NotebookPage(_("Presets")); + notebook.append_page(defaultAppsPage); + defaultAppsPage.append(defaultAppsWindow); + vbox.remove(pinnedAppsScrollWindow); + let systemAppsPage = new PW.NotebookPage(_("System Apps")); + notebook.append_page(systemAppsPage); + systemAppsPage.append(pinnedAppsScrollWindow); + systemAppsPage.prepend(searchBar); + + vbox.append(notebook); + } + } + + get_newPinnedAppsArray() { + return this.newPinnedAppsArray; + } + + get_response() { + return this.addResponse; + } + + _loadCategories(searchResults, showArcMenuSettings) { + let allApps = searchResults ? searchResults : Gio.app_info_get_all(); + allApps.sort((a, b) => { + let _a = a.get_display_name(); + let _b = b.get_display_name(); + return GLib.strcmp0(_a, _b); + }); + + let iter = -1; + if(searchResults) + iter = 0; + if(showArcMenuSettings) + iter = -1; + for(let i = iter; i < allApps.length; i++) { + if(i == -1 ? true : allApps[i].should_show()) { + let frameRow = new PW.FrameBoxRow(); + let icon; + if(i == -1){ + frameRow._name = _("ArcMenu Settings"); + icon = frameRow._icon = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + frameRow._cmd = Constants.ArcMenuSettingsCommand; + } + else{ + frameRow._app = allApps[i]; + frameRow._name = allApps[i].get_display_name(); + frameRow._icon = ''; + if(allApps[i].get_icon()) + icon = allApps[i].get_icon().to_string(); + else + icon = "dialog-information"; + + frameRow._cmd = allApps[i].get_id(); + } + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(icon), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + if(this._dialogType == Constants.DiaglogType.DEFAULT || this._dialogType == Constants.DiaglogType.APPLICATIONS|| + this._dialogType == Constants.DiaglogType.DIRECTORIES){ + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) + this.newPinnedAppsArray.push(frameRow); + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + } + else{ + let checkButton = new PW.Button({ + icon_name: 'list-add-symbolic' + }); + checkButton.margin_end = 20; + checkButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(frameRow._name, frameRow._icon, frameRow._cmd); + this.addResponse = true; + this.response(-10); + }); + frameRow.add(checkButton); + } + + this.appsFrame.add(frameRow); + } + } + } +}); + +var AddCustomLinkDialogWindow = GObject.registerClass( + class Arc_Menu_AddCustomLinkDialogWindow extends PW.DialogWindow { + _init(settings, parent, dialogType, isAppEdit=false, appArray=null) { + this._settings = settings; + this.newPinnedAppsArray=[]; + this.addResponse = false; + this.isAppEdit = isAppEdit; + this._dialogType = dialogType; + this.appArray = appArray; + if(this._dialogType == Constants.DiaglogType.DEFAULT) + super._init(isAppEdit?_('Edit Pinned App'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.OTHER) + super._init(isAppEdit?_('Edit Pinned App'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS) + super._init(isAppEdit?_('Edit Shortcut'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + super._init(isAppEdit?_('Edit Custom Shortcut'):_('Add a Custom Shortcut'), parent); + } + + _createLayout(vbox) { + let mainFrame = new PW.FrameBox(); + let nameFrameRow = new PW.FrameBoxRow(); + let nameFrameLabel = new Gtk.Label({ + label: _('Shortcut Name:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let nameEntry = new Gtk.Entry(); + nameEntry.set_width_chars(35); + nameFrameRow.add(nameFrameLabel); + nameFrameRow.add(nameEntry); + nameEntry.grab_focus(); + mainFrame.add(nameFrameRow); + + let iconFrameRow = new PW.FrameBoxRow(); + let iconFrameLabel = new Gtk.Label({ + label: _("Icon:"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let iconEntry = new Gtk.Entry(); + iconEntry.set_width_chars(35); + + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + let fileChooserButton = new Gtk.Button({ + label: _('Browse...') + }); + + fileChooserButton.connect('clicked', (widget) => { + let dialog = new Gtk.FileChooserDialog({ + title: _('Select an Icon'), + transient_for: this.get_root(), + modal: true, + action: Gtk.FileChooserAction.OPEN, + }); + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button("_Open", Gtk.ResponseType.ACCEPT); + + dialog.set_filter(fileFilter); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + let iconFilepath = dialog.get_file().get_path(); + iconEntry.set_text(iconFilepath); + dialog.destroy(); + } + else if(response === Gtk.ResponseType.CANCEL) + dialog.destroy(); + }) + + dialog.show(); + }); + + iconFrameRow.add(iconFrameLabel); + iconFrameRow.add(fileChooserButton); + iconFrameRow.add(iconEntry); + mainFrame.add(iconFrameRow); + if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + iconEntry.set_text("ArcMenu_Folder"); + + let cmdFrameRow = new PW.FrameBoxRow(); + let cmdFrameLabel = new Gtk.Label({ + label: _('Terminal Command:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + cmdFrameLabel.label = _("Shortcut Path:"); + let cmdEntry = new Gtk.Entry(); + cmdEntry.set_width_chars(35); + cmdFrameRow.add(cmdFrameLabel); + cmdFrameRow.add(cmdEntry); + mainFrame.add(cmdFrameRow); + + let addButton = new Gtk.Button({ + label: this.isAppEdit ?_("Apply") :_("Add") + }); + + if(this.appArray!=null) { + nameEntry.text=this.appArray[0]; + iconEntry.text=this.appArray[1]; + cmdEntry.text=this.appArray[2]; + } + addButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(nameEntry.get_text()); + this.newPinnedAppsArray.push(iconEntry.get_text()); + this.newPinnedAppsArray.push(cmdEntry.get_text()); + this.addResponse = true; + this.response(-10); + }); + addButton.set_halign(Gtk.Align.END); + + vbox.append(mainFrame); + vbox.append(addButton); + } + + get_newPinnedAppsArray(){ + return this.newPinnedAppsArray; + } + + get_response(){ + return this.addResponse; + } +}); + +var GeneralPage = GObject.registerClass( + class Arc_Menu_GeneralPage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let arcMenuPlacementHeader = new Gtk.Label({ + label: "" + _("Display Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(arcMenuPlacementHeader); + let menuPlacementFrame = new PW.FrameBox(); + this._createDisplayOnFrame(menuPlacementFrame, true); + this._settings.connect('changed::available-placement', ()=>{ + menuPlacementFrame.remove_all_children(); + this._createDisplayOnFrame(menuPlacementFrame, false); + menuPlacementFrame.show(); + }) + + this.mainBox.append(menuPlacementFrame); + + let hotCornerHeader = new Gtk.Label({ + label: "" + _("Hot Corner Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(hotCornerHeader); + + let modifyHotCornerFrame = new PW.FrameBox(); + let modifyHotCornerRow = new PW.FrameBoxRow(); + let modifyHotCornerLabel = new Gtk.Label({ + label: _("Modify Hot Corner"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let modifyHotCornerButton = new PW.Button({ + icon_name: 'emblem-system-symbolic', + }); + modifyHotCornerButton.connect('clicked', ()=> { + let dialog = new ModifyHotCornerDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', ()=> { + dialog.destroy(); + }); + }); + let modifyHotCornerSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + modifyHotCornerSwitch.set_active(this._settings.get_boolean('override-hot-corners')); + modifyHotCornerButton.set_sensitive(this._settings.get_boolean('override-hot-corners')); + modifyHotCornerSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('override-hot-corners',widget.get_active()); + modifyHotCornerButton.set_sensitive(widget.get_active()); + if(!widget.get_active()){ + this._settings.set_enum('hot-corners',Constants.HotCornerAction.DEFAULT); + } + }); + modifyHotCornerRow.add(modifyHotCornerLabel); + modifyHotCornerRow.add(modifyHotCornerButton); + modifyHotCornerRow.add(modifyHotCornerSwitch); + modifyHotCornerFrame.add(modifyHotCornerRow); + this.mainBox.append(modifyHotCornerFrame); + + let menuHotkeyHeader = new Gtk.Label({ + label: "" + _("Hotkey Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuHotkeyHeader); + + let menuHotKeyFrame = this._createHotkeyFrame(true); + this.mainBox.append(menuHotKeyFrame); + + let runnerHeaderLabel = new Gtk.Label({ + label: "" + _("Standalone Runner Menu") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(runnerHeaderLabel); + + let runnerHotkeyFrame = this._createHotkeyFrame(false); + this.mainBox.append(runnerHotkeyFrame); + } + + _createHotkeyFrame(isMenuHotkey){ + let hotkeyFrame = new PW.FrameBox(); + let enableRunnerMenuSwitch, hotkeyEnumSetting, customHotkeySetting, primaryMonitorSetting; + if(isMenuHotkey){ + hotkeyEnumSetting = 'menu-hotkey'; + customHotkeySetting = 'toggle-arcmenu'; + primaryMonitorSetting = 'hotkey-open-primary-monitor'; + } + else{ + hotkeyEnumSetting = 'runner-menu-hotkey'; + customHotkeySetting = 'toggle-runner-menu'; + primaryMonitorSetting = 'runner-hotkey-open-primary-monitor'; + let enableRunnerMenuRow = new PW.FrameBoxRow(); + let enableRunnerMenuLabel = new Gtk.Label({ + label: _("Enable a standalone Runner menu"), + use_markup: true, + xalign: 0, + hexpand: true + }); + enableRunnerMenuSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + enableRunnerMenuSwitch.set_active(this._settings.get_boolean('enable-standlone-runner-menu')); + enableRunnerMenuSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-standlone-runner-menu', widget.get_active()); + if(!widget.get_active()){ + hotkeyFrame.removeChildrenAfterIndex(0); + } + else{ + hotkeyFrame.add(hotkeyRow); + if(this._settings.get_enum(hotkeyEnumSetting) === 0) + hotkeyFrame.add(primaryMonitorRow); + if(this._settings.get_enum(hotkeyEnumSetting) === 1){ + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + } + } + }); + enableRunnerMenuRow.add(enableRunnerMenuLabel); + enableRunnerMenuRow.add(enableRunnerMenuSwitch); + hotkeyFrame.add(enableRunnerMenuRow); + } + + let hotkeyActivationRow = new PW.FrameBoxRow(); + let hotkeyActivationLabel = new Gtk.Label({ + label: _("Hotkey Activation"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotkeyActivationCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + hotkeyActivationCombo.append_text(_("Key Release")); + hotkeyActivationCombo.append_text(_("Key Press")); + if(this._settings.get_boolean('disable-hotkey-onkeyrelease')) + hotkeyActivationCombo.set_active(1); + else + hotkeyActivationCombo.set_active(0); + hotkeyActivationCombo.connect('changed', (widget) => { + if(widget.get_active() === 0) + this._settings.set_boolean('disable-hotkey-onkeyrelease',false); + if(widget.get_active() === 1) + this._settings.set_boolean('disable-hotkey-onkeyrelease',true); + }); + + hotkeyActivationRow.add(hotkeyActivationLabel); + hotkeyActivationRow.add(hotkeyActivationCombo); + + let primaryMonitorRow = new PW.FrameBoxRow(); + let primaryMonitorLabel = new Gtk.Label({ + label: _("Open on Primary Monitor"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let primaryMonitorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + primaryMonitorSwitch.set_active(this._settings.get_boolean(primaryMonitorSetting)); + primaryMonitorSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(primaryMonitorSetting, widget.get_active()); + }); + primaryMonitorRow.add(primaryMonitorLabel); + primaryMonitorRow.add(primaryMonitorSwitch); + + + let hotkeyRow = new PW.FrameBoxRow(); + let hotkeyLabel = new Gtk.Label({ + label: isMenuHotkey ? _("Menu Hotkey") : _("Runner Hotkey"), + use_markup: true, + xalign: 0, + hexpand: true + }); + hotkeyRow.add(hotkeyLabel); + + let hotkeyCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + if(isMenuHotkey) + hotkeyCombo.append("NONE", _("None")); + hotkeyCombo.append("SUPER_L", _("Left Super Key")); + hotkeyCombo.append("CUSTOM", _("Custom Hotkey")); + hotkeyCombo.set_active(this._settings.get_enum(hotkeyEnumSetting)); + hotkeyCombo.connect('changed', (widget) => { + let removeIndex = isMenuHotkey ? 0 : 1; + if(widget.get_active_id() === "NONE"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + } + else if(widget.get_active_id() === "SUPER_L"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + hotkeyFrame.add(primaryMonitorRow); + } + else if(widget.get_active_id() === "CUSTOM"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + hotkeyFrame.show(); + } + this._settings.set_enum(hotkeyEnumSetting, widget.get_active()); + }); + hotkeyRow.add(hotkeyCombo); + + hotkeyFrame.add(hotkeyRow); + + let customHotkeyRow = new PW.FrameBoxRow(); + let currentHotkeyLabel = new Gtk.Label( { + label: _("Current Hotkey"), + use_markup: true, + xalign: 0, + hexpand: false + }); + + let shortcutCell = new Gtk.ShortcutsShortcut({ + halign: Gtk.Align.START, + hexpand: true, + }); + shortcutCell.accelerator = this._settings.get_strv(customHotkeySetting).toString(); + + let modifyHotkeyButton = new Gtk.Button({ + label: _("Modify Hotkey"), + halign: Gtk.Align.END, + hexpand: false, + }); + customHotkeyRow.add(currentHotkeyLabel); + customHotkeyRow.add(shortcutCell); + customHotkeyRow.add(modifyHotkeyButton); + modifyHotkeyButton.connect('clicked', () => { + let dialog = new CustomHotkeyDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', () => { + let customHotKeyEnum = isMenuHotkey ? 2 : 1; + if(dialog.addResponse) { + this._settings.set_enum(hotkeyEnumSetting, 0); + this._settings.set_strv(customHotkeySetting, [dialog.resultsText]); + this._settings.set_enum(hotkeyEnumSetting, customHotKeyEnum); + shortcutCell.accelerator = dialog.resultsText; + dialog.destroy(); + } + else { + shortcutCell.accelerator = this._settings.get_strv(customHotkeySetting).toString(); + this._settings.set_enum(hotkeyEnumSetting, customHotKeyEnum); + dialog.destroy(); + } + }); + }); + + if(hotkeyCombo.get_active_id() === "SUPER_L"){ + hotkeyFrame.add(primaryMonitorRow); + } + else if(hotkeyCombo.get_active_id() === "CUSTOM"){ + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + } + + if(!isMenuHotkey && !enableRunnerMenuSwitch.get_active()) + hotkeyFrame.removeChildrenAfterIndex(0); + return hotkeyFrame; + } + + _createDisplayOnFrame(menuPlacementFrame, setComboBox){ + let menuPlacementRow = new PW.FrameBoxRow(); + let menuPlacementLabel = new Gtk.Label({ + label: _("Display ArcMenu On"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuPlacementCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + + let avaliablePlacement = this._settings.get_value('available-placement').deep_unpack(); + let dashExtensionName = _("Dash to Dock"); + let gnomeSettings = Gio.Settings.new("org.gnome.shell"); + let enabledExtensions = gnomeSettings.get_strv('enabled-extensions'); + if (enabledExtensions.includes('ubuntu-dock@ubuntu.com')) { + dashExtensionName = _("Ubuntu Dock"); + } + + menuPlacementCombo.append_text(_("Main Panel")); + menuPlacementCombo.append_text(_("Dash to Panel")); + menuPlacementCombo.append_text(dashExtensionName); + + menuPlacementRow.add(menuPlacementLabel); + menuPlacementRow.add(menuPlacementCombo); + menuPlacementFrame.add(menuPlacementRow); + + let dashToDockWarningRow = new PW.FrameBoxRow(); + let dashToDockWarningLabel = new Gtk.Label({ + label: _("Dash to Dock extension not running!") + "\n" + _("Enable Dash to Dock for this feature to work."), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let showActivitiesRow = new PW.FrameBoxRow(); + let showActivitiesLabel = new Gtk.Label({ + label: _("Show Activities Button"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let showActivitiesSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + showActivitiesSwitch.set_active(this._settings.get_boolean('show-activities-button')); + showActivitiesSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('show-activities-button', widget.get_active()); + }); + showActivitiesRow.add(showActivitiesLabel); + showActivitiesRow.add(showActivitiesSwitch); + + let warningImage = new Gtk.Image({ + icon_name: 'warning-symbolic', + pixel_size: 24 + }); + let warningImageBox = new Gtk.Box({ + margin_top: 0, + margin_bottom: 0, + margin_start: 10 + }); + warningImageBox.append(warningImage); + + if(!avaliablePlacement[Constants.ArcMenuPlacement.DASH]){ + dashToDockWarningRow.add(warningImageBox); + } + dashToDockWarningRow.add(dashToDockWarningLabel); + + let panelWarningRow = new PW.FrameBoxRow(); + let panelWarningLabel = new Gtk.Label({ + label: avaliablePlacement[Constants.ArcMenuPlacement.DTP] ? _("Main Panel not found!") : + _("Dash to Panel extension not running!") + "\n" + _("Enable Dash to Panel for this feature to work."), + use_markup: true, + xalign: 0, + hexpand: true + }); + let panelWarningImage = new Gtk.Image({ + icon_name: 'warning-symbolic', + pixel_size: 24 + }); + let panelWarningImageBox = new Gtk.Box({ + margin_top: 0, + margin_bottom: 0, + margin_start: 10 + }); + panelWarningImageBox.append(panelWarningImage); + panelWarningRow.add(panelWarningImageBox); + panelWarningRow.add(panelWarningLabel); + + let menuPositionRow = new PW.FrameBoxRow(); + let menuPositionBoxLabel = new Gtk.Label({ + label: _("Position in Panel"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let menuPositionCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + + menuPositionCombo.append_text(_('Left')); + menuPositionCombo.append_text(_('Center')); + menuPositionCombo.append_text(_('Right')); + menuPositionCombo.set_active(this._settings.get_enum('position-in-panel')); + menuPositionCombo.connect('changed', (widget) => { + if(widget.get_active() === Constants.MenuPosition.LEFT){ + if(menuPlacementFrame.get_index(2) === menuPositionAdjustmentRow) + menuPlacementFrame.remove(menuPositionAdjustmentRow); + } + else if(widget.get_active() === Constants.MenuPosition.CENTER){ + if(menuPlacementFrame.get_index(2) != menuPositionAdjustmentRow){ + menuPlacementFrame.insert(menuPositionAdjustmentRow, 2); + menuPlacementFrame.show(); + } + } + else if(widget.get_active() === Constants.MenuPosition.RIGHT){ + if(menuPlacementFrame.get_index(2) === menuPositionAdjustmentRow) + menuPlacementFrame.remove(menuPositionAdjustmentRow); + } + this._settings.set_enum('position-in-panel', widget.get_active()); + }); + + menuPositionRow.add(menuPositionBoxLabel); + menuPositionRow.add(menuPositionCombo); + + let menuPositionAdjustmentRow = new PW.FrameBoxRow(); + let menuPositionAdjustmentLabel = new Gtk.Label({ + label: _("Menu Alignment"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let alignmentScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 100, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + }); + alignmentScale.add_mark(0, Gtk.PositionType.BOTTOM, _("Left")); + alignmentScale.add_mark(50, Gtk.PositionType.BOTTOM, _("Center")); + alignmentScale.add_mark(100, Gtk.PositionType.BOTTOM, _("Right")); + + alignmentScale.set_value(this._settings.get_int('menu-position-alignment')); + alignmentScale.connect('value-changed', (widget) => { + this._settings.set_int('menu-position-alignment', widget.get_value()); + }); + menuPositionAdjustmentRow.add(menuPositionAdjustmentLabel); + menuPositionAdjustmentRow.add(alignmentScale); + + let multiMonitorRow = new PW.FrameBoxRow(); + let multiMonitorLabel = new Gtk.Label({ + label: _("Display ArcMenu on all monitors"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let multiMonitorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + multiMonitorSwitch.set_active(this._settings.get_boolean('multi-monitor')); + multiMonitorSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('multi-monitor', widget.get_active()); + }); + + multiMonitorRow.add(multiMonitorLabel); + multiMonitorRow.add(multiMonitorSwitch); + + menuPlacementCombo.connect('changed', (widget) => { + let placement = widget.get_active(); + this._settings.set_enum('arc-menu-placement', placement); + menuPlacementFrame.remove_all_children(); + menuPlacementFrame.add(menuPlacementRow); + if(menuPlacementCombo.get_active() == Constants.ArcMenuPlacement.PANEL){ + if(avaliablePlacement[Constants.ArcMenuPlacement.PANEL] === false){ + menuPlacementFrame.add(panelWarningRow); + } + else{ + menuPlacementFrame.add(menuPositionRow); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER) + menuPlacementFrame.add(menuPositionAdjustmentRow); + if(avaliablePlacement[Constants.ArcMenuPlacement.DTP]) + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + menuPlacementFrame.show(); + } + else if(menuPlacementCombo.get_active() == Constants.ArcMenuPlacement.DTP){ + if(avaliablePlacement[Constants.ArcMenuPlacement.DTP]){ + menuPlacementFrame.add(menuPositionRow); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER) + menuPlacementFrame.add(menuPositionAdjustmentRow); + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + else + menuPlacementFrame.add(panelWarningRow); + + menuPlacementFrame.show(); + } + else{ + if(avaliablePlacement[Constants.ArcMenuPlacement.DASH]){ + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + else + menuPlacementFrame.add(dashToDockWarningRow); + + menuPlacementFrame.show(); + } + }); + let placement = this._settings.get_enum('arc-menu-placement'); + if(setComboBox){ + if(placement == Constants.ArcMenuPlacement.PANEL && !avaliablePlacement[Constants.ArcMenuPlacement.PANEL]) + menuPlacementCombo.set_active(Constants.ArcMenuPlacement.DTP); + else if(placement == Constants.ArcMenuPlacement.DTP && !avaliablePlacement[Constants.ArcMenuPlacement.DTP]) + menuPlacementCombo.set_active(Constants.ArcMenuPlacement.PANEL); + else + menuPlacementCombo.set_active(placement); + } + else + menuPlacementCombo.set_active(placement); + } +}); + +var ModifyHotCornerDialogWindow = GObject.registerClass( + class Arc_Menu_ModifyHotCornerDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + super._init(_('Modify Hot Corner'), parent); + this.set_default_size(600,250); + } + + _createLayout(vbox) { + let modifyHotCornerFrame = new PW.FrameBox(); + let modifyHotCornerRow = new PW.FrameBoxRow(); + let modifyHotCornerLabel = new Gtk.Label({ + label: _("Hot Corner Action"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotCornerActionCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + hotCornerActionCombo.append_text(_("GNOME Default")); + hotCornerActionCombo.append_text(_("Disabled")); + hotCornerActionCombo.append_text(_("Open ArcMenu")); + hotCornerActionCombo.append_text(_("Custom")); + + let customHotCornerFrame = new PW.FrameBox(); + let customHeaderHotCornerRow = new PW.FrameBoxRow(); + + let customHeaderHotCornerLabel = new Gtk.Label({ + label: ""+_("Custom Hot Corner Action") + "\n" + _("Choose from a list of preset commands or use your own terminal command"), + use_markup: true, + xalign: 0, + hexpand: true + }); + customHeaderHotCornerRow.add(customHeaderHotCornerLabel); + + let presetCustomHotCornerRow = new PW.FrameBoxRow(); + let presetCustomHotCornerLabel = new Gtk.Label({ + label: _("Preset commands"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotCornerPresetsCombo = new Gtk.ComboBoxText({ + hexpand: true + }); + + hotCornerPresetsCombo.append_text(_("Show all Applications")); + hotCornerPresetsCombo.append_text(_("GNOME Terminal")); + hotCornerPresetsCombo.append_text(_("GNOME System Monitor")); + hotCornerPresetsCombo.append_text(_("GNOME Calculator")); + hotCornerPresetsCombo.append_text(_("GNOME gedit")); + hotCornerPresetsCombo.append_text(_("GNOME Screenshot")); + hotCornerPresetsCombo.append_text(_("GNOME Weather")); + hotCornerPresetsCombo.append_text(_("Run Command...")); + hotCornerPresetsCombo.connect('changed', (widget) => { + if(widget.get_active() === 0) + customHotCornerEntry.set_text("ArcMenu_ShowAllApplications"); + else if(widget.get_active() === 1) + customHotCornerEntry.set_text("gnome-terminal"); + else if(widget.get_active() === 2) + customHotCornerEntry.set_text("gnome-system-monitor"); + else if(widget.get_active() === 3) + customHotCornerEntry.set_text("gnome-calculator"); + else if(widget.get_active() === 4) + customHotCornerEntry.set_text("gedit"); + else if(widget.get_active() === 5) + customHotCornerEntry.set_text("gnome-screenshot"); + else if(widget.get_active() === 6) + customHotCornerEntry.set_text("gnome-weather"); + else if(widget.get_active() === 7) + customHotCornerEntry.set_text("ArcMenu_RunCommand"); + }); + presetCustomHotCornerRow.add(presetCustomHotCornerLabel); + presetCustomHotCornerRow.add(hotCornerPresetsCombo); + + let customHotCornerRow = new PW.FrameBoxRow(); + let customHotCornerLabel = new Gtk.Label({ + label: _("Terminal Command"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let customHotCornerEntry = new Gtk.Entry({ + }); + customHotCornerEntry.set_text(this._settings.get_string('custom-hot-corner-cmd')); + customHotCornerEntry.connect('changed', (widget) => { + applyButton.set_sensitive(true); + let index = this.checkIfMatch(customHotCornerEntry.get_text()); + hotCornerPresetsCombo.set_active(index) + }); + customHotCornerEntry.set_width_chars(40); + + let index = this.checkIfMatch(customHotCornerEntry.get_text()); + hotCornerPresetsCombo.set_active(index) + customHotCornerRow.add(customHotCornerLabel); + customHotCornerRow.add(customHotCornerEntry); + + customHotCornerFrame.add(customHeaderHotCornerRow); + customHotCornerFrame.add(presetCustomHotCornerRow); + customHotCornerFrame.add(customHotCornerRow); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + }); + applyButton.connect('clicked', () => { + this._settings.set_string('custom-hot-corner-cmd',customHotCornerEntry.get_text()); + this._settings.set_enum('hot-corners',hotCornerActionCombo.get_active()); + applyButton.set_sensitive(false); + this.addResponse = true; + this.response(-10); + }); + applyButton.set_halign(Gtk.Align.END); + applyButton.set_sensitive(false); + + + let hotCornerAction = this._settings.get_enum('hot-corners'); + hotCornerActionCombo.set_active(hotCornerAction); + hotCornerActionCombo.connect('changed', (widget) => { + applyButton.set_sensitive(true); + if(widget.get_active()==Constants.HotCornerAction.CUSTOM){ + customHotCornerFrame.set_sensitive(true); + } + else{ + customHotCornerFrame.set_sensitive(false); + } + }); + + modifyHotCornerRow.add(modifyHotCornerLabel); + modifyHotCornerRow.add(hotCornerActionCombo); + modifyHotCornerFrame.add(modifyHotCornerRow); + if(hotCornerActionCombo.get_active() == Constants.HotCornerAction.CUSTOM) + customHotCornerFrame.set_sensitive(true); + else + customHotCornerFrame.set_sensitive(false); + vbox.append(modifyHotCornerFrame); + vbox.append(customHotCornerFrame); + vbox.append(applyButton); + } + checkIfMatch(text){ + if(text === "ArcMenu_ShowAllApplications") + return 0; + else if(text === "gnome-terminal") + return 1; + else if(text === "gnome-system-monitor") + return 2; + else if(text === "gnome-calculator") + return 3; + else if(text === "gedit") + return 4; + else if(text === "gnome-screenshot") + return 5; + else if(text === "gnome-weather") + return 6; + else if(text === "ArcMenu_RunCommand") + return 7; + else + return -1; + } +}); + +var CustomHotkeyDialogWindow = GObject.registerClass({ + Signals: { + 'response': { param_types: [GObject.TYPE_INT] }, + }, +}, + class Arc_Menu_CustomHotkeyDialogWindow extends Gtk.Window { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + this.keyEventController = new Gtk.EventControllerKey(); + + super._init({ + modal: true, + title: _("Set Custom Hotkey"), + transient_for: parent.get_root() + }); + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + hexpand: true, + halign: Gtk.Align.FILL + }); + this.set_child(vbox); + this._createLayout(vbox); + this.add_controller(this.keyEventController); + this.set_size_request(500, 250); + } + + _createLayout(vbox) { + let hotkeyKey = ''; + + let modLabel = new Gtk.Label({ + label:_("Choose Modifiers"), + use_markup: true, + hexpand: true, + halign: Gtk.Align.START + }); + let modFrame = new PW.FrameBox(); + let modRow = new PW.FrameBoxRow(); + modRow.add(modLabel); + + let buttonBox = new Gtk.Box({ + hexpand: true, + halign: Gtk.Align.END, + spacing: 5 + }); + modRow.add(buttonBox); + let ctrlButton = new Gtk.ToggleButton({ + label: _("Ctrl") + }); + let superButton = new Gtk.ToggleButton({ + label: _("Super") + }); + let shiftButton = new Gtk.ToggleButton({ + label: _("Shift") + }); + let altButton = new Gtk.ToggleButton({ + label: _("Alt") + }); + ctrlButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + superButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + shiftButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + altButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + buttonBox.append(ctrlButton); + buttonBox.append(superButton); + buttonBox.append(shiftButton); + buttonBox.append(altButton); + modFrame.add(modRow); + vbox.append(modFrame); + + let keyFrame = new PW.FrameBox(); + let keyLabel = new Gtk.Label({ + label: _("Press any key"), + use_markup: true, + xalign: .5, + hexpand: true, + halign: Gtk.Align.CENTER + }); + vbox.append(keyLabel); + let pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/keyboard-symbolic.svg', 256, 72); + let keyboardImage = Gtk.Picture.new_for_pixbuf(pixbuf); + keyboardImage.hexpand = true; + keyboardImage.vexpand = true; + keyboardImage.halign = Gtk.Align.CENTER; + keyboardImage.valign = Gtk.Align.CENTER; + vbox.append(keyboardImage) + + let resultsRow = new PW.FrameBoxRow(); + let resultsLabel = new Gtk.Label({ + label: _("New Hotkey"), + use_markup: true, + xalign: .5, + hexpand: false, + halign: Gtk.Align.START + }); + let resultsWidget = new Gtk.ShortcutsShortcut({ + hexpand: true, + halign: Gtk.Align.END + }); + resultsRow.add(resultsLabel); + resultsRow.add(resultsWidget); + keyFrame.add(resultsRow); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + halign: Gtk.Align.END + }); + applyButton.connect('clicked', () => { + this.addResponse = true; + this.emit("response", -10); + }); + applyButton.set_sensitive(false); + + this.keyEventController.connect('key-released', (controller, keyval, keycode, state) => { + this.resultsText = ""; + let key = keyval; + hotkeyKey = Gtk.accelerator_name(key, 0); + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += Gtk.accelerator_name(key,0); + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + + vbox.append(keyFrame); + vbox.append(applyButton); + } +}); + +function getIconPixbuf(filePath){ + if (GLib.file_test(filePath, GLib.FileTest.EXISTS)) + return GdkPixbuf.Pixbuf.new_from_file_at_size(filePath, 25, 25); + else + return null; +} + +var ButtonAppearancePage = GObject.registerClass( + class Arc_Menu_ButtonAppearancePage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + this.menuButtonColor = this._settings.get_string('menu-button-color'); + this.menuButtonHoverColor = this._settings.get_string('menu-button-hover-color'); + this.menuButtonActiveColor = this._settings.get_string('menu-button-active-color'); + this.menuButtonHoverBackgroundcolor = this._settings.get_string('menu-button-hover-backgroundcolor'); + this.menuButtonActiveBackgroundcolor = this._settings.get_string('menu-button-active-backgroundcolor'); + this._createLayout(this.mainBox); + } + + _createLayout(vbox) { + this.arcMenuPlacement = this._settings.get_enum('arc-menu-placement'); + let menuButtonAppearanceHeaderLabel = new Gtk.Label({ + label: "" + _('Menu Button Appearance') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonAppearanceHeaderLabel); + + let menuButtonAppearanceFrame = new PW.FrameBox(); + let menuButtonAppearanceRow = new PW.FrameBoxRow(); + let menuButtonAppearanceLabel = new Gtk.Label({ + label: _('Appearance'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonAppearanceCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + menuButtonAppearanceCombo.append_text(_("Icon")); + menuButtonAppearanceCombo.append_text(_("Text")); + menuButtonAppearanceCombo.append_text(_("Icon and Text")); + menuButtonAppearanceCombo.append_text(_("Text and Icon")); + menuButtonAppearanceCombo.append_text(_("Hidden")); + menuButtonAppearanceCombo.set_active(this._settings.get_enum('menu-button-appearance')); + menuButtonAppearanceCombo.connect('changed', (widget) => { + this.resetButton.set_sensitive(true); + menuButtonAppearanceFrame.removeChildrenAfterIndex(0); + if(widget.get_active() === Constants.MenuButtonAppearance.NONE){ + menuButtonAppearanceFrame.show(); + } + else if(widget.get_active() === Constants.MenuButtonAppearance.ICON){ + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + if (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + menuButtonAppearanceFrame.show(); + } + else if(widget.get_active() === Constants.MenuButtonAppearance.ICON_TEXT || widget.get_active() === Constants.MenuButtonAppearance.TEXT_ICON || + widget.get_active() === Constants.MenuButtonAppearance.TEXT){ + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + if (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + menuButtonAppearanceFrame.add(menuButtonCustomTextBoxRow); + menuButtonAppearanceFrame.show(); + } + this._settings.set_enum('menu-button-appearance', widget.get_active()); + }); + + menuButtonAppearanceRow.add(menuButtonAppearanceLabel); + menuButtonAppearanceRow.add(menuButtonAppearanceCombo); + menuButtonAppearanceFrame.add(menuButtonAppearanceRow); + + let menuButtonArrowIconBoxRow = new PW.FrameBoxRow(); + let menuButtonArrowIconLabel = new Gtk.Label({ + label: _('Show Arrow'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let enableArrowIconSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + enableArrowIconSwitch.set_active(this._settings.get_boolean('enable-menu-button-arrow')); + enableArrowIconSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-menu-button-arrow', widget.get_active()); + this.resetButton.set_sensitive(true); + }); + + menuButtonArrowIconBoxRow.add(menuButtonArrowIconLabel); + menuButtonArrowIconBoxRow.add(enableArrowIconSwitch); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + + let menuButtonPaddingRow = new PW.FrameBoxRow(); + let menuButtonPadding = this._settings.get_int('button-padding'); + let menuButtonPaddingLabel = new Gtk.Label({ + label: _('Menu Button Padding'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let paddingScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -1, + upper: 25, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + paddingScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + paddingScale.add_mark(-1, Gtk.PositionType.TOP, _("Default")); + paddingScale.set_value(menuButtonPadding); + paddingScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('button-padding', paddingScale.get_value()); + this._settings.set_boolean('reload-theme', true); + }); + + menuButtonPaddingRow.add(menuButtonPaddingLabel); + menuButtonPaddingRow.add(paddingScale); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + + ///// Row for menu button offset ///// + let menuButtonOffsetRow = new PW.FrameBoxRow(); + let menuButtonOffset = this._settings.get_int('menu-button-position-offset'); + let menuButtonOffsetLabel = new Gtk.Label({ + label: _('Menu Button Position'), + use_markup: true, + xalign: 0, + hexpand: true, + }); + let offsetScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 10, // arbitrary value + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + offsetScale.add_mark(0, Gtk.PositionType.TOP, _("Default")); // offset 0 is default + offsetScale.add_mark(1, Gtk.PositionType.TOP, null); + offsetScale.add_mark(2, Gtk.PositionType.TOP, null); + offsetScale.set_value(menuButtonOffset); + offsetScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('menu-button-position-offset', offsetScale.get_value()); + }); + menuButtonOffsetRow.add(menuButtonOffsetLabel); + menuButtonOffsetRow.add(offsetScale); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE && + (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP)) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + //////////////////// + + let menuButtonCustomTextBoxRow = new PW.FrameBoxRow(); + let menuButtonCustomTextLabel = new Gtk.Label({ + label: _('Text'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonCustomTextEntry = new Gtk.Entry({ halign: Gtk.Align.END }); + menuButtonCustomTextEntry.set_width_chars(30); + menuButtonCustomTextEntry.set_text(this._settings.get_string('custom-menu-button-text')); + menuButtonCustomTextEntry.connect('changed', (widget) => { + this.resetButton.set_sensitive(true); + let customMenuButtonText = widget.get_text(); + this._settings.set_string('custom-menu-button-text', customMenuButtonText); + }); + + menuButtonCustomTextBoxRow.add(menuButtonCustomTextLabel); + menuButtonCustomTextBoxRow.add(menuButtonCustomTextEntry); + if(this._settings.get_enum('menu-button-appearance') != Constants.MenuButtonAppearance.ICON && this._settings.get_enum('menu-button-appearance') != Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonCustomTextBoxRow); + vbox.append(menuButtonAppearanceFrame); + + let menuButtonIconHeaderLabel = new Gtk.Label({ + label: "" + _('Icon Appearance') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonIconHeaderLabel); + + let menuButtonIconFrame = new PW.FrameBox(); + let menuButtonIconRow = new PW.FrameBoxRow(); + let menuButtonIconLabel = new Gtk.Label({ + label: _('Icon'), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let menuButtonIconButton = new PW.Button({ + title: _("Browse Icons") + " ", + icon_name: 'icon-preview-symbolic', + hexpand: false, + }); + menuButtonIconButton.connect('clicked', () => { + let dialog = new ArcMenuIconsDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', ()=> { + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + dialog.destroy(); + }); + }); + + menuButtonIconRow.add(menuButtonIconLabel); + menuButtonIconRow.add(menuButtonIconButton); + menuButtonIconFrame.add(menuButtonIconRow); + + let menuButtonIconSizeRow = new PW.FrameBoxRow(); + let iconSize = this._settings.get_double('custom-menu-button-icon-size'); + let menuButtonIconSizeLabel = new Gtk.Label({ + label: _('Icon Size'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonIconSizeScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 14, + upper: 64, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuButtonIconSizeScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + menuButtonIconSizeScale.set_value(iconSize); + menuButtonIconSizeScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_double('custom-menu-button-icon-size', menuButtonIconSizeScale.get_value()); + }); + + menuButtonIconSizeRow.add(menuButtonIconSizeLabel); + menuButtonIconSizeRow.add(menuButtonIconSizeScale); + menuButtonIconFrame.add(menuButtonIconSizeRow); + + vbox.append(menuButtonIconFrame); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + halign: Gtk.Align.START, + hexpand: true, + valign: Gtk.Align.END, + vexpand: true + }); + + let menuButtonColorHeaderLabel = new Gtk.Label({ + label: "" + _('Menu Button Styling') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonColorHeaderLabel); + + this.menuButtonIconColorFrame = new PW.FrameBox(); + + let[menuButtonColorSwitch, menuButtonColorChooser] = this.newColorChooserRow({ + color: this.menuButtonColor, + label: _("Color"), + settingColorName: 'menu-button-color', + settingOverrideName: 'override-menu-button-color', + }); + + let[menuButtonHoverColorSwitch, menuButtonHoverColorChooser] = this.newColorChooserRow({ + color: this.menuButtonHoverColor, + label: _("Hover Color"), + settingColorName: 'menu-button-hover-color', + settingOverrideName: 'override-menu-button-hover-color', + }); + + let[menuButtonActiveColorSwitch, menuButtonActiveColorChooser] = this.newColorChooserRow({ + color: this.menuButtonActiveColor, + label: _("Active Color"), + settingColorName: 'menu-button-active-color', + settingOverrideName: 'override-menu-button-active-color', + }); + + let[menuButtonHoverBackgroundcolorSwitch, menuButtonHoverBackgroundcolorChooser] = this.newColorChooserRow({ + color: this.menuButtonHoverBackgroundcolor, + label: _("Hover Background Color"), + settingColorName: 'menu-button-hover-backgroundcolor', + settingOverrideName: 'override-menu-button-hover-background-color', + }); + + let[menuButtonActiveBackgroundcolorSwitch, menuButtonActiveBackgroundcolorChooser] = this.newColorChooserRow({ + color: this.menuButtonActiveBackgroundcolor, + label: _("Active Background Color"), + settingColorName: 'menu-button-active-backgroundcolor', + settingOverrideName: 'override-menu-button-active-background-color', + }); + + let roundedCornersRow = new PW.FrameBoxRow(); + + let roundedCornersLabel = new Gtk.Label({ + label: _("Override Border Radius"), + xalign:0, + hexpand: true, + }); + let roundedCornersSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + active: this._settings.get_boolean('menu-button-override-border-radius') + }); + roundedCornersSwitch.connect("notify::active", (widget)=> { + this.resetButton.set_sensitive(true); + this._settings.set_boolean('menu-button-override-border-radius', widget.get_active()) + this._settings.set_boolean('reload-theme', true); + menuButtonBorderRadiusRow.set_sensitive(widget.get_active()); + }); + + roundedCornersRow.add(roundedCornersLabel); + roundedCornersRow.add(roundedCornersSwitch); + + this.menuButtonIconColorFrame.add(roundedCornersRow); + + let menuButtonBorderRadiusRow = new PW.FrameBoxRow(); + let borderRadius = this._settings.get_int('menu-button-border-radius'); + let menuButtonBorderRadiusLabel = new Gtk.Label({ + label: _('Border Radius'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonBorderRadiusScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 20, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuButtonBorderRadiusScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + menuButtonBorderRadiusScale.set_value(borderRadius); + menuButtonBorderRadiusScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('menu-button-border-radius', menuButtonBorderRadiusScale.get_value()); + this._settings.set_boolean('reload-theme', true); + }); + + menuButtonBorderRadiusRow.add(menuButtonBorderRadiusLabel); + menuButtonBorderRadiusRow.add(menuButtonBorderRadiusScale); + menuButtonBorderRadiusRow.set_sensitive(this._settings.get_boolean('menu-button-override-border-radius')); + this.menuButtonIconColorFrame.add(menuButtonBorderRadiusRow); + + vbox.append(this.menuButtonIconColorFrame); + + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + menuButtonAppearanceCombo.set_active(0); + menuButtonCustomTextEntry.set_text('Applications'); + paddingScale.set_value(-1); + menuButtonIconSizeScale.set_value(20); + let colorParse = new Gdk.RGBA(); + colorParse.parse('rgb(240,240,240)'); + menuButtonActiveColorChooser.set_rgba(colorParse); + menuButtonColorChooser.set_rgba(colorParse); + colorParse.parse('rgb(214,214,214)'); + menuButtonHoverColorChooser.set_rgba(colorParse); + colorParse.parse('rgba(238,238,236,0.1)'); + menuButtonHoverBackgroundcolorChooser.set_rgba(colorParse); + colorParse.parse('rgba(238,238,236,0.18)'); + menuButtonActiveBackgroundcolorChooser.set_rgba(colorParse); + enableArrowIconSwitch.set_active(false); + menuButtonColorSwitch.set_active(false); + menuButtonHoverColorSwitch.set_active(false); + menuButtonActiveColorSwitch.set_active(false); + menuButtonHoverBackgroundcolorSwitch.set_active(false); + menuButtonActiveBackgroundcolorSwitch.set_active(false); + roundedCornersSwitch.set_active(false); + menuButtonBorderRadiusScale.set_value(0); + offsetScale.set_value(0); + this._settings.reset('menu-button-icon'); + this._settings.reset('arc-menu-icon'); + this._settings.reset('distro-icon'); + this._settings.reset('custom-menu-button-icon'); + this._settings.reset('menu-button-hover-color'); + this._settings.reset('menu-button-active-color'); + this._settings.reset('menu-button-hover-backgroundcolor'); + this._settings.reset('menu-button-active-backgroundcolor'); + this._settings.reset('menu-button-color'); + this._settings.reset('override-menu-button-hover-color'); + this._settings.reset('override-menu-button-active-color'); + this._settings.reset('override-menu-button-hover-background-color'); + this._settings.reset('override-menu-button-active-background-color'); + this._settings.reset('override-menu-button-color'); + this._settings.reset('menu-button-override-border-radius'); + this._settings.reset('menu-button-border-radius'); + this._settings.reset('menu-button-position-offset'); + this._settings.set_boolean('reload-theme', true); + + this.resetButton.set_sensitive(false); + }); + vbox.append(this.resetButton); + } + + newColorChooserRow(params){ + let colorParse = new Gdk.RGBA(); + let colorRow = new PW.FrameBoxRow(); + let buttonsGrid = new Gtk.Grid({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }); + + let colorLabel = new Gtk.Label({ + label: params.label, + xalign:0, + hexpand: true, + }); + let colorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + active: this._settings.get_boolean(params.settingOverrideName) + }); + colorSwitch.connect("notify::active", (widget)=> { + this.resetButton.set_sensitive(true); + this._settings.set_boolean(params.settingOverrideName, widget.get_active()) + colorChooser.sensitive = widget.get_active(); + this._settings.set_boolean('reload-theme', true); + }); + + let colorChooser = new Gtk.ColorButton({ + use_alpha: true, + sensitive: colorSwitch.get_active() + }); + + colorParse.parse(params.color); + colorChooser.set_rgba(colorParse); + + colorChooser.connect('color-set', ()=>{ + this.resetButton.set_sensitive(true); + params.color = colorChooser.get_rgba().to_string(); + this._settings.set_string(params.settingColorName, params.color); + this._settings.set_boolean('reload-theme', true); + }); + + colorRow.add(colorLabel); + buttonsGrid.attach(colorSwitch, 0, 0, 1, 1); + buttonsGrid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 1, 0, 1, 1); + buttonsGrid.attach(colorChooser, 2, 0, 1, 1); + colorRow.add(buttonsGrid); + this.menuButtonIconColorFrame.add(colorRow); + return [colorSwitch, colorChooser]; + } + + checkIfResetButtonSensitive(){ + if( this._settings.get_string('menu-button-hover-backgroundcolor') != 'rgba(238,238,236,0.1)' || + this._settings.get_string('menu-button-active-backgroundcolor') != 'rgba(238,238,236,0.18)' || + this._settings.get_string('menu-button-active-color') != 'rgb(240,240,240)' || + this._settings.get_string('menu-button-hover-color') != 'rgb(214,214,214)' || + this._settings.get_string('menu-button-color') != 'rgb(240,240,240)' || + this._settings.get_double('custom-menu-button-icon-size') != 20 || + this._settings.get_int('button-padding') != -1 || + this._settings.get_enum('menu-button-icon') != 0 || + this._settings.get_int('arc-menu-icon') != 0 || + this._settings.get_string('custom-menu-button-text') != 'Applications' || + this._settings.get_enum('menu-button-appearance') != 0 || + this._settings.get_boolean('enable-menu-button-arrow') || + this._settings.get_boolean('override-menu-button-color') || + this._settings.get_boolean('override-menu-button-hover-color') || + this._settings.get_boolean('override-menu-button-active-color') || + this._settings.get_boolean('override-menu-button-hover-background-color') || + this._settings.get_boolean('override-menu-button-active-background-color') || + this._settings.get_boolean('menu-button-override-border-radius') || + this._settings.get_int('menu-button-border-radius') != 0 || + this._settings.get_int('menu-button-position-offset') != 0 ) + return true; + else + return false; + } +}); + +var ArcMenuIconsDialogWindow = GObject.registerClass( + class Arc_Menu_ArcMenuIconsDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + super._init(_('ArcMenu Icons'), parent); + this.set_default_size(550, 400); + } + + _createLayout(vbox){ + this.stack = new Gtk.Stack({ + halign: Gtk.Align.FILL, + hexpand: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + + let arcMenuIconsBox = new Gtk.ScrolledWindow(); + + let arcMenuIconsFlowBox = new PW.IconGrid(); + arcMenuIconsFlowBox.connect('child-activated', ()=> { + distroIconsBox.unselect_all(); + customIconFlowBox.unselect_all(); + let selectedChild = arcMenuIconsFlowBox.get_selected_children(); + let selectedChildIndex = selectedChild[0].get_index(); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.ARC_MENU); + this._settings.set_int('arc-menu-icon', selectedChildIndex); + }); + arcMenuIconsBox.set_child(arcMenuIconsFlowBox); + Constants.MenuIcons.forEach((icon)=>{ + let iconName = icon.PATH.replace("/media/icons/menu_button_icons/icons/", ''); + iconName = iconName.replace(".svg", ''); + let iconImage = new Gtk.Image({ + icon_name: iconName, + pixel_size: 36 + }); + arcMenuIconsFlowBox.add(iconImage); + }); + + let distroIconsBox = new PW.IconGrid(); + distroIconsBox.connect('child-activated', ()=> { + arcMenuIconsFlowBox.unselect_all(); + customIconFlowBox.unselect_all(); + let selectedChild = distroIconsBox.get_selected_children(); + let selectedChildIndex = selectedChild[0].get_index(); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.DISTRO_ICON); + this._settings.set_int('distro-icon', selectedChildIndex); + }); + Constants.DistroIcons.forEach((icon)=>{ + let iconImage; + if(icon.PATH === 'start-here-symbolic'){ + iconImage = new Gtk.Image({ + icon_name: 'start-here-symbolic', + pixel_size: 36 + }); + } + else{ + let iconName1 = icon.PATH.replace("/media/icons/menu_button_icons/distro_icons/", ''); + iconName1 = iconName1.replace(".svg", ''); + iconImage = new Gtk.Image({ + icon_name: iconName1, + pixel_size: 36 + }); + } + distroIconsBox.add(iconImage); + }); + + let customIconBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL + }); + let customIconFlowBox = new PW.IconGrid(); + customIconFlowBox.vexpand = false; + customIconFlowBox.homogeneous = false; + customIconFlowBox.connect('child-activated', ()=> { + arcMenuIconsFlowBox.unselect_all(); + distroIconsBox.unselect_all(); + let customIconPath = this._settings.get_string('custom-menu-button-icon'); + this._settings.set_string('custom-menu-button-icon', customIconPath) + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.CUSTOM); + }); + customIconBox.append(customIconFlowBox); + let customIconImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string(this._settings.get_string('custom-menu-button-icon')), + pixel_size: 36 + }); + customIconFlowBox.add(customIconImage); + + let fileChooserFrame = new PW.FrameBox(); + fileChooserFrame.margin_top = 20; + fileChooserFrame.margin_bottom = 20; + fileChooserFrame.margin_start = 20; + fileChooserFrame.margin_end = 20; + let fileChooserRow = new PW.FrameBoxRow(); + let fileChooserLabel = new Gtk.Label({ + label: _('Browse for a Custom Icon'), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + let fileChooserButton = new Gtk.Button({ + label: _('Select an Icon') + }); + fileChooserButton.connect('clicked', (widget) => { + let dialog = new Gtk.FileChooserDialog({ + title: _('Select an Icon'), + transient_for: this.get_root(), + modal: true, + action: Gtk.FileChooserAction.OPEN, + }); + + if(dialog.get_parent()) + dialog.unparent(); + dialog.set_filter(fileFilter); + + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button("_Open", Gtk.ResponseType.ACCEPT); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + arcMenuIconsFlowBox.unselect_all(); + distroIconsBox.unselect_all(); + customIconImage.gicon = Gio.icon_new_for_string(dialog.get_file().get_path()); + this._settings.set_string('custom-menu-button-icon', dialog.get_file().get_path()); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.CUSTOM); + customIconFlowBox.select_child(customIconFlowBox.get_child_at_index(0)); + dialog.destroy(); + } + else + dialog.destroy(); + }) + + dialog.show(); + }); + + fileChooserRow.add(fileChooserLabel); + fileChooserRow.add(fileChooserButton); + fileChooserFrame.add(fileChooserRow); + customIconBox.append(fileChooserFrame); + + this.stack.add_titled(arcMenuIconsBox, 'ArcMenu Icons', _('ArcMenu Icons')); + this.stack.add_titled(distroIconsBox, 'Distro Icons', _('Distro Icons')); + this.stack.add_titled(customIconBox, 'Custom Icon', _('Custom Icon')); + + let stackSwitcher = new Gtk.StackSwitcher({ + stack: this.stack, + halign: Gtk.Align.CENTER + }); + + vbox.append(stackSwitcher); + vbox.append(this.stack); + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU) + this.stack.set_visible_child_name('ArcMenu Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON) + this.stack.set_visible_child_name('Distro Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM) + this.stack.set_visible_child_name('Custom Icon'); + + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU){ + let children = arcMenuIconsFlowBox.childrenCount; + for(let i = 0; i < children; i++){ + if(i === this._settings.get_int('arc-menu-icon')){ + arcMenuIconsFlowBox.select_child(arcMenuIconsFlowBox.get_child_at_index(i)); + break; + } + } + } + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON){ + let children = distroIconsBox.childrenCount; + for(let i = 0; i < children; i++){ + if(i === this._settings.get_int('distro-icon')){ + distroIconsBox.select_child(distroIconsBox.get_child_at_index(i)); + break; + } + } + } + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM){ + customIconFlowBox.select_child(customIconFlowBox.get_child_at_index(0)); + } + + let distroInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + distroInfoButton.halign = Gtk.Align.START; + distroInfoButton.connect('clicked', ()=> { + let dialog = new DistroIconsDisclaimerWindow(this._settings, this); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + vbox.append(distroInfoButton); + } + + setVisibleChild(){ + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU) + this.stack.set_visible_child_name('ArcMenu Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON) + this.stack.set_visible_child_name('Distro Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM) + this.stack.set_visible_child_name('Custom Icon'); + } +}); + +var DistroIconsDisclaimerWindow = GObject.registerClass( + class Arc_Menu_DistroIconsDisclaimerWindow extends Gtk.MessageDialog { + _init(settings, parent) { + this._settings = settings; + super._init({ + text: "" + _("Legal disclaimer for Distro Icons...") + "", + use_markup: true, + message_type: Gtk.MessageType.OTHER, + transient_for: parent.get_root(), + modal: true, + buttons: Gtk.ButtonsType.OK + }); + + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + }); + this.get_content_area().append(vbox); + this._createLayout(vbox); + } + + _createLayout(vbox) { + let scrollWindow = new Gtk.ScrolledWindow({ + min_content_width: 500, + max_content_width: 500, + min_content_height: 400, + max_content_height: 400, + hexpand: false, + halign: Gtk.Align.START, + }); + scrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + let frame = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + hexpand: false, + halign: Gtk.Align.START + }); + + let bodyLabel = new Gtk.Label({ + label: Constants.DistroIconsDisclaimer, + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true + }); + bodyLabel.set_size_request(500,-1); + + frame.append(bodyLabel); + scrollWindow.set_child(frame); + vbox.append(scrollWindow); + } +}); + +var MenuLayoutPage = GObject.registerClass( + class Arc_Menu_MenuLayoutPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + this._settings = settings; + + this.scrollBox = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + vexpand: true, + valign: Gtk.Align.FILL + }); + this.scrollBox.set_child(this.mainBox); + + let currentLayoutLabel = new Gtk.Label({ + label: "" + _("Current Menu Layout") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + let chooseNewLayoutLabel = new Gtk.Label({ + label: "" + _("Available Menu Layouts") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(currentLayoutLabel); + + let currentLayoutFrame = new PW.FrameBox(); + + let currentLayoutBoxLabel = new Gtk.Label({ + label: "" + this.getMenuLayoutName(this._settings.get_enum('menu-layout')) + "", + use_markup: true, + hexpand: true, + vexpand: true, + halign: Gtk.Align.CENTER, + valign: Gtk.Align.CENTER + }); + let currentLayoutBoxRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + currentLayoutBoxRow.activatable = true; + currentLayoutBoxRow._grid.row_spacing = 0; + currentLayoutBoxRow._grid.column_spacing = 0; + + let goNextImage = new Gtk.Image({ + icon_name: 'go-next-symbolic', + halign: Gtk.Align.END + }); + + currentLayoutFrame._listBox.connect('row-activated', () => { + this.displayLayoutTweaksPage(); + }); + + this.layoutsTweaksPage = new LayoutTweaks.tweaks.TweaksPage(this._settings, this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout'))); + this.layoutsTweaksPage.connect("response", (page, response) => { + if(response === -20) + this.stack.set_visible_child_name("LayoutsBox"); + }); + + let currentLayoutImagePath = this.getMenuLayoutImagePath(this._settings.get_enum('menu-layout')); + + let currentLayoutImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string(currentLayoutImagePath), + pixel_size: 155, + hexpand: false, + halign: Gtk.Align.START, + valign: Gtk.Align.CENTER, + }); + let tweaksLabel = new Gtk.Label({ + label: this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout')), + use_markup: true, + halign: Gtk.Align.END, + vexpand: true, + hexpand: true + }); + currentLayoutBoxRow._grid.attach(currentLayoutImage, 0, 0, 1, 1); + currentLayoutBoxRow._grid.attach(currentLayoutBoxLabel, 0, 0, 1, 1); + currentLayoutBoxRow._grid.attach(goNextImage, 0, 0, 1, 1); + currentLayoutFrame.add(currentLayoutBoxRow); + + this.mainBox.append(currentLayoutFrame); + this.mainBox.append(chooseNewLayoutLabel); + + this.stack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + this.layoutTilesBox = new Gtk.Grid({ + column_homogeneous: true, + column_spacing: 14, + row_spacing: 6, + hexpand: true, + halign: Gtk.Align.FILL, + vexpand: true, + valign: Gtk.Align.FILL + }); + this.mainBox.append(this.layoutTilesBox); + this.stack.add_named(this.scrollBox, "LayoutsBox"); + this.stack.add_named(this.layoutsTweaksPage, "LayoutsTweaks") + let gridY = 0; + Constants.MenuStyles.STYLES.forEach((style) => { + let tile = new PW.LayoutTile(style.TITLE, style.IMAGE, style); + this.layoutTilesBox.attach(tile, 0, gridY, 1, 1); + let menuLayoutsBox = new MenuLayoutCategoryPage(this._settings, this, tile, style.TITLE); + gridY++; + menuLayoutsBox.connect('menu-layout-response', (dialog, response) => { + if(response === -10) { + this._settings.set_enum('menu-layout', dialog.index); + this._settings.set_boolean('reload-theme', true); + currentLayoutBoxLabel.label = "" + this.getMenuLayoutName(dialog.index) + ""; + tweaksLabel.label = this.getMenuLayoutTweaksName(dialog.index); + currentLayoutImage.gicon = Gio.icon_new_for_string(this.getMenuLayoutImagePath(dialog.index)); + this.stack.set_visible_child_name("LayoutsBox"); + this.scrollBox.vadjustment.set_value(this.scrollBox.vadjustment.get_lower()); + } + if(response === -20){ + this.stack.set_visible_child_name("LayoutsBox"); + } + }); + this.stack.add_named(menuLayoutsBox, "Layout_" + style.TITLE); + tile._listBox.connect('row-activated', ()=> { + this.stack.set_visible_child_name("Layout_" + style.TITLE); + menuLayoutsBox.enableSelectionMode(); + }); + }); + + this.append(this.stack); + } + + displayLayoutTweaksPage(){ + let layoutName = this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout')); + this.layoutsTweaksPage.setActiveLayout(this._settings.get_enum('menu-layout'), layoutName); + this.stack.set_visible_child_name("LayoutsTweaks"); + } + + displayRunnerTweaksPage(){ + if(!this.runnerTweaksPage){ + let activeLayoutName = this.getMenuLayoutTweaksName(Constants.MenuLayout.RUNNER); + this.runnerTweaksPage = new LayoutTweaks.tweaks.TweaksPage(this._settings, activeLayoutName); + this.stack.add_named(this.runnerTweaksPage, "RunnerTweaks") + this.runnerTweaksPage.connect("response", (page, response) => { + if(response === -20) + this.stack.set_visible_child_name("LayoutsBox"); + }); + this.runnerTweaksPage.setActiveLayout(Constants.MenuLayout.RUNNER); + } + this.stack.set_visible_child_name("RunnerTweaks"); + } + + getMenuLayoutName(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return _(style.TITLE); + } + } + } + } + + getMenuLayoutTweaksName(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return _("%s Layout Tweaks", style.TITLE).format(style.TITLE); + } + } + } + } + + getMenuLayoutImagePath(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return style.IMAGE; + } + } + } + } + +}); + +var MenuThemePage = GObject.registerClass( + class Arc_Menu_MenuThemePage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.customArcMenu = this._settings.get_boolean('enable-custom-arc-menu'); + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.checkIfPresetMatch(); + + let overrideArcMenuHeaderLabel = new Gtk.Label({ + label: "" + _('Enable Custom Menu Theme') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(overrideArcMenuHeaderLabel); + + let overrideArcMenuFrame = new PW.FrameBox(); + let overrideArcMenuRow = new PW.FrameBoxRow(); + let overrideArcMenuLabel = new Gtk.Label({ + label: _("Override Menu Theme"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let overrideArcMenuSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + overrideArcMenuSwitch.set_active(this._settings.get_boolean('enable-custom-arc-menu')); + overrideArcMenuSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-custom-arc-menu',widget.get_active()); + this._settings.set_boolean('reload-theme', true); + if(widget.get_active()){ + this.mainBox.append(this.menuThemeCustomizationBox); + this.menuThemeCustomizationBox.show(); + this.append(this.buttonRow); + this.buttonRow.show(); + } + else{ + this.mainBox.remove(this.menuThemeCustomizationBox); + this.remove(this.buttonRow); + } + this.mainBox.show(); + }); + + this.menuThemeCustomizationBox = new OverrideArcMenuThemeWindow(this._settings, this.mainBox, this); + this.menuThemeCustomizationBox.connect('menu-theme-response', (dialog, response) => { + if(response === -10) { + this._settings.set_string('separator-color', dialog.separatorColor); + this._settings.set_boolean('vert-separator', dialog.verticalSeparator); + this._settings.set_string('menu-color', dialog.menuColor); + this._settings.set_string('menu-foreground-color', dialog.menuForegroundColor); + this._settings.set_string('border-color', dialog.borderColor); + this._settings.set_string('highlight-color', dialog.highlightColor ); + this._settings.set_string('highlight-foreground-color', dialog.highlightForegroundColor); + this._settings.set_int('menu-font-size', dialog.fontSize); + this._settings.set_int('menu-border-size', dialog.borderSize); + this._settings.set_int('menu-corner-radius', dialog.cornerRadius); + this._settings.set_int('menu-margin', dialog.menuMargin); + this._settings.set_int('menu-arrow-size', dialog.menuArrowSize); + this._settings.set_boolean('reload-theme', true); + this.presetName = dialog.presetName; + } + else{ + this.checkIfPresetMatch(); + } + }); + + overrideArcMenuRow.add(overrideArcMenuLabel); + overrideArcMenuRow.add(overrideArcMenuSwitch); + overrideArcMenuFrame.add(overrideArcMenuRow); + + this.mainBox.append(overrideArcMenuFrame); + if(overrideArcMenuSwitch.get_active()) + this.mainBox.append(this.menuThemeCustomizationBox); + else + this.remove(this.buttonRow); + } + + checkIfPresetMatch(){ + this.presetName = "Custom Theme"; + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.currentSettingsArray = [this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + let all_color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < all_color_themes.length; i++){ + this.isEqual = true; + for(let l = 0; l < this.currentSettingsArray.length; l++){ + if(this.currentSettingsArray[l] !== all_color_themes[i][l + 1]){ + this.isEqual=false; + break; + } + } + if(this.isEqual){ + this.presetName = all_color_themes[i][0]; + break; + } + } + } +}); + +var MenuLayoutCategoryPage = GObject.registerClass({ + Signals: { + 'menu-layout-response': { param_types: [GObject.TYPE_INT] }, + }, +}, class Arc_Menu_MenuLayoutCategoryPage extends Gtk.ScrolledWindow { + _init(settings, parent, tile, title) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this.title = title; + this._parent = parent; + this._settings = settings; + this.index = this._settings.get_enum('menu-layout'); + this.layoutStyle = tile.layout; + + this._params = { + maxColumns: tile.layout.length > 3 ? 3 : tile.layout.length, + imageHeight: 155, + imageWidth: 155, + styles: tile.layout + }; + let layoutsFrame = new PW.FrameBox(); + let layoutsRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false, + }) + layoutsRow._grid.orientation = Gtk.Orientation.VERTICAL; + layoutsFrame.add(layoutsRow); + let buttonBox = new Gtk.Box({ + spacing: 10 + }); + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: false, + halign: Gtk.Align.END + }); + applyButton.connect('clicked', ()=> { + let selectedBox = this._tileGrid.get_selected_children(); + this.index = selectedBox[0].get_child().layout; + this._tileGrid.unselect_all(); + applyButton.set_sensitive(false); + this.emit('menu-layout-response', -10); + }); + let backButton = new PW.Button({ + icon_name: 'go-previous-symbolic', + title: _("Back"), + icon_first: true, + halign: Gtk.Align.START + }); + backButton.connect('clicked', ()=> { + this.emit('menu-layout-response', -20); + }); + buttonBox.append(backButton); + let chooseNewLayoutLabel = new Gtk.Label({ + label: "" + _("%s Menu Layouts", this.title).format(this.title) + "", + use_markup: true, + halign: Gtk.Align.CENTER, + hexpand: true + }); + buttonBox.append(chooseNewLayoutLabel); + buttonBox.append(applyButton); + applyButton.set_sensitive(false); + + this.mainBox.append(buttonBox); + this.mainBox.append(layoutsFrame); + this._tileGrid = new PW.TileGrid(this._params.maxColumns); + + this._params.styles.forEach((style) => { + this._addTile(style.TITLE, style.IMAGE, style.LAYOUT); + }); + + layoutsRow.add(this._tileGrid); + + this._tileGrid.connect('selected-children-changed', () => { + applyButton.set_sensitive(true); + }); + + this._tileGrid.set_selection_mode(Gtk.SelectionMode.NONE); + } + + + enableSelectionMode(){ + this._tileGrid.set_selection_mode(Gtk.SelectionMode.SINGLE); + } + + _addTile(name, image, layout) { + let tile = new PW.Tile(name, image, this._params.imageWidth, this._params.imageHeight, layout); + this._tileGrid.insert(tile, -1); + } +}); + +var MenuSettingsGeneralPage = GObject.registerClass( + class Arc_Menu_MenuSettingsGeneralPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.heightValue = this._settings.get_int('menu-height'); + this.widthValue = this._settings.get_int('menu-width-adjustment'); + this.rightPanelWidth = this._settings.get_int('right-panel-width'); + this.menuWidth = this._settings.get_int('menu-width'); + this.forcedMenuLocation = this._settings.get_enum('force-menu-location'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.appDescriptions = this._settings.get_boolean('apps-show-extra-details'); + this.categoryIconType = this._settings.get_enum('category-icon-type'); + this.shortcutsIconType = this._settings.get_enum('shortcut-icon-type'); + + let menuSizeFrame = new PW.FrameBox(); + //find the greatest screen height of all monitors + //use that value to set Menu Height cap + let display = Gdk.Display.get_default(); + let monitors = display.get_monitors(); + let nMonitors = monitors.get_n_items(); + let greatestHeight = 0; + let scaleFactor = 1; + for (let i = 0; i < nMonitors; i++) { + let monitor = monitors.get_item(i); + let monitorHeight = monitor.get_geometry().height; + if(monitorHeight > greatestHeight){ + scaleFactor = monitor.get_scale_factor(); + greatestHeight = monitorHeight; + } + } + let monitorHeight = greatestHeight * scaleFactor; + monitorHeight = Math.round((monitorHeight * 8) / 10); + + let menuSizeHeaderLabel = new Gtk.Label({ + label: "" + _("Menu Size") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(menuSizeHeaderLabel); + + this.mainBox.append(menuSizeFrame); + let heightRow = new PW.FrameBoxRow(); + let heightLabel = new Gtk.Label({ + label: _('Height'), + use_markup: true, + xalign: 0, + hexpand: false, + selectable: false + }); + let hscale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: monitorHeight, + step_increment: 10, + page_increment: 10, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + hscale.set_value(this.heightValue); + hscale.connect('value-changed', () => { + this.heightValue = hscale.get_value(); + if(hSpinButton.value !== this.heightValue) + hSpinButton.set_value(this.heightValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let hSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 300, upper: monitorHeight, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + hSpinButton.set_value(this.heightValue); + hSpinButton.connect('value-changed', () => { + this.heightValue = hSpinButton.get_value(); + if(hscale.value !== this.heightValue) + hscale.set_value(this.heightValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + heightRow.add(heightLabel); + heightRow.add(hscale); + heightRow.add(hSpinButton); + menuSizeFrame.add(heightRow); + + let menuWidthTwoPanelsHeaderRow = new PW.FrameBoxRow(); + let menuWidthTwoPanelsHeaderLabel = new Gtk.Label({ + label: _("Traditional Layouts Width"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false, + sensitive: false + }); + menuWidthTwoPanelsHeaderRow.add(menuWidthTwoPanelsHeaderLabel) + menuSizeFrame.add(menuWidthTwoPanelsHeaderRow); + + let menuWidthRow = new PW.FrameBoxRow(); + menuWidthRow._grid.margin_start = 25; + let menuWidthLabel = new Gtk.Label({ + label: _('Left-Panel'), + xalign:0, + hexpand: false, + }); + let menuWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 175, upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuWidthScale.set_value(this.menuWidth); + menuWidthScale.connect('value-changed', () => { + this.menuWidth = menuWidthScale.get_value(); + if(menuWidthSpinButton.value !== this.menuWidth) + menuWidthSpinButton.set_value(this.menuWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let menuWidthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 175, upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + menuWidthSpinButton.set_value(this.menuWidth); + menuWidthSpinButton.connect('value-changed', () => { + this.menuWidth = menuWidthSpinButton.get_value(); + if(menuWidthScale.value !== this.menuWidth) + menuWidthScale.set_value(this.menuWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + menuWidthRow.add(menuWidthLabel); + menuWidthRow.add(menuWidthScale); + menuWidthRow.add( menuWidthSpinButton); + menuSizeFrame.add(menuWidthRow); + + let rightPanelWidthRow = new PW.FrameBoxRow(); + rightPanelWidthRow._grid.margin_start = 25; + let rightPanelWidthLabel = new Gtk.Label({ + label: _('Right-Panel'), + xalign:0, + hexpand: false, + }); + let rightPanelWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 200,upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + rightPanelWidthScale.set_value(this.rightPanelWidth); + rightPanelWidthScale.connect('value-changed', () => { + this.rightPanelWidth = rightPanelWidthScale.get_value(); + if(rightPanelWidthSpinButton.value !== this.rightPanelWidth) + rightPanelWidthSpinButton.set_value(this.rightPanelWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let rightPanelWidthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 200,upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + rightPanelWidthSpinButton.set_value(this.rightPanelWidth); + rightPanelWidthSpinButton.connect('value-changed', () => { + this.rightPanelWidth = rightPanelWidthSpinButton.get_value(); + if(rightPanelWidthScale.value !== this.rightPanelWidth) + rightPanelWidthScale.set_value(this.rightPanelWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + rightPanelWidthRow.add(rightPanelWidthLabel); + rightPanelWidthRow.add(rightPanelWidthScale); + rightPanelWidthRow.add(rightPanelWidthSpinButton); + menuSizeFrame.add(rightPanelWidthRow); + + let otherWidthHeaderRow = new PW.FrameBoxRow(); + let otherWidthHeaderLabel = new Gtk.Label({ + label: _("Non-Traditional Layouts Width"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false, + sensitive: false + }); + otherWidthHeaderRow.add(otherWidthHeaderLabel) + menuSizeFrame.add(otherWidthHeaderRow); + + let widthRow = new PW.FrameBoxRow(); + widthRow._grid.margin_start = 25; + let widthLabel = new Gtk.Label({ + label: _('Width Offset'), + use_markup: true, + xalign: 0, + hexpand: false, + selectable: false + }); + let widthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -350, + upper: 600, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + widthScale.add_mark(0, Gtk.PositionType.BOTTOM, _("Default")); + widthScale.set_value(this.widthValue); + widthScale.connect('value-changed', (widget) => { + this.widthValue = widget.get_value(); + if(widthSpinButton.value !== this.widthValue) + widthSpinButton.set_value(this.widthValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let widthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: -350, upper: 600, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + valign: Gtk.Align.START + }); + widthSpinButton.set_value(this.widthValue); + widthSpinButton.connect('value-changed', () => { + this.widthValue = widthSpinButton.get_value(); + if(widthScale.value !== this.widthValue) + widthScale.set_value(this.widthValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + widthRow.add(widthLabel); + widthRow.add(widthScale); + widthRow.add(widthSpinButton); + menuSizeFrame.add(widthRow); + + let iconsSizeFrame = new PW.FrameBox(); + let menuItemSizeHeaderLabel = new Gtk.Label({ + label: "" + _("Menu Items Icon Size") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(menuItemSizeHeaderLabel); + + let gridIconsSizeRow = new PW.FrameBoxRow(); + let gridIconsSizeLabel = new Gtk.Label({ + label: _("Grid Icons"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.gridIconsSizeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + this.gridIconsSizeCombo.append("Default", _("Default")); + this.gridIconsSizeCombo.append("Small", _("Small") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Medium", _("Medium") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Large", _("Large") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Small Rect", _("Small") + " - " + _("Wide")); + this.gridIconsSizeCombo.append("Medium Rect", _("Medium") + " - " + _("Wide")); + this.gridIconsSizeCombo.append("Large Rect", _("Large") + " - " + _("Wide")); + this.gridIconsSizeCombo.set_active(this._settings.get_enum('menu-item-grid-icon-size')); + this.gridIconsSizeCombo.connect('changed', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + gridIconsSizeRow.add(gridIconsSizeLabel); + gridIconsSizeRow.add(this.gridIconsSizeCombo); + iconsSizeFrame.add(gridIconsSizeRow); + + [this.menuItemIconSizeCombo, this.menuItemIconSizeRow] = this.createIconSizeRow(_("Categories & Applications"), this._settings.get_enum('menu-item-icon-size')); + iconsSizeFrame.add(this.menuItemIconSizeRow); + [this.buttonIconSizeCombo, this.buttonIconSizeRow] = this.createIconSizeRow(_("Buttons"), this._settings.get_enum('button-item-icon-size')); + iconsSizeFrame.add(this.buttonIconSizeRow); + [this.quicklinksIconSizeCombo, this.quicklinksIconSizeRow] = this.createIconSizeRow(_("Quick Links"), this._settings.get_enum('quicklinks-item-icon-size')); + iconsSizeFrame.add(this.quicklinksIconSizeRow); + [this.miscIconSizeCombo, this.miscIconSizeRow] = this.createIconSizeRow(_("Misc"), this._settings.get_enum('misc-item-icon-size')); + iconsSizeFrame.add(this.miscIconSizeRow); + + this.mainBox.append(iconsSizeFrame); + + let generalHeaderLabel = new Gtk.Label({ + label: "" + _("General Settings") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(generalHeaderLabel); + + let generalSettingsFrame = new PW.FrameBox(); + let menuLocationRow = new PW.FrameBoxRow(); + let menuLocationLabel = new Gtk.Label({ + label: _('Override Menu Location'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let menuLocationCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + menuLocationCombo.append_text(_("Off")); + menuLocationCombo.append_text(_("Top Centered")); + menuLocationCombo.append_text(_("Bottom Centered")); + menuLocationCombo.set_active(this._settings.get_enum('force-menu-location')); + menuLocationCombo.connect('changed', (widget) => { + this.forcedMenuLocation = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + menuLocationRow.add(menuLocationLabel); + menuLocationRow.add(menuLocationCombo); + generalSettingsFrame.add(menuLocationRow); + this.mainBox.append(generalSettingsFrame); + + let appDescriptionsRow = new PW.FrameBoxRow(); + let appDescriptionsLabel = new Gtk.Label({ + label: _("Show Application Descriptions"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let appDescriptionsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + appDescriptionsSwitch.set_active(this.appDescriptions); + appDescriptionsSwitch.connect('notify::active', (widget) => { + this.appDescriptions = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appDescriptionsRow.add(appDescriptionsLabel); + appDescriptionsRow.add(appDescriptionsSwitch); + generalSettingsFrame.add(appDescriptionsRow); + + let categoryIconTypeRow = new PW.FrameBoxRow(); + let categoryIconTypeLabel = new Gtk.Label({ + label: _('Category Icon Type'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let categoryIconTypeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + categoryIconTypeCombo.append_text(_("Full Color")); + categoryIconTypeCombo.append_text(_("Symbolic")); + categoryIconTypeCombo.set_active(this.categoryIconType); + categoryIconTypeCombo.connect('changed', (widget) => { + this.categoryIconType = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + categoryIconTypeRow.add(categoryIconTypeLabel); + categoryIconTypeRow.add(categoryIconTypeCombo); + generalSettingsFrame.add(categoryIconTypeRow); + + let shortcutsIconTypeRow = new PW.FrameBoxRow(); + let shortcutsIconTypeLabel = new Gtk.Label({ + label: _('Shortcuts Icon Type'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let shortcutsIconTypeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + shortcutsIconTypeCombo.append_text(_("Full Color")); + shortcutsIconTypeCombo.append_text(_("Symbolic")); + shortcutsIconTypeCombo.set_active(this.shortcutsIconType); + shortcutsIconTypeCombo.connect('changed', (widget) => { + this.shortcutsIconType = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + shortcutsIconTypeRow.add(shortcutsIconTypeLabel); + shortcutsIconTypeRow.add(shortcutsIconTypeCombo); + generalSettingsFrame.add(shortcutsIconTypeRow); + + let vertSeparatorRow = new PW.FrameBoxRow(); + let vertSeparatorLabel = new Gtk.Label({ + label: _('Enable Vertical Separator'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let vertSeparatorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + vertSeparatorSwitch.set_active(this.verticalSeparator); + vertSeparatorSwitch.connect('notify::active', (widget) => { + this.verticalSeparator = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + vertSeparatorRow.add(vertSeparatorLabel); + vertSeparatorRow.add(vertSeparatorSwitch); + generalSettingsFrame.add(vertSeparatorRow); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.heightValue = this._settings.get_default_value('menu-height').unpack(); + this.widthValue = this._settings.get_default_value('menu-width-adjustment').unpack(); + this.rightPanelWidth = this._settings.get_default_value('right-panel-width').unpack(); + this.menuWidth = this._settings.get_default_value('menu-width').unpack(); + this.verticalSeparator = this._settings.get_default_value('vert-separator').unpack(); + this.appDescriptions = this._settings.get_default_value('apps-show-extra-details').unpack(); + this.categoryIconType = 0; + this.shortcutsIconType = 1; + this.forcedMenuLocation = 0; + hscale.set_value(this.heightValue); + widthScale.set_value(this.widthValue); + menuWidthScale.set_value(this.menuWidth); + rightPanelWidthScale.set_value(this.rightPanelWidth); + vertSeparatorSwitch.set_active(this.verticalSeparator); + this.gridIconsSizeCombo.set_active(0); + this.menuItemIconSizeCombo.set_active(0); + this.buttonIconSizeCombo.set_active(0); + this.quicklinksIconSizeCombo.set_active(0); + this.miscIconSizeCombo.set_active(0); + appDescriptionsSwitch.set_active(this.appDescriptions); + menuLocationCombo.set_active(this.forcedMenuLocation); + categoryIconTypeCombo.set_active(0); + shortcutsIconTypeCombo.set_active(1); + + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_int('menu-height', this.heightValue); + this._settings.set_int('menu-width-adjustment', this.widthValue); + this._settings.set_int('right-panel-width', this.rightPanelWidth); + this._settings.set_int('menu-width', this.menuWidth); + this._settings.set_enum('force-menu-location', this.forcedMenuLocation); + this._settings.set_boolean('vert-separator', this.verticalSeparator); + this._settings.set_enum('menu-item-icon-size', this.menuItemIconSizeCombo.get_active()); + this._settings.set_enum('menu-item-grid-icon-size', this.gridIconsSizeCombo.get_active()); + this._settings.set_enum('button-item-icon-size', this.buttonIconSizeCombo.get_active()); + this._settings.set_enum('quicklinks-item-icon-size', this.quicklinksIconSizeCombo.get_active()); + this._settings.set_enum('misc-item-icon-size', this.miscIconSizeCombo.get_active()); + this._settings.set_boolean('reload-theme', true); + this._settings.set_boolean('apps-show-extra-details', this.appDescriptions); + this._settings.set_enum('category-icon-type', this.categoryIconType); + this._settings.set_enum('shortcut-icon-type', this.shortcutsIconType); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + createIconSizeRow(title, iconSizeEnum){ + let iconsSizeRow = new PW.FrameBoxRow(); + let iconsSizeLabel = new Gtk.Label({ + label: _(title), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let iconSizeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + iconSizeCombo.append("Default", _("Default")); + iconSizeCombo.append("ExtraSmall", _("Extra Small")); + iconSizeCombo.append("Small", _("Small")); + iconSizeCombo.append("Medium", _("Medium")); + iconSizeCombo.append("Large", _("Large")); + iconSizeCombo.append("ExtraLarge", _("Extra Large")); + iconSizeCombo.set_active(iconSizeEnum); + iconSizeCombo.connect('changed', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + iconsSizeRow.add(iconsSizeLabel); + iconsSizeRow.add(iconSizeCombo); + return [iconSizeCombo, iconsSizeRow]; + } + + checkIfResetButtonSensitive(){ + return ( + this.heightValue !== this._settings.get_default_value('menu-height').unpack() || + this.widthValue !== this._settings.get_default_value('menu-width-adjustment').unpack() || + this.rightPanelWidth !== this._settings.get_default_value('right-panel-width').unpack() || + this.menuWidth !== this._settings.get_default_value('menu-width').unpack() || + this.forcedMenuLocation !== 0 || + this.verticalSeparator !== this._settings.get_default_value('vert-separator').unpack() || + this.gridIconsSizeCombo.get_active() !== 0 || + this.menuItemIconSizeCombo.get_active() !== 0 || + this.buttonIconSizeCombo.get_active() !== 0 || + this.quicklinksIconSizeCombo.get_active() !== 0 || + this.miscIconSizeCombo.get_active() !== 0 || + this.appDescriptions !== this._settings.get_default_value('apps-show-extra-details').unpack() || + this.categoryIconType !== 0 || + this.shortcutsIconType !== 1 ) ? true : false + } +}); + +var MenuSettingsFineTunePage = GObject.registerClass( + class Arc_Menu_MenuSettingsFineTunePage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.disableFadeEffect = this._settings.get_boolean('disable-scrollview-fade-effect'); + this.gapAdjustment = this._settings.get_int('gap-adjustment'); + this.removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + this.disableSearchStyle = this._settings.get_boolean('disable-searchbox-border'); + this.alphabetizeAllPrograms = this._settings.get_boolean('alphabetize-all-programs') + this.multiLinedLabels = this._settings.get_boolean('multi-lined-labels'); + this.disableTooltips = this._settings.get_boolean('disable-tooltips'); + this.subMenus = this._settings.get_boolean('enable-sub-menus'); + this.showHiddenRecentFiles = this._settings.get_boolean('show-hidden-recent-files'); + + let searchStyleFrame = new PW.FrameBox(); + let searchStyleRow = new PW.FrameBoxRow(); + let searchStyleLabel = new Gtk.Label({ + label: _("Disable Searchbox Border"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let searchStyleSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + searchStyleSwitch.set_active(this._settings.get_boolean('disable-searchbox-border')); + searchStyleSwitch.connect('notify::active', (widget) => { + this.disableSearchStyle = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + searchStyleRow.add(searchStyleLabel); + searchStyleRow.add(searchStyleSwitch); + searchStyleFrame.add(searchStyleRow); + this.mainBox.append(searchStyleFrame); + + let tweakStyleFrame = new PW.FrameBox(); + let tweakStyleRow = new PW.FrameBoxRow(); + let tweakStyleLabel = new Gtk.Label({ + label: _("Disable Menu Arrow"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let tweakStyleSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + tweakStyleSwitch.set_active(this._settings.get_boolean('remove-menu-arrow')); + tweakStyleSwitch.connect('notify::active', (widget) => { + this.removeMenuArrow = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + tweakStyleRow.add(tweakStyleLabel); + tweakStyleRow.add(tweakStyleSwitch); + tweakStyleFrame.add(tweakStyleRow); + this.mainBox.append(tweakStyleFrame); + + let fadeEffectFrame = new PW.FrameBox(); + let fadeEffectRow = new PW.FrameBoxRow(); + let fadeEffectLabel = new Gtk.Label({ + label: _("Disable ScrollView Fade Effects"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let fadeEffectSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + fadeEffectSwitch.set_active(this._settings.get_boolean('disable-scrollview-fade-effect')); + fadeEffectSwitch.connect('notify::active', (widget) => { + this.disableFadeEffect = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + fadeEffectRow.add(fadeEffectLabel); + fadeEffectRow.add(fadeEffectSwitch); + fadeEffectFrame.add(fadeEffectRow); + this.mainBox.append(fadeEffectFrame); + + let tooltipFrame = new PW.FrameBox(); + let tooltipRow = new PW.FrameBoxRow(); + let tooltipLabel = new Gtk.Label({ + label: _("Disable Tooltips"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let tooltipSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + tooltipSwitch.set_active(this.disableTooltips); + tooltipSwitch.connect('notify::active', (widget) => { + this.disableTooltips = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + tooltipRow.add(tooltipLabel); + tooltipRow.add(tooltipSwitch); + tooltipFrame.add(tooltipRow); + this.mainBox.append(tooltipFrame); + + let alphabetizeAllProgramsFrame = new PW.FrameBox(); + let alphabetizeAllProgramsRow = new PW.FrameBoxRow(); + let alphabetizeAllProgramsLabel = new Gtk.Label({ + label: _("Alphabetize 'All Programs' Category"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let alphabetizeAllProgramsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + alphabetizeAllProgramsSwitch.set_active(this._settings.get_boolean('alphabetize-all-programs')); + alphabetizeAllProgramsSwitch.connect('notify::active', (widget) => { + this.alphabetizeAllPrograms = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + alphabetizeAllProgramsRow.add(alphabetizeAllProgramsLabel); + alphabetizeAllProgramsRow.add(alphabetizeAllProgramsSwitch); + alphabetizeAllProgramsFrame.add(alphabetizeAllProgramsRow); + this.mainBox.append(alphabetizeAllProgramsFrame); + + let subMenusFrame = new PW.FrameBox(); + let subMenusRow = new PW.FrameBoxRow(); + let subMenusLabel = new Gtk.Label({ + label: _('Category Sub Menus'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let subMenusSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + subMenusSwitch.set_active(this.subMenus); + subMenusSwitch.connect('notify::active', (widget) => { + this.subMenus = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + subMenusRow.add(subMenusLabel); + subMenusRow.add(subMenusSwitch); + subMenusFrame.add(subMenusRow); + this.mainBox.append(subMenusFrame); + + let hiddenFilesFrame = new PW.FrameBox(); + let hiddenFilesRow = new PW.FrameBoxRow(); + let hiddenFilesLabel = new Gtk.Label({ + label: _('Show Hidden Recent Files'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let hiddenFilesSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + hiddenFilesSwitch.set_active(this.showHiddenRecentFiles); + hiddenFilesSwitch.connect('notify::active', (widget) => { + this.showHiddenRecentFiles = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + hiddenFilesRow.add(hiddenFilesLabel); + hiddenFilesRow.add(hiddenFilesSwitch); + hiddenFilesFrame.add(hiddenFilesRow); + this.mainBox.append(hiddenFilesFrame); + + let multiLinedLabelFrame = new PW.FrameBox(); + let multiLinedLabelRow = new PW.FrameBoxRow(); + let multiLinedLabelLabel = new Gtk.Label({ + label: _("Multi-Lined Labels"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let multiLinedLabelSwitch = new Gtk.Switch({ halign: Gtk.Align.END, vexpand: false, valign: Gtk.Align.CENTER }); + multiLinedLabelSwitch.set_active(this._settings.get_boolean('multi-lined-labels')); + multiLinedLabelSwitch.connect('notify::active', (widget) => { + this.multiLinedLabels = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + let multiLinedLabelInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + multiLinedLabelInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Multi-Lined Labels"), + secondaryText: _('Enable/Disable multi-lined labels on large application icon layouts.'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + multiLinedLabelRow.add(multiLinedLabelLabel); + multiLinedLabelRow.add(multiLinedLabelSwitch); + multiLinedLabelRow.add(multiLinedLabelInfoButton); + multiLinedLabelFrame.add(multiLinedLabelRow); + this.mainBox.append(multiLinedLabelFrame); + + let gapAdjustmentFrame = new PW.FrameBox(); + let gapAdjustmentRow = new PW.FrameBoxRow(); + let gapAdjustmentLabel = new Gtk.Label({ + label: _('Gap Adjustment'), + xalign:0, + hexpand: false, + }); + let gapAdjustmentScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -1, upper: 20, step_increment: 1, page_increment: 1, page_size: 0 + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT, + draw_value: true, + }); + gapAdjustmentScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + gapAdjustmentScale.set_value(this.gapAdjustment); + gapAdjustmentScale.connect('value-changed', () => { + this.gapAdjustment = gapAdjustmentScale.get_value(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let gapAdjustmentInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + gapAdjustmentInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Adjust the gap between the ArcMenu button and the menu."), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + gapAdjustmentRow.add(gapAdjustmentLabel); + gapAdjustmentRow.add(gapAdjustmentScale); + gapAdjustmentRow.add(gapAdjustmentInfoButton); + gapAdjustmentFrame.add(gapAdjustmentRow); + this.mainBox.append(gapAdjustmentFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.gapAdjustment = this._settings.get_default_value('gap-adjustment').unpack(); + this.removeMenuArrow = this._settings.get_default_value('remove-menu-arrow').unpack(); + this.disableSearchStyle = this._settings.get_default_value('disable-searchbox-border').unpack(); + this.alphabetizeAllPrograms = this._settings.get_default_value('alphabetize-all-programs').unpack(); + this.multiLinedLabels = this._settings.get_default_value('multi-lined-labels').unpack(); + this.subMenus = this._settings.get_default_value('enable-sub-menus').unpack(); + this.showHiddenRecentFiles = this._settings.get_default_value('show-hidden-recent-files').unpack(); + this.disableTooltips = this._settings.get_default_value('disable-tooltips').unpack(); + this.disableFadeEffect = this._settings.get_default_value('disable-scrollview-fade-effect').unpack(); + alphabetizeAllProgramsSwitch.set_active(this.alphabetizeAllPrograms); + gapAdjustmentScale.set_value(this.gapAdjustment); + searchStyleSwitch.set_active(this.disableSearchStyle); + tweakStyleSwitch.set_active(this.removeMenuArrow); + multiLinedLabelSwitch.set_active(this.multiLinedLabels); + tooltipSwitch.set_active(this.disableTooltips); + subMenusSwitch.set_active(this.subMenus); + hiddenFilesSwitch.set_active(this.showHiddenRecentFiles); + fadeEffectSwitch.set_active(this.disableFadeEffect); + + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_int('gap-adjustment', this.gapAdjustment); + this._settings.set_boolean('remove-menu-arrow', this.removeMenuArrow); + this._settings.set_boolean('disable-searchbox-border', this.disableSearchStyle); + this._settings.set_boolean('alphabetize-all-programs', this.alphabetizeAllPrograms); + this._settings.set_boolean('multi-lined-labels', this.multiLinedLabels); + this._settings.set_boolean('disable-scrollview-fade-effect', this.disableFadeEffect); + this._settings.set_boolean('disable-tooltips', this.disableTooltips); + this._settings.set_boolean('enable-sub-menus', this.subMenus); + this._settings.set_boolean('show-hidden-recent-files', this.showHiddenRecentFiles); + this._settings.set_boolean('reload-theme', true); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.subMenus !== this._settings.get_default_value('enable-sub-menus').unpack() || + this.disableTooltips !== this._settings.get_default_value('disable-tooltips').unpack() || + this.gapAdjustment !== this._settings.get_default_value('gap-adjustment').unpack() || + this.removeMenuArrow !== this._settings.get_default_value('remove-menu-arrow').unpack() || + this.disableSearchStyle !== this._settings.get_default_value('disable-searchbox-border').unpack()|| + this.alphabetizeAllPrograms !== this._settings.get_default_value('alphabetize-all-programs').unpack()|| + this.multiLinedLabels !== this._settings.get_default_value('multi-lined-labels').unpack() || + this.disableFadeEffect !== this._settings.get_default_value('disable-scrollview-fade-effect').unpack() || + this.showHiddenRecentFiles !== this._settings.get_default_value('show-hidden-recent-files').unpack()) ? true : false; + } +}); + +var MenuSettingsNewAppsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsNewAppsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.disableRecentApps = this._settings.get_boolean('disable-recently-installed-apps'); + this.indicatorColor = this._settings.get_string('indicator-color'); + this.indicatorTextColor = this._settings.get_string('indicator-text-color'); + + let recentAppsFrame = new PW.FrameBox(); + let recentAppsRow = new PW.FrameBoxRow(); + let recentAppsLabel = new Gtk.Label({ + label: _("Disable New Apps Tracker"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let recentAppsSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + + recentAppsSwitch.connect('notify::active', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + this.disableRecentApps = widget.get_active(); + + if(widget.get_active()){ + appIndicatorColorFrame.hide(); + recentlyInstalledInfoLabel.hide(); + clearRecentAppsFrame.hide(); + } + else{ + appIndicatorColorFrame.show(); + recentlyInstalledInfoLabel.show(); + clearRecentAppsFrame.show(); + this.mainBox.show(); + } + this._settings.set_boolean('disable-recently-installed-apps', widget.get_active()); + }); + + recentAppsSwitch.set_active(this._settings.get_boolean('disable-recently-installed-apps')); + + recentAppsRow.add(recentAppsLabel); + recentAppsRow.add(recentAppsSwitch); + recentAppsFrame.add(recentAppsRow); + this.mainBox.append(recentAppsFrame); + + let appIndicatorColorFrame = new PW.FrameBox(); + let recentlyInstalledInfoLabel = new Gtk.Label({ + label: "" + _("Customize New Apps Indicator") + "", + use_markup: true, + xalign: 0, + hexpand: true, + }); + this.mainBox.append(recentlyInstalledInfoLabel); + let appIndicatorColorRow = new PW.FrameBoxRow(); + let appIndicatorColorLabel = new Gtk.Label({ + label: _('Category Indicator Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let appIndicatorColorChooser = new Gtk.ColorButton({ + use_alpha: true, + }); + let color = new Gdk.RGBA(); + color.parse(this.indicatorColor); + appIndicatorColorChooser.set_rgba(color); + appIndicatorColorChooser.connect('color-set', ()=>{ + this.indicatorColor = appIndicatorColorChooser.get_rgba().to_string(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appIndicatorColorRow.add(appIndicatorColorLabel); + appIndicatorColorRow.add(appIndicatorColorChooser); + appIndicatorColorFrame.add(appIndicatorColorRow); + + let appIndicatorTextColorRow = new PW.FrameBoxRow(); + let appIndicatorTextColorLabel = new Gtk.Label({ + label: _('App Indicator Label Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let appIndicatorTextColorChooser = new Gtk.ColorButton({ + use_alpha: true, + }); + color = new Gdk.RGBA(); + color.parse(this.indicatorTextColor); + appIndicatorTextColorChooser.set_rgba(color); + appIndicatorTextColorChooser.connect('color-set', ()=>{ + this.indicatorTextColor = appIndicatorTextColorChooser.get_rgba().to_string(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appIndicatorTextColorRow.add(appIndicatorTextColorLabel); + appIndicatorTextColorRow.add(appIndicatorTextColorChooser); + appIndicatorColorFrame.add(appIndicatorTextColorRow); + this.mainBox.append(appIndicatorColorFrame); + + let clearRecentAppsFrame = new PW.FrameBox(); + let clearRecentAppsRow = new PW.FrameBoxRow(); + let clearRecentAppsLabel = new Gtk.Label({ + label: _("Clear Apps Marked 'New'"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let clearRecentAppsButton = new Gtk.Button({ + halign: Gtk.Align.END, + label: _("Clear All"), + }); + let sensitive = this._settings.get_strv('recently-installed-apps').length > 0; + clearRecentAppsButton.set_sensitive(sensitive); + clearRecentAppsButton.connect('clicked', (widget) => { + clearRecentAppsButton.set_sensitive(false); + this._settings.reset('recently-installed-apps'); + }); + clearRecentAppsRow.add(clearRecentAppsLabel); + clearRecentAppsRow.add(clearRecentAppsButton); + clearRecentAppsFrame.add(clearRecentAppsRow); + this.mainBox.append(clearRecentAppsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.disableRecentApps = this._settings.get_default_value('disable-recently-installed-apps').unpack(); + this.indicatorColor = this._settings.get_default_value('indicator-color').unpack(); + this.indicatorTextColor = this._settings.get_default_value('indicator-text-color').unpack(); + recentAppsSwitch.set_active(this.disableRecentApps); + let color = new Gdk.RGBA(); + color.parse(this.indicatorColor); + appIndicatorColorChooser.set_rgba(color); + color.parse(this.indicatorTextColor); + appIndicatorTextColorChooser.set_rgba(color); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_boolean('disable-recently-installed-apps', this.disableRecentApps); + this._settings.set_string('indicator-color', this.indicatorColor); + this._settings.set_string('indicator-text-color', this.indicatorTextColor); + this._settings.set_boolean('reload-theme', true); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.disableRecentApps !== this._settings.get_default_value('disable-recently-installed-apps').unpack() || + this.indicatorColor !== this._settings.get_default_value('indicator-color').unpack() || + this.indicatorTextColor !== this._settings.get_default_value('indicator-text-color').unpack() + ) ? true : false; + } +}); + +var MenuSettingsSearchOptionsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsSearchOptionsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.searchResultsDetails = this._settings.get_boolean('show-search-result-details'); + this.openWindowsSearchProvider = this._settings.get_boolean('search-provider-open-windows'); + this.recentFilesSearchProvider = this._settings.get_boolean('search-provider-recent-files'); + this.highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + this.maxSearchResults = this._settings.get_int('max-search-results'); + + let searchProvidersFrame = new PW.FrameBox(); + let searchProvidersLabel = new Gtk.Label({ + label: "" + _("Search Providers") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(searchProvidersLabel); + let openWindowsRow = new PW.FrameBoxRow(); + let openWindowsLabel = new Gtk.Label({ + label: _("Search for open windows across all workspaces"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let openWindowsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + openWindowsSwitch.set_active(this.openWindowsSearchProvider); + openWindowsSwitch.connect('notify::active', (widget) => { + this.openWindowsSearchProvider = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + openWindowsRow.add(openWindowsLabel); + openWindowsRow.add(openWindowsSwitch); + searchProvidersFrame.add(openWindowsRow); + + let recentFilesRow = new PW.FrameBoxRow(); + let recentFilesLabel = new Gtk.Label({ + label: _("Search for recent files"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let recentFilesSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + recentFilesSwitch.set_active(this.recentFilesSearchProvider); + recentFilesSwitch.connect('notify::active', (widget) => { + this.recentFilesSearchProvider = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + recentFilesRow.add(recentFilesLabel); + recentFilesRow.add(recentFilesSwitch); + searchProvidersFrame.add(recentFilesRow); + this.mainBox.append(searchProvidersFrame); + + let searchOptionsFrame = new PW.FrameBox(); + let searchOptionsLabel = new Gtk.Label({ + label: "" + _("Search Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(searchOptionsLabel); + let descriptionsRow = new PW.FrameBoxRow(); + let descriptionsLabel = new Gtk.Label({ + label: _("Show descriptions of search results"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let descriptionsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + descriptionsSwitch.set_active(this.searchResultsDetails); + descriptionsSwitch.connect('notify::active', (widget) => { + this.searchResultsDetails = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + descriptionsRow.add(descriptionsLabel); + descriptionsRow.add(descriptionsSwitch); + searchOptionsFrame.add(descriptionsRow); + + let highlightSearchResultRow = new PW.FrameBoxRow(); + let highlightSearchResultLabel = new Gtk.Label({ + label: _("Highlight search result terms"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let highlightSearchResultSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + highlightSearchResultSwitch.set_active(this.highlightSearchResultTerms); + highlightSearchResultSwitch.connect('notify::active', (widget) => { + this.highlightSearchResultTerms = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + highlightSearchResultRow.add(highlightSearchResultLabel); + highlightSearchResultRow.add(highlightSearchResultSwitch); + searchOptionsFrame.add(highlightSearchResultRow); + + let maxSearchResultsRow = new PW.FrameBoxRow(); + let maxSearchResultsLabel = new Gtk.Label({ + label: _('Max Search Results'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let maxSearchResultsScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 2, + upper: 10, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + maxSearchResultsScale.set_value(this.maxSearchResults); + maxSearchResultsScale.connect('value-changed', (widget) => { + this.maxSearchResults = widget.get_value(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + maxSearchResultsRow.add(maxSearchResultsLabel); + maxSearchResultsRow.add(maxSearchResultsScale); + searchOptionsFrame.add( maxSearchResultsRow); + this.mainBox.append(searchOptionsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.searchResultsDetails = this._settings.get_default_value('show-search-result-details').unpack(); + this.openWindowsSearchProvider = this._settings.get_default_value('search-provider-open-windows').unpack(); + this.recentFilesSearchProvider = this._settings.get_default_value('search-provider-recent-files').unpack(); + this.highlightSearchResultTerms = this._settings.get_default_value('highlight-search-result-terms').unpack(); + this.maxSearchResults = this._settings.get_default_value('max-search-results').unpack(); + descriptionsSwitch.set_active(this.searchResultsDetails); + openWindowsSwitch.set_active(this.openWindowsSearchProvider); + highlightSearchResultSwitch.set_active(this.highlightSearchResultTerms); + maxSearchResultsScale.set_value(this.maxSearchResults); + recentFilesSwitch.set_active(this.recentFilesSearchProvider); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_boolean('show-search-result-details', this.searchResultsDetails); + this._settings.set_boolean('search-provider-open-windows', this.openWindowsSearchProvider); + this._settings.set_boolean('search-provider-recent-files', this.recentFilesSearchProvider); + this._settings.set_boolean('highlight-search-result-terms', this.highlightSearchResultTerms); + this._settings.set_int('max-search-results', this.maxSearchResults); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.searchResultsDetails !== this._settings.get_default_value('show-search-result-details').unpack() || + this.openWindowsSearchProvider !== this._settings.get_default_value('search-provider-open-windows').unpack() || + this.recentFilesSearchProvider !== this._settings.get_default_value('search-provider-recent-files').unpack() || + this.highlightSearchResultTerms !== this._settings.get_default_value('highlight-search-result-terms').unpack() || + this.maxSearchResults !== this._settings.get_default_value('max-search-results').unpack()) ? true : false; + } +}); + +var MenuSettingsCategoriesPage = GObject.registerClass( + class Arc_Menu_MenuSettingsCategoriesPage extends Gtk.Box { + _init(settings, settingType) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.settingType = settingType; + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.categoriesFrame = new PW.FrameBox(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._createFrame(this._settings.get_value(this.settingType).deep_unpack()); + this.mainBox.append(this.categoriesFrame); + + this.buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + this.categoriesFrame.remove_all_children(); + this._createFrame(this._settings.get_default_value(this.settingType).deep_unpack()); + this.categoriesFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < this.categoriesFrame.count; i++) { + let frame = this.categoriesFrame.get_index(i); + array.push([frame._enum, frame._shouldShow]); + } + this._settings.set_value(this.settingType, new GLib.Variant('a(ib)', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + this.buttonRow.append(this.resetButton); + this.buttonRow.append(this.saveButton); + this.append(this.buttonRow); + } + + getSensitive(){ + let defaultExtraCategories = this._settings.get_default_value(this.settingType).deep_unpack(); + let currentExtraCategories = this._settings.get_value(this.settingType).deep_unpack(); + return !Utils.getArraysEqual(defaultExtraCategories, currentExtraCategories); + } + + _createFrame(extraCategories){ + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let name = Constants.Categories[categoryEnum].NAME; + + let frameRow = new PW.FrameBoxDragRow(this); + frameRow._enum = extraCategories[i][0]; + frameRow._shouldShow = extraCategories[i][1]; + frameRow._name = Constants.Categories[categoryEnum].NAME; + frameRow._gicon = Gio.icon_new_for_string(Constants.Categories[categoryEnum].ICON); + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + frameRow.hasSwitch = true; + frameRow.switchActive = frameRow._shouldShow; + + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(name), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.categoriesFrame, + buttons: [this.saveButton, this.resetButton], + }); + + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + }); + + modifyButton.set_active(frameRow._shouldShow); + modifyButton.connect('notify::active', ()=> { + frameRow._shouldShow = modifyButton.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + buttonBox.insert_column(0); + buttonBox.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + buttonBox.insert_column(0); + buttonBox.attach(modifyButton, 0, 0, 1, 1); + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + this.categoriesFrame.add(frameRow); + } + } +}); + +var ColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ColorThemeDialogWindow extends PW.DialogWindow { + _init(settings, parent, themeName="") { + this._settings = settings; + this.addResponse = false; + this.themeName = themeName; + super._init(_('Color Theme Name'), parent); + } + + _createLayout(vbox) { + let nameFrameRow = new PW.FrameBoxRow(); + let nameFrameLabel = new Gtk.Label({ + label: _('Name:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + nameFrameRow.add(nameFrameLabel); + this.nameEntry = new Gtk.Entry(); + this.nameEntry.set_width_chars(35); + + nameFrameRow.add(this.nameEntry); + this.nameEntry.grab_focus(); + if(this.themeName!=""){ + this.nameEntry.set_text(this.themeName); + } + this.nameEntry.connect('changed',()=>{ + if(this.nameEntry.get_text().length > 0) + saveButton.set_sensitive(true); + else + saveButton.set_sensitive(false); + }); + + vbox.append(nameFrameRow); + let saveButton = new Gtk.Button({ + label: _("Save Theme"), + halign: Gtk.Align.END + }); + saveButton.set_sensitive(false); + saveButton.connect('clicked', ()=> { + this.themeName = this.nameEntry.get_text(); + this.addResponse=true; + this.response(-10); + }); + vbox.append(saveButton); + } + get_response(){ + return this.addResponse; + } +}); + +var ExportColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ExportColorThemeDialogWindow extends PW.DialogWindow { + + _init(settings, parent, themes=null) { + this._settings = settings; + this._themes = themes; + this.addResponse = false; + this.selectedThemes = []; + super._init(this._themes ? _('Select Themes to Import'): _('Select Themes to Export'), parent); + } + + _createLayout(vbox) { + vbox.spacing = 0; + this.checkButtonArray = []; + this.shouldToggle =true; + let themesListScrollWindow = new Gtk.ScrolledWindow(); + themesListScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themesListScrollWindow.set_max_content_height(300); + themesListScrollWindow.set_min_content_height(300); + themesListScrollWindow.set_min_content_width(500); + themesListScrollWindow.set_min_content_width(500); + this.mainFrame = new PW.FrameBox(); + + let themesListButton = new Gtk.Button({ + label: this._themes ?_("Import"): _("Export"), + }); + + themesListButton.connect('clicked', () => { + this.addResponse = true; + this.response(-10); + }); + themesListButton.set_halign(Gtk.Align.END); + + themesListScrollWindow.set_child(this.mainFrame); + this.checkAllButton = new Gtk.CheckButton({ + margin_end: 23 + }); + + this.checkAllButton.set_halign(Gtk.Align.END); + this.checkAllButton.set_active(true); + this.checkAllButton.connect('toggled', () => { + let isActive = this.checkAllButton.get_active(); + if(this.shouldToggle){ + for(let i = 0; i< this.checkButtonArray.length; i++){ + this.checkButtonArray[i].set_active(isActive); + } + } + }); + let checkAllRow = new PW.FrameBoxRow(); + let checkAllLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + hexpand: true, + label: _("Select All"), + halign: Gtk.Align.END + }); + checkAllRow.add(checkAllLabel); + checkAllRow.add(this.checkAllButton); + vbox.append(checkAllRow); + vbox.append(themesListScrollWindow); + vbox.append(new PW.FrameBoxRow()); + vbox.append(themesListButton); + + this.color_themes = this._themes ? this._themes : this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i< this.color_themes.length; i++) { + let theme = this.color_themes[i]; + let frameRow = new PW.FrameBoxRow(); + + let themeBox = new Gtk.Box(); + + let frameLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + label: theme[0], + hexpand: true + }); + + let xpm = Utils.createXpmImage(theme[1], theme[2], theme[4], theme[5]); + let presetPreview = new Gtk.Image({ + hexpand: false, + margin_end: 5, + pixel_size: 42 + }); + presetPreview.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_xpm_data(xpm)); + themeBox.append(presetPreview); + themeBox.append(frameLabel); + frameRow.add(themeBox); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', () => { + if(checkButton.get_active()){ + this.selectedThemes.push(theme); + } + else{ + this.shouldToggle = false; + this.checkAllButton.set_active(false); + this.shouldToggle = true; + let index= this.selectedThemes.indexOf(theme); + this.selectedThemes.splice(index,1); + } + }); + this.checkButtonArray.push(checkButton); + frameRow.add(checkButton); + this.mainFrame.add(frameRow); + checkButton.set_active(true); + } + } + get_response(){ + return this.addResponse; + } +}); + +var ManageColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ManageColorThemeDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + this.selectedThemes = []; + super._init( _('Manage Presets'), parent); + } + + _createLayout(vbox) { + let themesListScrollWindow = new Gtk.ScrolledWindow(); + themesListScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themesListScrollWindow.set_max_content_height(300); + themesListScrollWindow.set_min_content_height(300); + themesListScrollWindow.set_min_content_width(500); + themesListScrollWindow.set_min_content_width(500); + this.mainFrame = new PW.FrameBox(); + let buttonRow = new PW.FrameBoxRow(); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + applyButton.set_sensitive(false); + applyButton.connect('clicked', () => { + this.addResponse = true; + this.response(-10); + }); + applyButton.set_halign(Gtk.Align.END); + + themesListScrollWindow.set_child(this.mainFrame); + vbox.append(themesListScrollWindow); + buttonRow.add(applyButton); + vbox.append(buttonRow); + + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i< this.color_themes.length; i++) { + let theme = this.color_themes[i]; + let frameRow = new PW.FrameBoxRow(); + let themeBox = new Gtk.Box(); + + let frameLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + label: theme[0], + hexpand: true + }); + let xpm = Utils.createXpmImage(theme[1], theme[2], theme[4], theme[5]); + let presetPreview = new Gtk.Image({ + hexpand: false, + margin_end: 5, + pixel_size: 42 + }); + presetPreview.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_xpm_data(xpm)); + + themeBox.append(presetPreview); + themeBox.append(frameLabel); + frameRow.add(themeBox); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.mainFrame, + buttons: [applyButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', () => { + let dialog = new ColorThemeDialogWindow(this._settings, this, theme[0]); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()) { + let index = frameRow.get_index(); + let array = [dialog.themeName, theme[1], theme[2], theme[3], theme[4], theme[5], + theme[6], theme[7], theme[8], theme[9], theme[10], theme[11], theme[12]]; + this.color_themes.splice(index,1,array); + theme = array; + frameLabel.label = dialog.themeName; + dialog.destroy(); + } + else + dialog.destroy(); + }); + applyButton.set_sensitive(true); + }); + buttonBox.connect('move-up', () => { + let index = frameRow.get_index(); + if(index > 0){ + this.color_themes.splice(index, 1); + this.color_themes.splice(index - 1, 0, theme); + } + }); + + buttonBox.connect('move-down', () => { + let index = frameRow.get_index(); + if(index + 1 < this.mainFrame.count){ + this.color_themes.splice(index, 1); + this.color_themes.splice(index + 1, 0, theme); + } + }); + + buttonBox.connect('delete', () => { + let index = frameRow.get_index(); + this.color_themes.splice(index, 1); + }); + + frameRow.add(buttonBox); + this.mainFrame.add(frameRow); + } + } + get_response(){ + return this.addResponse; + } +}); + +var OverrideArcMenuThemeWindow = GObject.registerClass({ + Signals: { + 'menu-theme-response': { param_types: [GObject.TYPE_INT] }, + }, +}, + class Arc_Menu_OverrideArcMenuThemeWindow extends Gtk.Box { + _init(settings, parentBox, parentMainBox) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + }); + this.parentBox = parentBox; + this._parentMainBox = parentMainBox; + this._settings = settings; + this.addResponse = false; + this.heightValue = this._settings.get_int('menu-height'); + this.rightPanelWidth = this._settings.get_int('right-panel-width'); + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.customArcMenu = this._settings.get_boolean('enable-custom-arc-menu'); + + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.menuWidth = this._settings.get_int('menu-width'); + this.updatePresetComboBox = true; + this.shouldDeselect = true; + this._createLayout(this); + } + createIconList(store){ + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i= 0; i" + _('Menu Theme Presets') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + vbox.append(colorPresetHeaderLabel); + + this.colorPresetFrame = new PW.FrameBox(); + let colorPresetRow = new PW.FrameBoxRow(); + let colorPresetLabel = new Gtk.Label({ + label: _('Current Menu Theme Preset'), + xalign:0, + hexpand: true, + }); + let store = new Gtk.ListStore(); + store.set_column_types([GdkPixbuf.Pixbuf, GObject.TYPE_STRING]); + this.colorPresetCombo = new Gtk.ComboBox({ + model: store, + }); + + this.createIconList(store); + + let renderer = new Gtk.CellRendererPixbuf({xpad: 5}); + this.colorPresetCombo.pack_start(renderer, false); + this.colorPresetCombo.add_attribute(renderer, "pixbuf", 0); + renderer = new Gtk.CellRendererText(); + this.colorPresetCombo.pack_start(renderer, true); + this.colorPresetCombo.add_attribute(renderer, "text", 1); + + this.saveButton = new Gtk.Button({ + label: _("Save as Preset"), + hexpand: true, + halign: Gtk.Align.END + }); + this.checkIfPresetMatch(); + this.colorPresetCombo.connect('changed', (widget) => { + if(this.updatePresetComboBox){ + let index = widget.get_active(); + /*let defaultArray = ["Theme Name","Background Color", "Foreground Color","Border Color", "Highlight Color", "Hightlight Foreground Color", "Separator Color" + , "Font Size", "Border Size", "Corner Radius", "Arrow Size", "Menu Displacement", "Vertical Separator"];*/ + if(index>=0){ + this.menuColor = this.color_themes[index][1]; + this.menuForegroundColor = this.color_themes[index][2]; + this.borderColor = this.color_themes[index][3]; + this.highlightColor = this.color_themes[index][4]; + this.highlightForegroundColor = this.color_themes[index][5]; + this.separatorColor = this.color_themes[index][6]; + this.fontSize = parseInt(this.color_themes[index][7]); + this.borderSize = parseInt(this.color_themes[index][8]); + this.cornerRadius = parseInt(this.color_themes[index][9]); + this.menuArrowSize = parseInt(this.color_themes[index][10]); + this.menuMargin = parseInt(this.color_themes[index][11]); + this.verticalSeparator = (this.color_themes[index][12] === 'true'); + + this.shouldDeselect = false; + this.presetName=this.color_themes[index][0]; + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + + fontScale.set_value(this.fontSize); + + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + + borderScale.set_value(this.borderSize); + + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + + cornerScale.set_value(this.cornerRadius); + marginScale.set_value(this.menuMargin); + arrowScale.set_value(this.menuArrowSize); + + vertSeparatorSwitch.set_active(this.verticalSeparator); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + this.saveButton.set_sensitive(false); + applyButton.set_sensitive(true); + this.shouldDeselect = true; + resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + } + } + }); + colorPresetRow.add(colorPresetLabel); + colorPresetRow.add(this.colorPresetCombo); + this.colorPresetFrame.add(colorPresetRow); + + let presetsButtonRow = new PW.FrameBoxRow(); + + this.saveButton.connect('clicked', () => { + /*let defaultArray = ["Theme Name","Background Color", "Foreground Color","Border Color", "Highlight Color", "Separator Color" + , "Font Size", "Border Size", "Corner Radius", "Arrow Size", "Menu Displacement", "Vertical Separator"];*/ + let dialog = new ColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let array = [dialog.themeName, this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + this.color_themes.push(array); + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + + let manageButton = new Gtk.Button({ + label: _("Manage Presets") + }); + manageButton.connect('clicked', ()=> { + let dialog = new ManageColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response)=>{ + if(dialog.get_response()){ + this.color_themes = dialog.color_themes; + this._settings.set_value('color-themes',new GLib.Variant('aas',dialog.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + let addButton = new PW.Button({ + title: _("Browse Presets"), + icon_name: "browse-presets-symbolic", + hexpand: false + }); + addButton.connect('clicked', () => { + let settingsFile = Gio.File.new_for_path(Me.path + '/media/misc/ArcMenuDefaultPresets'); + let [ success, content, etags] = settingsFile.load_contents(null); + let string = ByteArray.toString(content); + let themes = string.split("\n") + themes.pop(); //remove last blank array + let colorThemes = []; + for(let i = 0; i < themes.length; i++){ + let array = themes[i].split('//') + array.pop(); + colorThemes.push(array); + } + let dialog = new ExportColorThemeDialogWindow(this._settings, this, colorThemes); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let selectedThemes = dialog.selectedThemes; + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < selectedThemes.length; i++){ + this.color_themes.push(selectedThemes[i]); + } + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + + presetsButtonRow.add(manageButton); + presetsButtonRow.add(addButton); + presetsButtonRow.add(this.saveButton); + this.colorPresetFrame.add(presetsButtonRow); + vbox.append(this.colorPresetFrame); + + this._settings.connect("changed::color-themes", () => { + store.clear(); + this.createIconList(store); + this.colorPresetCombo.model = store; + this.colorPresetCombo.show(); + + this.checkIfPresetMatch(); + }); + + let menuSettingsHeaderLabel = new Gtk.Label({ + label: "" + _('Theme Settings') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + vbox.append(menuSettingsHeaderLabel); + + let themeSettingsFrame = new PW.FrameBox(); + let themeSettingsFrameScrollWindow = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + themeSettingsFrameScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themeSettingsFrameScrollWindow.set_min_content_height(250); + themeSettingsFrameScrollWindow.set_child(themeSettingsFrame); + vbox.append(themeSettingsFrameScrollWindow); + + //ROW 1 - MENU BACKGROUND COLOR-------------------------------------- + let menuBackgroudColorRow = new PW.FrameBoxRow(); + let menuBackgroudColorLabel = new Gtk.Label({ + label: _('Menu Background Color'), + xalign:0, + hexpand: true, + }); + let menuBackgroudColorChooser = new Gtk.ColorButton({use_alpha:true}); + let color = new Gdk.RGBA(); + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + menuBackgroudColorChooser.connect('color-set', () => { + this.menuColor = menuBackgroudColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuBackgroudColorRow.add(menuBackgroudColorLabel); + menuBackgroudColorRow.add(menuBackgroudColorChooser); + themeSettingsFrame.add(menuBackgroudColorRow); + + //ROW 2 - MENU FOREGROUND COLOR-------------------------------------- + let menuForegroundColorRow = new PW.FrameBoxRow(); + let menuForegroundColorLabel = new Gtk.Label({ + label: _('Menu Foreground Color'), + xalign:0, + hexpand: true, + }); + let menuForegroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + menuForegroundColorChooser.connect('color-set', () => { + this.menuForegroundColor = menuForegroundColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuForegroundColorRow.add(menuForegroundColorLabel); + menuForegroundColorRow.add(menuForegroundColorChooser); + themeSettingsFrame.add(menuForegroundColorRow); + + //ROW 3 - FONT SIZE-------------------------------------------------- + let fontSizeRow = new PW.FrameBoxRow(); + let fontSizeLabel = new Gtk.Label({ + label: _('Font Size'), + xalign:0, + hexpand: true, + }); + + let fontScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 8, upper: 14, step_increment: 1, page_increment: 1, page_size: 0 }), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + fontScale.set_format_value_func( (scale, value) => { + return value + "pt"; + }); + fontScale.set_value(this.fontSize); + fontScale.connect('value-changed', () => { + this.fontSize = fontScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + fontSizeRow.add(fontSizeLabel); + fontSizeRow.add(fontScale); + themeSettingsFrame.add(fontSizeRow); + + //ROW 4- Border Color------------------------------------------------- + let borderColorRow = new PW.FrameBoxRow(); + let borderColorLabel = new Gtk.Label({ + label: _('Border Color'), + xalign:0, + hexpand: true, + }); + let borderColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + borderColorChooser.connect('color-set', ()=>{ + this.borderColor = borderColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + borderColorRow.add(borderColorLabel); + borderColorRow.add(borderColorChooser); + themeSettingsFrame.add(borderColorRow); + + //ROW 5 - Border Size------------------------------------------------------- + let borderSizeRow = new PW.FrameBoxRow(); + let borderSizeLabel = new Gtk.Label({ + label: _('Border Size'), + xalign:0, + hexpand: true, + }); + let borderScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 4, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + borderScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + borderScale.set_value(this.borderSize); + borderScale.connect('value-changed', () => { + this.borderSize = borderScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + borderSizeRow.add(borderSizeLabel); + borderSizeRow.add(borderScale); + themeSettingsFrame.add(borderSizeRow); + + //ROW 6 - Active Item Background Color----------------------------------------------- + let itemColorRow = new PW.FrameBoxRow(); + let itemColorLabel = new Gtk.Label({ + label: _('Active Item Background Color'), + xalign:0, + hexpand: true, + }); + let itemColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + itemColorChooser.connect('color-set', () => { + this.highlightColor = itemColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + itemColorRow.add(itemColorLabel); + itemColorRow.add(itemColorChooser); + themeSettingsFrame.add(itemColorRow); + + //ROW 7 - Active Item Foreground Color----------------------------------------------- + let itemForegroundColorRow = new PW.FrameBoxRow(); + let itemForegroundColorLabel = new Gtk.Label({ + label: _('Active Item Foreground Color'), + xalign:0, + hexpand: true, + }); + let itemForegroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + itemForegroundColorChooser.connect('color-set', () => { + this.highlightForegroundColor = itemForegroundColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + itemForegroundColorRow.add(itemForegroundColorLabel); + itemForegroundColorRow.add(itemForegroundColorChooser); + themeSettingsFrame.add(itemForegroundColorRow); + + //ROW 8 - Corner Radius----------------------------------------------------- + let cornerRadiusRow = new PW.FrameBoxRow(); + let cornerRadiusLabel = new Gtk.Label({ + label: _('Corner Radius'), + xalign:0, + hexpand: true, + }); + let cornerScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 20, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + cornerScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + cornerScale.set_value(this.cornerRadius); + cornerScale.connect('value-changed', () => { + this.cornerRadius = cornerScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + cornerRadiusRow.add(cornerRadiusLabel); + cornerRadiusRow.add(cornerScale); + themeSettingsFrame.add(cornerRadiusRow); + + //ROW 9 - Menu Arrow Size------------------------------------------------------- + let menuMarginRow = new PW.FrameBoxRow(); + let menuMarginLabel = new Gtk.Label({ + label: _('Menu Arrow Size'), + xalign:0, + hexpand: true, + }); + let marginScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 30, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + marginScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + marginScale.set_value(this.menuMargin); + marginScale.connect('value-changed', () => { + this.menuMargin = marginScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuMarginRow.add(menuMarginLabel); + menuMarginRow.add(marginScale); + themeSettingsFrame.add(menuMarginRow); + + //ROW 10 - Menu Displacement------------------------------------------------------ + let menuArrowRow = new PW.FrameBoxRow(); + let menuArrowLabel = new Gtk.Label({ + label: _('Menu Displacement'), + xalign:0, + hexpand: true, + }); + let arrowScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 20, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + arrowScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + arrowScale.set_value(this.menuArrowSize); + arrowScale.connect('value-changed', () => { + this.menuArrowSize = arrowScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuArrowRow.add(menuArrowLabel); + menuArrowRow.add(arrowScale); + themeSettingsFrame.add(menuArrowRow); + + //ROW 11 - Vertical Separator------------------------------------------------------ + let vertSeparatorRow = new PW.FrameBoxRow(); + let vertSeparatorLabel = new Gtk.Label({ + label: _('Enable Vertical Separator'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let vertSeparatorSwitch = new Gtk.Switch({ halign: Gtk.Align.END}); + vertSeparatorSwitch.set_active(this.verticalSeparator); + vertSeparatorSwitch.connect('notify::active', (widget) => { + this.verticalSeparator = widget.get_active(); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + applyButton.set_sensitive(true); + resetButton.set_sensitive(true); + }); + vertSeparatorRow.add(vertSeparatorLabel); + vertSeparatorRow.add(vertSeparatorSwitch); + themeSettingsFrame.add(vertSeparatorRow); + + //ROW 12 - Separator Color------------------------------------------------------ + let separatorColorRow = new PW.FrameBoxRow(); + let separatorColorLabel = new Gtk.Label({ + label: _('Separator Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let colorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + colorChooser.connect('color-set', ()=>{ + this.separatorColor = colorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + separatorColorRow.add(separatorColorLabel); + separatorColorRow.add(colorChooser); + themeSettingsFrame.add(separatorColorRow); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this._parentMainBox.buttonRow = buttonRow; + let resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + valign: Gtk.Align.END, + vexpand: false + }); + resetButton.set_sensitive( this.checkIfResetButtonSensitive()); + resetButton.connect('clicked', ()=> { + this.separatorColor = this._settings.get_default_value('separator-color').unpack(); + this.verticalSeparator = this._settings.get_default_value('vert-separator').unpack(); + this.menuColor = this._settings.get_default_value('menu-color').unpack(); + this.menuForegroundColor = this._settings.get_default_value('menu-foreground-color').unpack(); + this.borderColor = this._settings.get_default_value('border-color').unpack(); + this.highlightColor = this._settings.get_default_value('highlight-color').unpack(); + this.highlightForegroundColor = this._settings.get_default_value('highlight-foreground-color').unpack(); + this.fontSize = this._settings.get_default_value('menu-font-size').unpack(); + this.borderSize = this._settings.get_default_value('menu-border-size').unpack(); + this.cornerRadius = this._settings.get_default_value('menu-corner-radius').unpack(); + this.menuMargin = this._settings.get_default_value('menu-margin').unpack(); + this.menuArrowSize = this._settings.get_default_value('menu-arrow-size').unpack(); + + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + + fontScale.set_value(this.fontSize); + + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + + borderScale.set_value(this.borderSize); + + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + + cornerScale.set_value(this.cornerRadius); + marginScale.set_value(this.menuMargin); + arrowScale.set_value(this.menuArrowSize); + + vertSeparatorSwitch.set_active(this.verticalSeparator); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + + resetButton.set_sensitive(false); + applyButton.set_sensitive(true); + }); + + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + halign: Gtk.Align.END + }); + applyButton.connect('clicked', ()=> { + applyButton.set_sensitive(false); + this.emit('menu-theme-response', -10); + }); + applyButton.set_sensitive(false); + + buttonRow.append(resetButton); + buttonRow.append(applyButton); + + this._parentMainBox.append(buttonRow); + } + get_response(){ + return this.addResponse; + } + checkIfPresetMatch(){ + this.presetName = "Custom Theme"; + let currentSettingsArray = [this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + let all_color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0;i < all_color_themes.length;i++){ + this.isEqual=true; + for(let l = 0; l { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array=[]; + for(let i = 0;i { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps([newPinnedApps],softwareShortcutsFrame); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + softwareShortcutsFrame.remove_all_children(); + this._loadPinnedApps(this._settings.get_default_value('directory-shortcuts-list').deep_unpack(), softwareShortcutsFrame); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < softwareShortcutsFrame.count; i++) { + let frame = softwareShortcutsFrame.get_index(i); + array.push([frame._name, frame._icon, frame._cmd]); + } + this._settings.set_value('directory-shortcuts-list', new GLib.Variant('aas', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + let currentShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + return !Utils.getArraysEqual(defaultShortcuts, currentShortcuts); + } + + _loadPinnedApps(applicationShortcuts,softwareShortcutsFrame){ + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = _(applicationShortcuts[i][0]); + let editable = true; + if(applicationShortcuts[i][2].startsWith("ArcMenu_")){ + editable = false; + } + + let frameRow = new PW.FrameBoxDragRow(this.softwareShortcutsScrollWindow); + frameRow._name = applicationName; + frameRow._icon = applicationShortcuts[i][1]; + frameRow._gicon = Gio.icon_new_for_string(getIconPath(applicationShortcuts[i])); + frameRow._cmd = applicationShortcuts[i][2]; + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(applicationName), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: softwareShortcutsFrame, + buttons: [this.resetButton, this.saveButton], + modifyButton: editable, + deleteButton: true + }); + + if(editable){ + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newApplicationShortcut = dialog.get_newPinnedAppsArray(); + frameRow._name = newApplicationShortcut[0]; + frameRow._icon = newApplicationShortcut[1]; + frameRow._cmd = newApplicationShortcut[2]; + softwareShortcutsLabel.label = _(frameRow._name); + applicationIcon.gicon = Gio.icon_new_for_string(frameRow._icon); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(true); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + } + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + softwareShortcutsFrame.add(frameRow); + } + } +}); +var MenuSettingsShortcutApplicationsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsShortcutApplicationsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + let softwareShortcutsFrame = new PW.FrameBox(); + this.softwareShortcutsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.softwareShortcutsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + this.softwareShortcutsScrollWindow.set_min_content_height(300); + this.softwareShortcutsScrollWindow.set_child(softwareShortcutsFrame); + + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._loadPinnedApps(applicationShortcuts,softwareShortcutsFrame); + this.mainBox.append(this.softwareShortcutsScrollWindow); + + let addPinnedAppsFrame = new PW.FrameBox(); + let addPinnedAppsFrameRow = new PW.FrameBoxRow(); + let addPinnedAppsFrameLabel = new Gtk.Label({ + label: _("Add More Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addPinnedAppsButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addPinnedAppsButton.connect('clicked', ()=> { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array=[]; + for(let i = 0;i { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps([newPinnedApps],softwareShortcutsFrame); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + softwareShortcutsFrame.remove_all_children(); + this._loadPinnedApps(this._settings.get_default_value('application-shortcuts-list').deep_unpack(), softwareShortcutsFrame); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < softwareShortcutsFrame.count; i++) { + let frame = softwareShortcutsFrame.get_index(i); + array.push([frame._name,frame._icon, frame._cmd]); + } + this._settings.set_value('application-shortcuts-list', new GLib.Variant('aas', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultShortcuts = this._settings.get_default_value('application-shortcuts-list').deep_unpack(); + let currentShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + return !Utils.getArraysEqual(defaultShortcuts, currentShortcuts); + } + + _loadPinnedApps(applicationShortcuts,softwareShortcutsFrame){ + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + + let frameRow = new PW.FrameBoxDragRow(this.softwareShortcutsScrollWindow); + let iconString; + frameRow._name = applicationShortcuts[i][0]; + frameRow._icon = applicationShortcuts[i][1]; + frameRow._cmd = applicationShortcuts[i][2]; + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + iconString = frameRow._icon; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString); + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(applicationName), + use_markup: true, + xalign: 0, + hexpand: true + }); + + checkIfValidShortcut(frameRow, softwareShortcutsLabel, applicationIcon); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: softwareShortcutsFrame, + buttons: [this.saveButton, this.resetButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newApplicationShortcut = dialog.get_newPinnedAppsArray(); + frameRow._name = newApplicationShortcut[0]; + frameRow._icon = newApplicationShortcut[1]; + frameRow._cmd = newApplicationShortcut[2]; + softwareShortcutsLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + applicationIcon.gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(true); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + softwareShortcutsFrame.add(frameRow); + } + } +}); +var MenuSettingsPowerOptionsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsPowerOptionsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.powerOptionsFrame = new PW.FrameBox(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._createFrame(this._settings.get_value("power-options").deep_unpack()); + this.mainBox.append(this.powerOptionsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + this.powerOptionsFrame.remove_all_children(); + this._createFrame(this._settings.get_default_value('power-options').deep_unpack()); + this.powerOptionsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < this.powerOptionsFrame.count; i++) { + let frame = this.powerOptionsFrame.get_index(i); + array.push([frame._enum, frame._shouldShow]); + } + this._settings.set_value('power-options', new GLib.Variant('a(ib)', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultPowerOptions = this._settings.get_default_value("power-options").deep_unpack(); + let currentPowerOptions = this._settings.get_value("power-options").deep_unpack(); + return !Utils.getArraysEqual(defaultPowerOptions, currentPowerOptions); + } + + _createFrame(powerOptions){ + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let name = Constants.PowerOptions[powerType].TITLE; + + let frameRow = new PW.FrameBoxDragRow(this); + frameRow._enum = powerOptions[i][0]; + frameRow._shouldShow = powerOptions[i][1]; + frameRow._name = Constants.PowerOptions[powerType].TITLE; + frameRow._gicon = Gio.icon_new_for_string(Constants.PowerOptions[powerType].IMAGE); + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + frameRow.hasSwitch = true; + frameRow.switchActive = frameRow._shouldShow; + + let powerIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let powerImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + powerImageBox.append(dragImage); + powerImageBox.append(powerIcon); + frameRow.add(powerImageBox); + + let powerLabel = new Gtk.Label({ + label: _(name), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.powerOptionsFrame, + buttons: [this.saveButton, this.resetButton], + }); + + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + }); + + modifyButton.set_active(frameRow._shouldShow); + modifyButton.connect('notify::active', ()=> { + frameRow._shouldShow = modifyButton.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + buttonBox.insert_column(0); + buttonBox.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + buttonBox.insert_column(0); + buttonBox.attach(modifyButton, 0, 0, 1, 1); + + frameRow.add(powerLabel); + frameRow.add(buttonBox); + this.powerOptionsFrame.add(frameRow); + } + } + }); + +var MiscPage = GObject.registerClass( + class Arc_Menu_MiscPage extends Gtk.ScrolledWindow { + _init(settings, parentBox) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let settingsHeaderLabel = new Gtk.Label({ + label: "" + _('Export or Import Settings') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(settingsHeaderLabel); + + let importFrame = new PW.FrameBox(); + let importRow = new PW.FrameBoxRow(); + let importLabel = new Gtk.Label({ + label: _("All ArcMenu Settings"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let settingsImportInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + settingsImportInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Export or Import All ArcMenu Settings"), + secondaryText: _('Importing settings from file may replace ALL saved settings.\nThis includes all saved pinned apps.'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + let importButtonsRow = new PW.FrameBoxRow(); + let importButton = new Gtk.Button({ + label: _("Import from File"), + hexpand: true, + vexpand: true, + }); + importButton.connect('clicked', ()=> { + this._showFileChooser( + _('Import settings'), + { action: Gtk.FileChooserAction.OPEN }, + "_Open", + filename => { + let settingsFile = Gio.File.new_for_path(filename); + let [ success_, pid, stdin, stdout, stderr] = + GLib.spawn_async_with_pipes( + null, + ['dconf', 'load', SCHEMA_PATH], + null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null + ); + + stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); + GLib.close(stdout); + GLib.close(stderr); + + stdin.splice(settingsFile.read(null), Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, null); + } + ); + }); + let exportButton = new Gtk.Button({ + label: _("Export to File"), + hexpand: true, + vexpand: true, + }); + exportButton.connect('clicked', ()=> { + this._showFileChooser( + _('Export settings'), + { action: Gtk.FileChooserAction.SAVE}, + "_Save", + (filename) => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + out.write_all(GLib.spawn_command_line_sync('dconf dump ' + SCHEMA_PATH)[1], null); + out.close(null); + } + ); + }); + + importRow.add(importLabel); + importRow.add(settingsImportInfoButton); + importButtonsRow.add(exportButton); + importButtonsRow.add(importButton); + importFrame.add(importRow); + importFrame.add(importButtonsRow); + this.mainBox.append(importFrame); + + let importColorPresetFrame = new PW.FrameBox(); + let importColorPresetRow = new PW.FrameBoxRow(); + let importColorPresetLabel = new Gtk.Label({ + label: _("Menu Theme Presets"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let colorThemesImportInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + colorThemesImportInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Export or Import Menu Theme Presets"), + secondaryText: _('Menu theme presets are located in the "Menu Theme" section'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + let importColorPresetButtonsRow = new PW.FrameBoxRow(); + let importColorPresetButton = new Gtk.Button({ + label: _("Import Theme Preset"), + hexpand: true, + vexpand: true, + }); + importColorPresetButton.connect('clicked', ()=> { + this._showFileChooser( + _('Import Theme Preset'), + { action: Gtk.FileChooserAction.OPEN }, + "_Open", + filename => { + let settingsFile = Gio.File.new_for_path(filename); + let [ success, content, etags] = settingsFile.load_contents(null); + let string = ByteArray.toString(content); + let themes = string.split("\n") + themes.pop(); //remove last blank array + this.color_themes = []; + for(let i = 0; i < themes.length; i++){ + let array = themes[i].split('//') + array.pop(); + this.color_themes.push(array); + } + let dialog = new ExportColorThemeDialogWindow(this._settings, this, this.color_themes); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let selectedThemes = dialog.selectedThemes; + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < selectedThemes.length; i++){ + this.color_themes.push(selectedThemes[i]); + } + + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + + dialog.destroy(); + } + else + dialog.destroy(); + }); + } + ); + }); + let exportColorPresetButton = new Gtk.Button({ + label: _("Export Theme Preset"), + hexpand: true, + vexpand: true, + }); + exportColorPresetButton.connect('clicked', ()=> { + let dialog = new ExportColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + this.selectedThemes = dialog.selectedThemes; + this._showFileChooser( + _('Export Theme Preset'), + { action: Gtk.FileChooserAction.SAVE }, + "_Save", + (filename) => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + for(let i = 0; i" + _('ArcMenu Settings Window Size') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(settingsSizeHeaderLabel); + + let settingsSizeFrame = new PW.FrameBox(); + let settingsWidthRow = new PW.FrameBoxRow(); + let settingsWidthLabel = new Gtk.Label({ + label: _('Window Width'), + xalign:0, + hexpand: false, + }); + let settingsWidthScale = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 850, upper: 1800, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + hexpand: true, + halign: Gtk.Align.END + }); + settingsWidthScale.set_value(this._settings.get_int("settings-width")); + settingsWidthScale.connect('value-changed', (widget) => { + this._settings.set_int("settings-width", widget.get_value()) + }); + settingsWidthRow.add(settingsWidthLabel); + settingsWidthRow.add(settingsWidthScale); + settingsSizeFrame.add(settingsWidthRow); + + let settingsHeightRow = new PW.FrameBoxRow(); + let settingsHeightLabel = new Gtk.Label({ + label: _('Window Height'), + xalign:0, + hexpand: false, + }); + let settingsHeightScale = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 300, upper: 1600, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + hexpand: true, + halign: Gtk.Align.END + }); + settingsHeightScale.set_value(this._settings.get_int("settings-height")); + settingsHeightScale.connect('value-changed', (widget) => { + this._settings.set_int("settings-height", widget.get_value()) + }); + settingsHeightRow.add(settingsHeightLabel); + settingsHeightRow.add(settingsHeightScale); + settingsSizeFrame.add(settingsHeightRow); + + this.mainBox.append(settingsSizeFrame); + + let resetSettingsButton = new Gtk.Button({ + valign: Gtk.Align.END, + halign: Gtk.Align.START, + vexpand: true, + hexpand: false, + label: _("Reset all Settings"), + }); + let context = resetSettingsButton.get_style_context(); + context.add_class('suggested-action'); + resetSettingsButton.connect('clicked', (widget) => { + let dialog = new Gtk.MessageDialog({ + text: "" + _("Restore Default Settings?") + '\n' + _("All ArcMenu settings will be reset to the default value."), + use_markup: true, + buttons: Gtk.ButtonsType.YES_NO, + message_type: Gtk.MessageType.WARNING, + transient_for: this.get_root(), + modal: true + }); + dialog.connect('response', (widget, response) => { + if(response == Gtk.ResponseType.YES){ + GLib.spawn_command_line_sync('dconf reset -f /org/gnome/shell/extensions/arcmenu/'); + let children = [...parentBox.settingsFrameStack]; + for(let child of children){ + parentBox.settingsFrameStack.remove(child); + } + parentBox.populateSettingsFrameStack(); + } + dialog.destroy(); + }); + dialog.show(); + }); + + this.mainBox.append(resetSettingsButton); + } + _showFileChooser(title, params, acceptBtn, acceptHandler) { + let dialog = new Gtk.FileChooserDialog({ + title: _(title), + transient_for: this.get_root(), + modal: true, + action: params.action, + }); + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button(acceptBtn, Gtk.ResponseType.ACCEPT); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + try { + acceptHandler(dialog.get_file().get_path()); + } catch(e) { + log('error from ArcMenu filechooser: ' + e); + } + } + dialog.destroy(); + }); + + dialog.show(); + } + }); + function mergeObjects(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + return main; + }; + +var AboutPage = GObject.registerClass( + class Arc_Menu_AboutPage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_start: 24, + margin_end: 24, + spacing: 0, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let releaseVersion; + if(Me.metadata.version) + releaseVersion = Me.metadata.version; + else + releaseVersion = 'unknown'; + + let commitVersion; + if(Me.metadata.commit) + commitVersion = Me.metadata.commit; + + let projectUrl = Me.metadata.url; + + let arcMenuImage = new Gtk.Image({ + margin_bottom: 5, + icon_name: 'arc-menu-logo', + pixel_size: 100, + }); + let arcMenuImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_top: 10, + margin_bottom: 10, + hexpand: false, + vexpand: false + }); + arcMenuImageBox.append(arcMenuImage); + + let extensionInfoFrame = new PW.FrameBox(); + + let arcMenuVersionRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let versionText = new Gtk.Label({ + label: _('ArcMenu Version'), + }); + let versionInfo = new Gtk.Label({ + label: releaseVersion + '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + arcMenuVersionRow.add(versionText); + arcMenuVersionRow.add(versionInfo); + extensionInfoFrame.add(arcMenuVersionRow); + + let commitRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let commitText = new Gtk.Label({ + label: _('Git Commit'), + }); + let commitInfo = new Gtk.Label({ + label: commitVersion ? commitVersion : '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + commitRow.add(commitText); + commitRow.add(commitInfo); + if(commitVersion){ + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(commitRow); + } + + let gnomeVersionRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let gnomeVersionText = new Gtk.Label({ + label: _('GNOME Version'), + }); + let gnomeVersionInfo = new Gtk.Label({ + label: imports.misc.config.PACKAGE_VERSION + '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + gnomeVersionRow.add(gnomeVersionText); + gnomeVersionRow.add(gnomeVersionInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(gnomeVersionRow); + + let osRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let osText = new Gtk.Label({ + label: _('OS'), + }); + let osInfoText; + let name = GLib.get_os_info("NAME"); + let prettyName = GLib.get_os_info("PRETTY_NAME"); + if(prettyName) + osInfoText = prettyName; + else + osInfoText = name; + let versionID = GLib.get_os_info("VERSION_ID"); + if(versionID) + osInfoText += "; Version ID: " + versionID; + let buildID = GLib.get_os_info("BUILD_ID"); + if(buildID) + osInfoText += "; " + "Build ID: " +buildID; + + let osInfo = new Gtk.Label({ + label: osInfoText, + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + osRow.add(osText); + osRow.add(osInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(osRow); + + let windowingRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let windowingText = new Gtk.Label({ + label: _('Session Type'), + }); + let windowingLabel; + if(Me.metadata.isWayland) + windowingLabel = "Wayland"; + else + windowingLabel = "X11"; + + let windowingInfo = new Gtk.Label({ + label: windowingLabel, + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + windowingRow.add(windowingText); + windowingRow.add(windowingInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(windowingRow); + + let arcMenuInfoBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + hexpand: false, + vexpand: false + }); + let arcMenuLabel = new Gtk.Label({ + label: '' + _('ArcMenu') + '', + use_markup: true, + vexpand: true, + valign: Gtk.Align.FILL + }); + + let projectDescriptionLabel = new Gtk.Label({ + label: _('Application Menu Extension for GNOME'), + hexpand: false, + vexpand: false, + margin_bottom: 5 + }); + let linksBox = new Gtk.Box({ + hexpand: false, + vexpand: false, + valign: Gtk.Align.END, + halign: Gtk.Align.CENTER, + margin_top: 0, + margin_bottom: 0, + margin_start: 0, + margin_end: 0, + spacing: 0, + }); + + let pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/donate-icon.svg', 150, 50); + let donateImage = Gtk.Picture.new_for_pixbuf(pixbuf); + let donateLinkButton = new Gtk.LinkButton({ + child: donateImage, + uri: 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=53CWA7NR743WC&item_name=Donate+to+support+my+work¤cy_code=USD&source=url', + }); + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/gitlab-icon.svg', 150, 50); + let gitlabImage = Gtk.Picture.new_for_pixbuf(pixbuf); + let projectLinkButton = new Gtk.LinkButton({ + child: gitlabImage, + uri: projectUrl, + }); + + linksBox.append(projectLinkButton); + linksBox.append(donateLinkButton); + + this.creditsScrollWindow = new Gtk.ScrolledWindow({ + margin_top: 10, + margin_bottom: 0, + hexpand: false, + }); + this.creditsScrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.creditsScrollWindow.set_max_content_height(200); + this.creditsScrollWindow.set_min_content_height(200); + this.creditsFrame = new PW.Notebook(); + this.creditsFrame.scrollable = true; + let developersPage = new PW.NotebookPage(_("Developers")); + this.creditsFrame.append_page(developersPage); + let translatorsPage = new PW.NotebookPage(_("Translators")); + this.creditsFrame.append_page(translatorsPage); + let contributorsPage = new PW.NotebookPage(_("Contributors")); + this.creditsFrame.append_page(contributorsPage ); + let artworkPage = new PW.NotebookPage(_("Artwork")); + this.creditsFrame.append_page(artworkPage); + this.creditsScrollWindow.set_child(this.creditsFrame); + let creditsLabel = new Gtk.Label({ + label: _(Constants.DEVELOPERS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + }); + developersPage.append(creditsLabel); + creditsLabel = new Gtk.Label({ + label: _(Constants.TRANSLATORS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + }); + translatorsPage.append(creditsLabel); + creditsLabel = new Gtk.Label({ + label: _(Constants.CONTRIBUTORS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + wrap: true + }); + contributorsPage.append(creditsLabel); + contributorsPage.hexpand = false; + creditsLabel = new Gtk.Label({ + label: _(Constants.ARTWORK), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + wrap: true + }); + artworkPage.append(creditsLabel); + arcMenuImageBox.append(arcMenuLabel); + arcMenuImageBox.append(projectDescriptionLabel); + + let gnuSofwareLabel = new Gtk.Label({ + label: _(Constants.GNU_SOFTWARE), + use_markup: true, + justify: Gtk.Justification.CENTER + }); + let gnuSofwareLabelBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + valign: Gtk.Align.END, + vexpand: true, + margin_top: 5, + margin_bottom: 10 + }); + gnuSofwareLabelBox.append(gnuSofwareLabel); + + this.mainBox.append(arcMenuImageBox); + this.mainBox.append(arcMenuInfoBox); + this.mainBox.append(extensionInfoFrame); + + this.mainBox.append(this.creditsScrollWindow) + this.mainBox.append(gnuSofwareLabelBox); + this.mainBox.append(linksBox); + } +}); + +function createSeparator(){ + let separatorRow = new Gtk.ListBoxRow({ + selectable: false, + activatable: false + }); + separatorRow.set_child(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + return separatorRow; +} + +var ArcMenuPreferencesWidget = GObject.registerClass( +class Arc_Menu_ArcMenuPreferencesWidget extends Gtk.Box { + _init() { + super._init(); + + this.leftHeaderBox = new Gtk.Box({ + hexpand: true, + visible: true + }); + + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + + this.backButton = new Gtk.Button({ + child: new Gtk.Image({icon_name: 'go-previous-symbolic'}), + visible: true + }); + this.backButton.connect("clicked", () => { + this.leftHeaderBox.remove(this.backButton); + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectFirstRow(); + }); + + this.settingsFrameStack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.CROSSFADE + }); + + this.settingsListStack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + + let mainStackListBox = new PW.StackListBox(this, {width_request: 215}); + + let mainStackBox = mainStackListBox.scrollWindow; + mainStackListBox.addRow("General", _("General"), 'homescreen-symbolic'); + mainStackListBox.addRow("MenuLayout", _("Menu Layout"), 'menu-layouts-symbolic') + mainStackListBox.addRow("MenuTheme", _("Menu Theme"), 'menu-theme-symbolic'); + mainStackListBox.addRow("MenuSettingsGeneral", _("Customize Menu"), 'menu-settings-symbolic', "MenuSettings"); + mainStackListBox.addRow("ButtonAppearance", _("Button Appearance"), 'arc-menu-symbolic') + mainStackListBox.addRow("Misc", _("Misc"), 'misc-symbolic') + mainStackListBox.addRow("About", _("About"), 'info-circle-symbolic'); + mainStackListBox.setSeparatorIndices([1, 4, 5]); + + let menuSettingsStackListBox = new PW.StackListBox(this, {width_request: 215}); + let menuSettingsListBox = menuSettingsStackListBox.scrollWindow; + menuSettingsStackListBox.addRow("MenuSettingsGeneral", _("Menu Settings"), 'menu-settings-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsPinnedApps", _("Pinned Apps"), 'pinned-apps-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsShortcutDirectories", _("Directory Shortcuts"), 'folder-documents-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsShortcutApplications", _("Application Shortcuts"), 'preferences-desktop-apps-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsPowerOptions", _("Power Options"), 'gnome-power-manager-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsSearchOptions", _("Search Options"), 'preferences-system-search-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsCategories", _("Extra Categories"), 'categories-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsNewApps", _("New Apps Tracker"), 'preferences-system-notifications-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsFineTune", _("Fine-Tune"), 'fine-tune-symbolic'); + menuSettingsStackListBox.setSeparatorIndices([1, 4, 8]); + + this.settingsListStack.add_named(mainStackBox, "Main"); + this.settingsListStack.add_named(menuSettingsListBox, "MenuSettings"); + + let sidebar = new Gtk.StackSidebar(); + sidebar.set_stack(this.settingsListStack); + this.append(this.settingsListStack); + this.append(sidebar); + + this.append(this.settingsFrameStack); + this.populateSettingsFrameStack(); + } + + populateSettingsFrameStack(){ + this.settingsFrameStack.add_named(new GeneralPage(this._settings), "General"); + this.menuLayoutPage = new MenuLayoutPage(this._settings); + this.settingsFrameStack.add_named(this.menuLayoutPage, "MenuLayout"); + this.settingsFrameStack.add_named(new MenuThemePage(this._settings), "MenuTheme"); + + this.settingsFrameStack.add_named(new MenuSettingsGeneralPage(this._settings), "MenuSettingsGeneral"); + this.settingsFrameStack.add_named(new MenuSettingsPinnedAppsPage(this._settings), "MenuSettingsPinnedApps"); + + let menuSettingsPinnedAppsPage = this.settingsFrameStack.get_child_by_name("MenuSettingsPinnedApps"); + + if(this.pinnedAppsChangedID){ + this._settings.disconnect(this.pinnedAppsChangedID); + this.pinnedAppsChangedID = null; + } + this.pinnedAppsChangedID = this._settings.connect("changed::pinned-app-list", () =>{ + menuSettingsPinnedAppsPage.frame.remove_all_children(); + menuSettingsPinnedAppsPage._loadPinnedApps(this._settings.get_strv('pinned-app-list')); + menuSettingsPinnedAppsPage.frame.show(); + }); + + this.settingsFrameStack.add_named(new MenuSettingsShortcutDirectoriesPage(this._settings), "MenuSettingsShortcutDirectories"); + this.settingsFrameStack.add_named(new MenuSettingsShortcutApplicationsPage(this._settings), "MenuSettingsShortcutApplications"); + this.settingsFrameStack.add_named(new MenuSettingsPowerOptionsPage(this._settings), "MenuSettingsPowerOptions"); + this.settingsFrameStack.add_named(new MenuSettingsSearchOptionsPage(this._settings), "MenuSettingsSearchOptions"); + this.settingsFrameStack.add_named(new MenuSettingsCategoriesPage(this._settings, "extra-categories"), "MenuSettingsCategories"); + this.settingsFrameStack.add_named(new MenuSettingsNewAppsPage(this._settings), "MenuSettingsNewApps"); + this.settingsFrameStack.add_named(new MenuSettingsFineTunePage(this._settings), "MenuSettingsFineTune"); + this.settingsFrameStack.add_named(new ButtonAppearancePage(this._settings), "ButtonAppearance"); + this.settingsFrameStack.add_named(new MiscPage(this._settings, this), "Misc"); + this.settingsFrameStack.add_named(new AboutPage(this._settings), "About"); + + this.show(); + + if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.MAIN){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectFirstRow(); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.CUSTOMIZE_MENU){ + this.settingsListStack.set_visible_child_name("MenuSettings"); + this.settingsListStack.get_child_by_name('MenuSettings').listBox.selectRowAtIndex(0); + if(!this.backButton.get_parent()) + this.leftHeaderBox.append(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.MENU_LAYOUT){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.BUTTON_APPEARANCE){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(4); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.LAYOUT_TWEAKS){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + this.menuLayoutPage.connect("realize", () => this.menuLayoutPage.displayLayoutTweaksPage()); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.RUNNER_TWEAKS){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + this.menuLayoutPage.connect("realize", () => this.menuLayoutPage.displayRunnerTweaksPage()); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.ABOUT){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(6); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + this._settings.set_int('prefs-visible-page', Constants.PrefsVisiblePage.MAIN); + } +}); + +function init() { + ExtensionUtils.initTranslations(Me.metadata['gettext-domain']); +} + +function buildPrefsWidget() { + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + let iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()); + if(!iconTheme.get_search_path().includes(Me.path + "/media/icons/prefs_icons")) + iconTheme.add_search_path(Me.path + "/media/icons/prefs_icons"); + let widget = new ArcMenuPreferencesWidget(); + widget.connect("realize", () => { + let window = widget.get_root(); + + window.default_width = this._settings.get_int('settings-width'); + window.default_height = this._settings.get_int('settings-height'); + + window.set_title(_("ArcMenu Settings")); + window.get_titlebar().pack_start(widget.leftHeaderBox); + }); + + widget.show(); + return widget; +} + +function checkIfValidShortcut(frameRow, label, icon){ + if(frameRow._cmd.endsWith(".desktop") && !Gio.DesktopAppInfo.new(frameRow._cmd)){ + icon.icon_name = 'warning-symbolic'; + label.label = "" + _("Invalid Shortcut") + " "+ _(label.label); + } +} + +function getIconPath(listing){ + let path, icon; + + if(listing[2]=="ArcMenu_Home") + path = GLib.get_home_dir(); + else if(listing[2].startsWith("ArcMenu_")){ + let string = listing[2]; + path = string.replace("ArcMenu_",''); + if(path === "Documents") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS); + else if(path === "Downloads") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD); + else if(path === "Music") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC); + else if(path === "Pictures") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES); + else if(path === "Videos") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_VIDEOS); + else + path = null; + } + else if(listing[1] == listing[2]) + path = listing[2]; + else if(listing[1] == "ArcMenu_Folder"){ + path = listing[2]; + } + else + path = null; + + if(path){ + let file = Gio.File.new_for_path(path); + try { + let info = file.query_info('standard::symbolic-icon', 0, null); + icon = info.get_symbolic_icon(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + if (!file.is_native()) { + icon = new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + } else { + icon = new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + } + return icon.to_string(); + } + else{ + if(listing[2]=="ArcMenu_Network") + return 'network-workgroup-symbolic'; + else if(listing[2]=="ArcMenu_Computer") + return 'drive-harddisk-symbolic'; + else + return listing[1]; + } +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js new file mode 100644 index 0000000..0700025 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js @@ -0,0 +1,793 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +var Notebook = GObject.registerClass(class Arc_Menu_Notebook extends Gtk.Notebook{ + _init() { + super._init({ + margin_start: 0, + margin_end: 0 + }); + } + + append_page(notebookPage) { + Gtk.Notebook.prototype.append_page.call( + this, + notebookPage, + notebookPage.getTitleLabel() + ); + } +}); + +var NotebookPage = GObject.registerClass(class Arc_Menu_NotebookPage extends Gtk.Box { + _init(title) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + homogeneous: false + }); + this._title = new Gtk.Label({ + label: "" + title + "", + use_markup: true, + xalign: 0 + }); + } + + getTitleLabel() { + return this._title; + } +}); + +var Button = GObject.registerClass(class Arc_Menu_Button extends Gtk.Button { + _init(params) { + super._init(); + this._params = params; + this.halign = Gtk.Align.END; + this.valign = Gtk.Align.CENTER; + this.box = new Gtk.Box({ + orientation: Gtk.Orientation.HORIZONTAL, + spacing: 5 + }); + this.set_child(this.box); + + if (this._params.icon_name) { + let image = new Gtk.Image({ + icon_name: this._params.icon_name, + halign: Gtk.Align.CENTER + }); + this.box.append(image); + } + if (this._params.tooltip_text){ + this.set_tooltip_text(this._params.tooltip_text); + } + if (this._params.title){ + let label = new Gtk.Label({ + label: _(this._params.title), + use_markup: true, + xalign: 0 + }); + if(this._params.icon_first) + this.box.append(label); + else + this.box.prepend(label); + } + } +}); + +var DialogWindow = GObject.registerClass(class Arc_Menu_DialogWindow extends Gtk.Dialog { + _init(title, parent) { + super._init({ + title: title, + transient_for: parent.get_root(), + modal: true + }); + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + hexpand: true, + halign: Gtk.Align.FILL + }); + vbox.insert_after(this.get_content_area(), null); + this._createLayout(vbox); + } + + _createLayout(vbox) { + throw "Not implemented!"; + } +}); + +var MessageDialog = GObject.registerClass(class Arc_Menu_MessageDialog extends Gtk.MessageDialog { + _init(params) { + super._init({ + transient_for: params.transient_for, + modal: true, + buttons: params.buttons + }); + this.set_size_request(300, 50); + this.grid = new Gtk.Grid({ + row_spacing: 10, + column_spacing: 24, + margin_top: 24, + margin_bottom: 0, + margin_start: 24, + margin_end: 24, + hexpand: false, + halign: Gtk.Align.CENTER + }); + this.grid.insert_after(this.get_content_area(), null); + let text = new Gtk.Label({ + label: "" + _(params.text) + "", + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true, + }); + this.grid.attach(text, 1, 0, 1, 1); + + if(params.secondaryText){ + let secondayText = new Gtk.Label({ + label: _(params.secondaryText), + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true, + }); + this.grid.attach(secondayText, 1, 1, 1, 1); + } + + if(params.iconName){ + let image = new Gtk.Image({ + icon_name: params.iconName, + pixel_size: 48 + }); + this.grid.attach(image, 0, 0, 1, 2); + } + } +}); + +var FrameBox = GObject.registerClass(class Arc_Menu_FrameBox extends Gtk.Frame { + _init(params) { + super._init(params); + this._listBox = new Gtk.ListBox(); + this._listBox.set_selection_mode(Gtk.SelectionMode.NONE); + this.count = 0; + this.children = []; + Gtk.Frame.prototype.set_child.call(this, this._listBox); + } + + add(boxRow) { + this._listBox.append(boxRow); + this.children.push(boxRow); + this.count++; + } + show() { + this._listBox.show(); + super.show(); + } + length() { + return this._listBox.length; + } + remove(boxRow){ + if(boxRow){ + this._listBox.remove(boxRow); + this.children = this.children.filter(e => e !== boxRow) + this.count = this.count -1; + } + } + removeChildrenAfterIndex(index){ + let childrenCount = this.count; + for(let i = childrenCount - 1; i > index; i--){ + let child = this._listBox.get_row_at_index(i); + if(child) this.remove(child); + } + this._listBox.show(); + } + remove_all_children() { + for(let i = 0; i < this.children.length; i++){ + let child = this.children[i]; + this._listBox.remove(child); + } + this.children = []; + this.count = 0; + this._listBox.show(); + } + get_index(index){ + return this._listBox.get_row_at_index(index); + } + insert(row, pos){ + this._listBox.insert(row, pos); + this.children.push(row); + this.count++; + } +}); + +var FrameBoxRow = GObject.registerClass(class Arc_Menu_FrameBoxRow extends Gtk.ListBoxRow { + _init(params) { + super._init(params); + this.selectable = false; + this.activatable = false; + this._grid = new Gtk.Grid({ + orientation: Gtk.Orientation.HORIZONTAL, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + column_spacing: 20, + row_spacing: 20 + }); + this.x = 0; + Gtk.ListBoxRow.prototype.set_child.call(this, this._grid); + } + + add(widget) { + this._grid.attach(widget, this.x, 0, 1, 1); + this.x++; + } + + setVerticalAlignmentBottom(){ + this._grid.vexpand = true; + this._grid.valign = Gtk.Align.END; + } +}); + +var FrameBoxDragRow = GObject.registerClass(class Arc_Menu_FrameBoxDragRow extends Gtk.ListBoxRow { + _init(scrolledWindow) { + super._init(); + + this._grid = new Gtk.Grid({ + orientation: Gtk.Orientation.HORIZONTAL, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + column_spacing: 20, + row_spacing: 20 + }); + + let dragSource = new Gtk.DragSource({ + actions: Gdk.DragAction.MOVE + }); + this.add_controller(dragSource); + + let dropTarget = new Gtk.DropTargetAsync({ + actions: Gdk.DragAction.MOVE + }); + this.add_controller(dropTarget); + + this.x = 0; + Gtk.ListBoxRow.prototype.set_child.call(this, this._grid); + dragSource.connect("drag-begin", (self, gdkDrag) => { + //get listbox parent + let listBox = self.get_widget().get_parent(); + //get widgets parent - the listBoxDragRow + listBox.dragRow = this; + + let alloc = self.get_widget().get_allocation(); + let dragWidget = self.get_widget().createDragRow(alloc); + listBox.dragWidget = dragWidget; + + let icon = Gtk.DragIcon.get_for_drag(gdkDrag); + icon.set_child(dragWidget); + + gdkDrag.set_hotspot(listBox.dragX, listBox.dragY); + }); + + dragSource.connect("prepare", (self, x, y) => { + //get listbox parent + this.set_state_flags(Gtk.StateFlags.NORMAL, true); + let listBox = self.get_widget().get_parent(); + //store drag start cursor location + listBox.dragX = x; + listBox.dragY = y; + return new Gdk.ContentProvider(Arc_Menu_FrameBoxDragRow); + }); + + dragSource.connect("drag-end", (self, gdkDrag, deleteData)=> { + deleteData = true; + let listBox = self.get_widget().get_parent(); + listBox.dragWidget = null; + listBox.drag_unhighlight_row(); + }); + + dropTarget.connect("drag-enter", (self, gdkDrop, x, y, selection, info, time)=> { + let listBox = self.get_widget().get_parent(); + let widget = self.get_widget(); + + listBox.startIndex = widget.get_index(); + listBox.drag_highlight_row(widget); + + if(!scrolledWindow) + return true; + + let height = widget.get_height(); + let scrollHeight = scrolledWindow.get_height(); + let widgetLoc = widget.get_index() * height; + let value = scrolledWindow.vadjustment.value; + + if((widgetLoc + (height * 4)) > (value + scrollHeight)) + scrolledWindow.vadjustment.value += height; + else if((widgetLoc - (height * 2)) < value) + scrolledWindow.vadjustment.value -= height; + }); + + dropTarget.connect("drag-leave", (self, gdkDrop, x, y, selection, info, time)=> { + let listBox = self.get_widget().get_parent(); + listBox.drag_unhighlight_row(); + }); + + dropTarget.connect("drop", (self, gdkDrop, x, y, selection, info, time)=> { + //get listbox parent + let listBox = this.get_parent(); + let index = this.get_index(); + if(index === listBox.dragRow.get_index()){ + gdkDrop.read_value_async(Arc_Menu_FrameBoxDragRow, 1, null, ()=>{ + gdkDrop.finish(Gdk.DragAction.MOVE); + }); + return true; + } + listBox.remove(listBox.dragRow); + listBox.show(); + listBox.insert(listBox.dragRow, index); + this.resetButton?.set_sensitive(true); + this.saveButton.set_sensitive(true); + gdkDrop.read_value_async(Arc_Menu_FrameBoxDragRow, 1, null, ()=>{ + gdkDrop.finish(Gdk.DragAction.MOVE); + }); + return true; + }); + } + + createDragRow(alloc){ + let dragWidget = new Gtk.ListBox(); + dragWidget.set_size_request(alloc.width, alloc.height); + + let dragRow = new FrameBoxRow(); + dragWidget.append(dragRow); + dragWidget.drag_highlight_row(dragRow); + + let image = new Gtk.Image( { + gicon: this._gicon, + pixel_size: 22 + }); + + let imageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: true, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + + imageBox.append(dragImage); + imageBox.append(image); + + dragRow.add(imageBox); + + let label = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true, + label: _(this._name) + }); + dragRow.add(label); + let grid = new Gtk.Grid({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }) + let editButton = new Button({ + icon_name: 'view-more-symbolic' + }); + grid.attach(editButton, 0, 0, 1, 1); + + if(this.hasSwitch){ + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + active: this.switchActive + }); + grid.insert_column(0); + grid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + grid.insert_column(0); + grid.attach(modifyButton, 0, 0, 1, 1); + } + if(this.hasEditButton){ + let editButton = new Button({ + icon_name: 'text-editor-symbolic', + }); + grid.insert_column(0); + grid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + grid.insert_column(0); + grid.attach(editButton, 0, 0, 1, 1); + } + dragRow.add(grid); + + return dragWidget; + } + + add(widget) { + this._grid.attach(widget, this.x, 0, 1, 1); + this.x++; + } + + setVerticalAlignmentBottom(){ + this._grid.vexpand = true; + this._grid.valign = Gtk.Align.END; + } +}); + +var EditEntriesBox = GObject.registerClass({ + Signals: { + 'modify': {}, + 'change': {}, + 'move-up': {}, + 'move-down': {}, + 'delete': {}, + }, +}, class Arc_Menu_EditEntriesBox extends Gtk.Grid{ + _init(params){ + super._init({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }); + let editPopover = new Gtk.Popover(); + let frameRow = params.frameRow; + let frame = params.frame; + let buttons = params.buttons; + + let modifyButton, deleteButton, changeButton; + + if(params.modifyButton){ + modifyButton = new Gtk.Button({ + label: _("Modify"), + has_frame: false + }); + modifyButton.connect('clicked', () => { + editPopover.popdown(); + this.emit('modify'); + }); + } + + if(params.changeButton){ + changeButton = new Button({ + icon_name: 'text-editor-symbolic', + }); + changeButton.connect('clicked', () => { + editPopover.popdown(); + this.emit('change'); + }); + } + + let editButton = new Gtk.MenuButton({ + icon_name: 'view-more-symbolic', + popover: editPopover, + }); + + this.attach(editButton, 0, 0, 1, 1); + + let editPopoverBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL + }); + + editPopover.set_child(editPopoverBox); + + let moveUpButton = new Gtk.Button({ + label: _("Move Up"), + has_frame: false + }); + moveUpButton.connect('clicked', ()=> { + this.emit('move-up'); + let index = frameRow.get_index(); + if(index > 0){ + frame.remove(frameRow); + frame.insert(frameRow, index - 1); + } + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + + let moveDownButton = new Gtk.Button({ + label: _("Move Down"), + has_frame: false + }); + moveDownButton.connect('clicked', ()=> { + this.emit('move-down'); + let index = frameRow.get_index(); + if(index + 1 < frame.count) { + frame.remove(frameRow); + frame.insert(frameRow, index + 1); + } + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + + if(params.deleteButton){ + deleteButton = new Gtk.Button({ + label: _("Delete"), + has_frame: false, + }); + deleteButton.connect('clicked', ()=> { + this.emit('delete'); + frame.remove(frameRow); + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + } + + if(params.changeButton){ + this.insert_column(0); + this.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + this.insert_column(0); + this.attach(changeButton, 0, 0, 1, 1); + } + + if(params.modifyButton){ + editPopoverBox.append(modifyButton); + editPopoverBox.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + } + + editPopoverBox.append(moveUpButton); + editPopoverBox.append(moveDownButton); + + if(params.deleteButton){ + editPopoverBox.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + editPopoverBox.append(deleteButton); + } + } +}); + +var StackListBox = GObject.registerClass(class Arc_Menu_StackListBox extends Gtk.ListBox{ + _init(widget, params){ + super._init(params); + this.valign = Gtk.Align.FILL; + this.vexpand = true; + this.hexpand = false; + this.settingsFrameStack = widget.settingsFrameStack; + this.settingsListStack = widget.settingsListStack + this.connect("row-selected", (self, row) => { + if(row){ + let stackName = row.stackName; + this.settingsFrameStack.set_visible_child_name(stackName); + if(row.nextPage){ + if(widget.backButton.get_parent()) + widget.leftHeaderBox.remove(widget.backButton); + widget.leftHeaderBox.prepend(widget.backButton); + this.settingsListStack.set_visible_child_name(row.nextPage); + this.settingsListStack.get_child_by_name(row.nextPage).listBox.selectFirstRow(); + } + } + }); + this.scrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.scrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.scrollWindow.set_child(this); + this.scrollWindow.listBox = this; + } + + getRowAtIndex(index){ + return this.get_row_at_index(index).get_children()[0]; + } + + getSelectedRow(){ + return this.get_selected_row().get_children()[0]; + } + + selectFirstRow(){ + this.select_row(this.get_row_at_index(0)); + } + + selectRowAtIndex(index){ + this.select_row(this.get_row_at_index(index)); + } + + addRow(name, translateableName, iconName, nextPage){ + let row1 = new Gtk.ListBoxRow(); + this.append(row1); + + let row = new Gtk.Grid({ + margin_top: 12, + margin_bottom: 12, + margin_start: 12, + margin_end: 12, + column_spacing: 10 + }); + row1.set_child(row); + row1.stackName = name; + row1.translateableName = translateableName; + + let image = new Gtk.Image({ + icon_name: iconName + }); + + let label = new Gtk.Label({ + label: translateableName, + halign: Gtk.Align.START, + }); + row.attach(image, 0, 0, 1, 1); + row.attach(label, 1, 0, 1, 1); + + if(nextPage){ + row1.nextPage = nextPage; + let image2 = new Gtk.Image({ + gicon: Gio.icon_new_for_string('go-next-symbolic'), + halign: Gtk.Align.END, + hexpand: true + }); + row.attach(image2, 2, 0, 1, 1); + } + } + + setSeparatorIndices(indexArray){ + this.set_header_func((_row, _before) =>{ + for(let i = 0; i < indexArray.length; i++){ + if(_row.get_index() === indexArray[i]){ + let sep = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL); + sep.show(); + _row.set_header(sep); + + } + } + }); + } +}); + +var TileGrid = GObject.registerClass(class Arc_Menu_TileGrid extends Gtk.FlowBox{ + _init(maxColumns) { + super._init({ + row_spacing: 5, + column_spacing: 5, + vexpand: true, + hexpand: true, + valign: Gtk.Align.CENTER, + halign: Gtk.Align.CENTER, + max_children_per_line: maxColumns, + homogeneous: true, + selection_mode: Gtk.SelectionMode.NONE + }); + } +}); + +var IconGrid = GObject.registerClass(class Arc_Menu_IconGrid extends Gtk.FlowBox{ + _init() { + super._init({ + max_children_per_line: 7, + row_spacing: 10, + column_spacing: 10, + vexpand: true, + hexpand: false, + valign: Gtk.Align.START, + halign: Gtk.Align.CENTER, + homogeneous: true, + selection_mode: Gtk.SelectionMode.SINGLE + }); + this.childrenCount = 0; + } + + add(widget){ + this.insert(widget, -1); + this.childrenCount++; + } +}); + +var Tile = GObject.registerClass(class Arc_Menu_Tile extends FrameBox{ + _init(name, file, width, height, layout) { + super._init({ + hexpand: true, + vexpand: false, + halign: Gtk.Align.FILL, + valign: Gtk.Align.CENTER + }); + this.box = new FrameBoxRow(); + this.box.activatable = true; + this.box._grid.row_spacing = 0; + this.box._grid.orientation = Gtk.Orientation.VERTICAL, + this.activatable = true; + this.name = name; + this.layout = layout; + this._image = new Gtk.Image({ + + gicon: Gio.icon_new_for_string(file), + pixel_size: width + }); + this._label = new Gtk.Label({ label: _(this.name) }); + + this.box._grid.attach(this._image, 0, 0, 1, 1); + this.box._grid.attach(this._label, 0, 1, 1, 1); + this._listBox.append(this.box); + } +}); + +var LayoutTile = GObject.registerClass(class Arc_Menu_LayoutTile extends FrameBox{ + _init(name, file, layout) { + super._init({ + halign: Gtk.Align.FILL, + valign: Gtk.Align.CENTER, + hexpand: true, + vexpand: false + }); + this._listBox.set_selection_mode(Gtk.SelectionMode.NONE); + this.name = name; + this.layout = layout.MENU_TYPE; + + this.box = new FrameBoxRow(); + this.box.activatable = true; + this.box._grid.row_spacing = 0; + this.box._grid.column_spacing = 0; + + this._image = new Gtk.Image({ + hexpand: false, + halign: Gtk.Align.START, + gicon: Gio.icon_new_for_string(file), + pixel_size: 46 + }); + + let titleLabel = new Gtk.Label({ + label: "" + _("%s Menu Layouts", layout.TITLE).format(layout.TITLE) + "", + use_markup: true, + hexpand: true, + halign: Gtk.Align.CENTER, + vexpand: true, + valign: Gtk.Align.CENTER, + wrap: true, + }) + + let goNextImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string('go-next-symbolic'), + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + hexpand: false, + vexpand: false, + }) + + this.box._grid.attach(this._image, 0, 0, 1, 2); + this.box._grid.attach(titleLabel, 1, 0, 1, 1); + this.box._grid.attach(goNextImage, 2, 0, 1, 2); + + this._listBox.append(this.box); + } +}); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js new file mode 100644 index 0000000..eb51dff --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js @@ -0,0 +1,111 @@ +const { Gtk, Gio, GLib } = imports.gi; +const ExtensionUtils = imports.misc.extensionUtils; +const Main = imports.ui.main; + +const LogEnabled = false; + +var isCanceled = false; +var currentQueries = []; + +var RecentFilesManager = class Arc_Menu_RecentFilesManager { + constructor() { + this._settings = ExtensionUtils.getSettings(); + this._recentManager = new Gtk.RecentManager(); + } + + filterRecentFiles(callback){ + isCanceled = false; + this._recentManager.get_items().sort((a, b) => b.get_modified() - a.get_modified()) + .forEach(item => { + this.queryFileExists(item) + .then(validFile => { + this.debugLog("Valid file - " + validFile.get_display_name()); + if(!isCanceled) + callback(validFile); + }) + .catch(err =>{ + this.debugLog(err); + }); + }); + } + + queryFileExists(item) { + return new Promise((resolve, reject) => { + let file = Gio.File.new_for_uri(item.get_uri()); + let cancellable = new Gio.Cancellable(); + + if(file === null) + reject("Recent file is null. Rejected."); + + //Create and store queryInfo to cancel any active queries when needed + let queryInfo = { + timeOutID: null, + cancellable, + reject, + item + }; + + currentQueries.push(queryInfo); + + file.query_info_async('standard::type,standard::is-hidden', 0, 0, cancellable, (source, res) => { + try { + let fileInfo = source.query_info_finish(res); + this.removeQueryInfoFromList(queryInfo); + if (fileInfo) { + let isHidden = fileInfo.get_attribute_boolean("standard::is-hidden"); + let showHidden = this._settings.get_boolean('show-hidden-recent-files'); + if(isHidden && !showHidden) + reject(item.get_display_name() + " is hidden. Rejected.") + resolve(item); + } + } + catch (err) { + if (err.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + this.debugLog("Cancel Called: " + item.get_display_name()); + + this.removeQueryInfoFromList(queryInfo); + reject(err); + } + }); + }); + } + + removeQueryInfoFromList(queryInfo){ + let queryIndex = currentQueries.indexOf(queryInfo); + if(queryIndex !== -1) + currentQueries.splice(queryIndex, 1); + } + + cancelCurrentQueries(){ + if(currentQueries.length === 0) + return; + isCanceled = true; + this.debugLog("Canceling " + currentQueries.length + " queries...") + for(let queryInfo of currentQueries){ + this.debugLog("Cancel query - " + queryInfo.item.get_display_name()); + queryInfo.cancellable.cancel(); + queryInfo.cancellable = null; + queryInfo.reject("Query Canceled"); + } + currentQueries = null; + currentQueries = []; + this.debugLog("Cancel Finished"); + } + + debugLog(message){ + if (!LogEnabled) + return; + else log(message); + } + + getRecentManager(){ + return this._recentManager; + } + + destroy(){ + this.cancelCurrentQueries(); + this._settings = null; + this._recentManager = null; + } +} + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..473fe73f32ad30f7f813acd364e7108a048a2530 GIT binary patch literal 12620 zcmd5?dz2K_nJ?5~U_b>yK~ZQ1ksj@u_l$r9XJEi#Wnf^2hYy^o>8|N6r@O1Es%97k z#Rr0VJfbtEfv_tw4N_ucQ_uFKXNj%8#$P5n)W+$i+Ju~ZCcGj&loOs5}=2>2g z?h>N-!8X|LDL@G@R-qJ<7zd08%7$Sgz7vxbra(?rKo_-X0H4jr4CutUz)WBk5DB3i z`kWBXhkgMtPaz6PTo^(Ox(-wVRil7IMAQOxK)pf(1sDLX z2W|*q2lShOTTXzTxHcTSzzxS>^F4=lfTyiZK#Ln8yMeLq%o$6bdKvf}0Yej{sK={IrWa_0z#0hkRoa>}U0{ z67tl`!G8ofVX~(6AADyHdFm6vPlvn_M!4dI$g||Bv)z4=-vX*mezuuBb+)@7@(?hl z>>rMkr+y~uhdd4pc0G9)dFoTaPl9plz=2E7Z6Z&dd@JPJ!2ZYHUr3(%4AujAjQS%- z|3IGlS*!=naVGGSY0oStPn~=~L?!~`&k34lg*W-}i2DUwV@7?67bH4UNmYoHAKJ?|ad&ZgG}4*41I({I!qWqIl`@YM(?4Zwu|+4)2A)K3N93b`9NclJ7AKh!6I-wSyV__%t; zOqQn}0slT^34+oG#&16&Po3>fhl~Ivb=P*1r#_qYL$(3&4>lO&sk3}HWD00adX?m< zPXoULayKxg^bePkr_OQP2l+T~N&JE+dFsLrA^!w?=e>W=lBZ67(%Bd%;Gtu050Ix$ zd#i?Q04DsgcOH4_oX1wk7lA)LcmFTQQ|G)KhHRXnX(zuNy@ot>&TlK^&A{Z$OHY#* zI{3Zd9t6I&ZQ2;})ahSOK|TX)Z@B&ldFp)Lw;_KC48C_bMxHwD`8ecS1pC%sSN()M z^_k#vkPiVLef9otk*Ci7JO%jz@bg85-;$@!aXSpT>O4(LuDPR>JaxvOjgZ|yqD}uE zdFq_^9Aq9yuDk6f^3-W>dmzuj!c+3W)pwAm&UuVNRs(Y%{^pO#Q>R@uK`sMI`d|4a zdFp3_?}jviH}1P_7J2II|5nKDz^@;eJ%v1V@_Qin0-t^GgV)GYXFcDCti&Sty9p2e zjy!e7+a|~dfYY0giugvI zh7R-37dI|5u+NPo3lTIONAbcS0BOoI2-y(rkYSI|kb8hfjD;R~>WmNjApa4#<8{*|Pn~i5ZOB8w?{BIT z>kjpcz+(~6N`SqOeewd!Q)m6tAWp8E%MYkJ{uvsfnTlv=w9;Fg}p&O3k%?+`H;ZglfNzOnL6h;3i%~q;77;yvpjYB??%W?!24hO)e7>| z+0Ptg9(d`D_vewP&iUF4`5;hMQFw|xb@KZm4*-ke$@S!^GcFB69sy1*`&iUNo&C|~ zVorhaWy{C1JoWRyM_1qZI_GOIWa&KE$ES0Tk*7}oiaVFLUMvJO+II zqP2r8Po4do6vcP|o!`AZO`baED+>7#aP+t(`cIwX@D${0!1JqD{*2|Ra~uvsmRBHO z-u9mG3+jxA)sXXnhqBYZ&hpghFB>5@0sk^*;eV5-&UxPfxf6JJPW}ja>f(7J9|iPx zXNd8k&UN`9 z^jsnQi~2n9Imk!IXMg0de(HSQ{g4NMmxTb)xdYU z2ZcRT7j_Q02`H47iad%s>&Zdh2(13f_l18^XZgL5&jGL0TVj2r&hiH#{}=ei<|h}j zUFw|2>6I7{z~5g|=l(JRSzoPb|8#fjVwR`Q=W2&sN4_!t4teT~GbzZIfobplK=>(j z;qQ<~fWM#i;CPm&F8sX)Z32mohhHR5o&B5+c^>fkyU#yCo;t^;36gtX?r8OtX(dx0 zu41ov5Gk_8GDPVi#83%vHN)ue9p>d%>;|13>|kq#H~xuB40 zFVbOpo|R3yn%@B>SH$hCCJqer;!!~)=a{{2#E=IDO-feA?Tj{MW<^!?<(=ztH{G{i ziyE#R=$^di*;(C)dltr_$B6eO9Xp>*6emE8e{J3Tm_%c&y0V6`12Z5B>0Zjr;DJ@Q zA|2j9+8lk>P*t?Hwl1bn!BWw>+L-t+ztz^n=GVn)8qk7lxS=6dt57rih6OkrXwYhE zwc2{E*GRjjcG{f!C2LGK-#@VJ#+@BjCYK(Fv=~mGs%(BNQma5i^4qAX0bj!lwHL=C zs+q>RSYvIhvEDC)5r}XI@X;8HU=aKZBYRl9b%9o`{>lDLoU^di$ltPa*X?)S^<{P} zvLu~1Bb^*VF&ecEvAUXAooqE)Gk*bwy&5B+I#pj2Yp9MjG{}({^390)<3u^4e0Z!p zCvR$#W>$Ua@~(`%+1)a5!%Dj0$i4()FWYNC>-;aj)z;y%gc^!acVQ(96pLq&|NRjg zQEWutCYM(?Z%Ey+&9bg%Q?cOeLfx=d+eKpu1+ya176ObSs-Mx60~DL`bkIKv{8d(SyI~es$8a zY8JpIiXYXLb+X+V3N z$4*;u-?O@cJA#lvZ#Nw?8#i4Pm(}=p$!Se ze$#*>J9@vBNSdB521Jb~oU*+> zb3nJV_;e7Y4frhMZ9hgAF*OL-#rTUzitB1oaI)y3V^ep)qG1S@C%mYG5qMXb4$f2nF)U7a#UDiBRpn8v{pC;kuN%6bpN7vj08yR=vk|5?Islhw&Ek z*<;&%8N?{@SdzzL={QzG4e94C9>KG+Hc?;B?nhtk9DC|lhbtU+9~^J$Co6dhB>%*C zLXH*R@DVklR!>C*oX|0J%&D1#RdU5G*2Q{QAOBb%|NQ#=`-jg@aqSC_dwl~YDfpACQFf0ck5NC+&Z&NY4r-fz2zc6aFas{0Rpe z?Wrrs#$-mIV~j+D!hbC{u3HRqL9lKydky$Z(Pn+Zx7%f$;EoJJVX;5*Yk@;lXfqK9 zGU6KNwy@H0lBR~fLKpX@1;MZ5g8n0;Lr4{YU|3iVqN^WB|NMB2X!;ij$#a)##jTOmaP%#f*{|_K z@6D&vZrm}EQjb`biZ=!KOx0T#RL@CFuGP2}4sAM{reYV8n}$^Me>>LelUlxmkKjQEQOS!HKYN64pC3^p7+ zA$>x}CPDYtt08e+u1D;4ux3#&u1TJqOkz(Ia??f4X>W0jRw@>IKVur=iL4I4m;F`z zu^33oRUGkGCeOChp2h8&zy6E(k;L*-3?hF{zg5f-wiJpPB8I4#A?8Jt>spJ|n!_RE zh%E1uut8i9_xMyewy43)8HofoY&?q)aT-C+(la(POtqz@oyx^qEVCmvr+i*lX%}lFc(J|Hw^**loo~)Sz!QInznk+`ybpKuxx)gjEb&*GUnG23PMNp)%l;SI zS&Q7)Cot4v&N_ujtL>%osik5Uz$XjEcA3HW$p`bS;@*;u9jwg5I#rwxVU03J)%+#` zfA7fWOs8ul+oY)$`~pznTq-A2`N)7YQEwn;E=TO_S}M;og1W+_Utfoxxod?9L47Lm zjw2fM`MJ4c;A}(MgC8(N$3>_{0LYqbXK9cbb*mI!}^ z@x$5|>1k-2$2p*X6*p}%yBay~awn89+!U95>{EtBd=Xy)(-`@z!}CH>UQLUe?-8q- zv~Bt=54BVrQ0Az%E9|Z4FIvZDjs3v7fDATadWHr67WIbj4-z=Lx7Rggl8NU%z;n%cA)kSMVl6#!bTuzWl;xy-W1Q_h~0|F zEJN8V&VAK&n1F@Q#W3YB`Me@>{HTE~hM)SXGr&W1c0PyNEEhdU+@=-XBV<2c;77x4 zNFH`c8!pakU^h5I8G6nojadcjUTl0r_9uFU{)VSa9ixc~g%u-$Rw99nZ$w+L^WppT5o;J5Lpk5hO$W!FF!e1Kjw<|)`2HdeUW1XHC~mbvJK|t| z5NCqZK|}{R^l4+j&ci#ta9vr#vlz9eY)C;DiKEQXF5`<=ZE#-ZQgDPei@Q3tmq?3z z)o=#bGnoU3@~izE8Sx(%#BrmHUE_-1xm`mn!^c`Pfh+*anpP;|$2y)lG1fz0l20Tp zc`u*8umW#>$=!J2RDNG8@&#yG;WU0MO*!Z=H|T;po!nZnEFf+}$C@cu0j)5Z-`j;< ziLz(#`v!U5LUjs1RvP(i9LGOUr}FzUaefX>E8z7Kt(D7XULWhk7ykV3Bvl5ns zUxZT7@G-x(N9B1&I+sFbyqV;#vK(^#2e0+u|vu@6C)uI4F+PG>W4PoXQ5S zqcR;n1b+X)k!LRxPUykfP$bp*T+D$)ZWhXc$^z5y!&+#Kf<4H_a0Y~sl5;GqCj&#W zVi_;waas`PL}?XlL@)V)`G}8x3M`9+Q@!v656@jtk22B|_f6OnED8BL&WMMf<+j2R zgCp9JUrNrH)ndo<=m(AmRTA5EBBt!z$`-pn%YAJ4hRWN_=5vD0~K(%Y&$+_IY`I~<{ zlAoRhKIs#Fe@5hMYH;Pjcnanzk8b4f$bExoduT$#HHvXtjgiVuhxbfX0wMBmNIpCN zKJT1WH8u258|6iQ6#g-gVM!fds6L2#7m0n>;;ndznJ4yu2D%0$c)ct*-{^fyDsxi0uILY~~O#0B;m%O~7V=Ydh`WHUO^$ ziua;9{+9zB|671d0dBI^0dx@#4s(WEfsMdr0Ds!L5nyhC*Xr>8iF}`X8RRv&A36`=jB1)71IfnMNm0NM$24rWi+1N^%dr~~M-T|gU9 z4&b!_Z4QtGx&h3ac+a~5auF~ChyYgr%K;lG0oDU}9S`q4Y1;V!UOCj}0}Fr~fSZ7e zfKz}~KnIWm4B$(^T!8zUM&JS<18e|R0+m1u&<@N7)&R`6&H=6lm>I=^Z2$rb-r3>% zjd))MxC&tYb>cL{&ma85IsUMZadhHcZG7QC9Xy)g_*WQuLB=GUnP5}s7nSiyuFU~= zS`d4bEsM>HJSg@THQ7QjJ`3Mf-3nfhVEjhr8_NFVZRGvD3lYaor{&qPfuD=a-d=UC KhO#K9?)X3aDRLwL literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml new file mode 100644 index 0000000..9638cb6 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml @@ -0,0 +1,799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 +

      $n6XK^F|T3w!pp*sy5K5Hkd&6zO-ap)=__-9w~-OmW?(wJXNQ_N?gq_fJ0Uua`m+_H=+B*N@gKp%9-jdE*(34iMBW0X-Y31Ey2c@i3 zV5rND%q^1@*%cAoa5@UVK%YYEWC^Ik*@PvyV#ZA+`;Pwd_Q*T5m)n(@;e0bnjm-oS zR0Vt+&no&%XGyY+qlPDWYf)~Z)IKLcq)+D#rQbESGG((zO}0u~HvTf97pAA1gpn09 zv0LDK3mc`mc8U&@|$O9-k zBVN=}hsyLVUR#nIb*tvG8IZ{3zz}}xFDN0^P1nt-;Kawy(GW%17nd<48RZUXwHS^~ zRX7hMTZ%7i(TI|Mrk$Dv!4)HYMixxhFQvMUdHd z&A0My--5k&M�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 EKhimw=>Px# literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..e7cacbb732e3e62a95da290aa525c5ba835b14f3 GIT binary patch literal 24167 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..3bc58a5277609d714b9d95054126090ad7ae9411 GIT binary patch literal 24795 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 UNiY_TBqRR5pQwQi;B4pr1AQs8b^rhX literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..29933049b93eea13da4d170ca1ab1f716912de07 GIT binary patch literal 10635 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..ed1cc6da97db5f57d6297e3959e1f1e3011de329 GIT binary patch literal 19323 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 Titlebar Buttons > Minimize & Maximize.\n\nFor the best support, please report any issues on Github. Dash-to-panel is developed and maintained by @jderose9 and @charlesg99.", + "extension-id": "dash-to-panel", + "gettext-domain": "dash-to-panel", + "name": "Dash to Panel", + "shell-version": [ + "40" + ], + "url": "https://github.com/home-sweet-gnome/dash-to-panel", + "uuid": "dash-to-panel@jderose9.github.com", + "version": 44 +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js new file mode 100644 index 0000000..57600a5 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js @@ -0,0 +1,708 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Intellihide = Me.imports.intellihide; +const Utils = Me.imports.utils; + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Lang = imports.lang; +const Main = imports.ui.main; +const Shell = imports.gi.Shell; +const Gtk = imports.gi.Gtk; +const Gdk = imports.gi.Gdk; +const Gio = imports.gi.Gio; +const Mainloop = imports.mainloop; +const IconGrid = imports.ui.iconGrid; +const OverviewControls = imports.ui.overviewControls; +const Workspace = imports.ui.workspace; +const St = imports.gi.St; +const WorkspaceThumbnail = imports.ui.workspaceThumbnail; + +const Meta = imports.gi.Meta; + +const GS_HOTKEYS_KEY = 'switch-to-application-'; +const BACKGROUND_MARGIN = 12; +const SMALL_WORKSPACE_RATIO = 0.15; +const DASH_MAX_HEIGHT_RATIO = 0.15; + + +//timeout names +const T1 = 'swipeEndTimeout'; + +var dtpOverview = Utils.defineClass({ + Name: 'DashToPanel.Overview', + + _init: function() { + this._numHotkeys = 10; + this._timeoutsHandler = new Utils.TimeoutsHandler(); + }, + + enable : function(panel) { + this._panel = panel; + this.taskbar = panel.taskbar; + + this._injectionsHandler = new Utils.InjectionsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._optionalWorkspaceIsolation(); + this._optionalHotKeys(); + this._optionalNumberOverlay(); + this._optionalClickToExit(); + this._toggleDash(); + this._hookupAllocation(); + + this._signalsHandler.add([ + Me.settings, + 'changed::stockgs-keep-dash', + () => this._toggleDash() + ]); + + }, + + disable: function () { + Utils.hookVfunc(Workspace.WorkspaceBackground.prototype, 'allocate', Workspace.WorkspaceBackground.prototype.vfunc_allocate); + Utils.hookVfunc(OverviewControls.ControlsManagerLayout.prototype, 'allocate', OverviewControls.ControlsManagerLayout.prototype.vfunc_allocate); + OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState = this._oldComputeWorkspacesBoxForState; + + this._signalsHandler.destroy(); + this._injectionsHandler.destroy(); + + this._toggleDash(true); + + // Remove key bindings + this._disableHotKeys(); + this._disableExtraShortcut(); + this._disableClickToExit(); + }, + + _toggleDash: function(visible) { + // To hide the dash, set its width to 1, so it's almost not taken into account by code + // calculaing the reserved space in the overview. The reason to keep it at 1 is + // to allow its visibility change to trigger an allocaion of the appGrid which + // in turn is triggergin the appsIcon spring animation, required when no other + // actors has this effect, i.e in horizontal mode and without the workspaceThumnails + // 1 static workspace only) + + if (visible === undefined) { + visible = Me.settings.get_boolean('stockgs-keep-dash'); + } + + let visibilityFunc = visible ? 'show' : 'hide'; + let width = visible ? -1 : 1; + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + + overviewControls.dash.actor[visibilityFunc](); + overviewControls.dash.actor.set_width(width); + + // This force the recalculation of the icon size + overviewControls.dash._maxHeight = -1; + }, + + /** + * Isolate overview to open new windows for inactive apps + */ + _optionalWorkspaceIsolation: function() { + let label = 'optionalWorkspaceIsolation'; + + this._signalsHandler.add([ + Me.settings, + 'changed::isolate-workspaces', + Lang.bind(this, function() { + this._panel.panelManager.allPanels.forEach(p => p.taskbar.resetAppIcons()); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + else + Lang.bind(this, disable)(); + }) + ]); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + + function enable() { + this._injectionsHandler.removeWithLabel(label); + + this._injectionsHandler.addWithLabel(label, [ + Shell.App.prototype, + 'activate', + IsolatedOverview + ]); + + this._signalsHandler.removeWithLabel(label); + + this._signalsHandler.addWithLabel(label, [ + global.window_manager, + 'switch-workspace', + () => this._panel.panelManager.allPanels.forEach(p => p.taskbar.handleIsolatedWorkspaceSwitch()) + ]); + } + + function disable() { + this._signalsHandler.removeWithLabel(label); + this._injectionsHandler.removeWithLabel(label); + } + + function IsolatedOverview() { + // These lines take care of Nautilus for icons on Desktop + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = this.get_windows().filter(w => w.get_workspace().index() == activeWorkspace.index()); + + if (windows.length > 0 && + (!(windows.length == 1 && windows[0].skip_taskbar) || + this.is_on_workspace(activeWorkspace))) + return Main.activateWindow(windows[0]); + + return this.open_new_window(-1); + } + }, + + // Hotkeys + _activateApp: function(appIndex) { + let seenApps = {}; + let apps = []; + + this.taskbar._getAppIcons().forEach(function(appIcon) { + if (!seenApps[appIcon.app]) { + apps.push(appIcon); + } + + seenApps[appIcon.app] = (seenApps[appIcon.app] || 0) + 1; + }); + + this._showOverlay(); + + if (appIndex < apps.length) { + let appIcon = apps[appIndex]; + let seenAppCount = seenApps[appIcon.app]; + let windowCount = appIcon.window || appIcon._hotkeysCycle ? seenAppCount : appIcon._nWindows; + + if (Me.settings.get_boolean('shortcut-previews') && windowCount > 1 && + !(Clutter.get_current_event().get_state() & ~(Clutter.ModifierType.MOD1_MASK | Clutter.ModifierType.MOD4_MASK))) { //ignore the alt (MOD1_MASK) and super key (MOD4_MASK) + if (this._hotkeyPreviewCycleInfo && this._hotkeyPreviewCycleInfo.appIcon != appIcon) { + this._endHotkeyPreviewCycle(); + } + + if (!this._hotkeyPreviewCycleInfo) { + this._hotkeyPreviewCycleInfo = { + appIcon: appIcon, + currentWindow: appIcon.window, + keyFocusOutId: appIcon.actor.connect('key-focus-out', () => appIcon.actor.grab_key_focus()), + capturedEventId: global.stage.connect('captured-event', (actor, e) => { + if (e.type() == Clutter.EventType.KEY_RELEASE && e.get_key_symbol() == (Clutter.KEY_Super_L || Clutter.Super_L)) { + this._endHotkeyPreviewCycle(true); + } + + return Clutter.EVENT_PROPAGATE; + }) + }; + + appIcon._hotkeysCycle = appIcon.window; + appIcon.window = null; + appIcon._previewMenu.open(appIcon); + appIcon.actor.grab_key_focus(); + } + + appIcon._previewMenu.focusNext(); + } else { + // Activate with button = 1, i.e. same as left click + let button = 1; + this._endHotkeyPreviewCycle(); + appIcon.activate(button, true); + } + } + }, + + _endHotkeyPreviewCycle: function(focusWindow) { + if (this._hotkeyPreviewCycleInfo) { + global.stage.disconnect(this._hotkeyPreviewCycleInfo.capturedEventId); + this._hotkeyPreviewCycleInfo.appIcon.actor.disconnect(this._hotkeyPreviewCycleInfo.keyFocusOutId); + + if (focusWindow) { + this._hotkeyPreviewCycleInfo.appIcon._previewMenu.activateFocused(); + } + + this._hotkeyPreviewCycleInfo.appIcon.window = this._hotkeyPreviewCycleInfo.currentWindow; + delete this._hotkeyPreviewCycleInfo.appIcon._hotkeysCycle; + this._hotkeyPreviewCycleInfo = 0; + } + }, + + _optionalHotKeys: function() { + this._hotKeysEnabled = false; + if (Me.settings.get_boolean('hot-keys')) + this._enableHotKeys(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys')) + Lang.bind(this, this._enableHotKeys)(); + else + Lang.bind(this, this._disableHotKeys)(); + }) + ]); + }, + + _resetHotkeys: function() { + this._disableHotKeys(); + this._enableHotKeys(); + }, + + _enableHotKeys: function() { + if (this._hotKeysEnabled) + return; + + //3.32 introduced app hotkeys, disable them to prevent conflicts + if (Main.wm._switchToApplication) { + for (let i = 1; i < 10; ++i) { + Utils.removeKeybinding(GS_HOTKEYS_KEY + i); + } + } + + // Setup keyboard bindings for taskbar elements + let shortcutNumKeys = Me.settings.get_string('shortcut-num-keys'); + let bothNumKeys = shortcutNumKeys == 'BOTH'; + let keys = []; + + if (bothNumKeys || shortcutNumKeys == 'NUM_ROW') { + keys.push('app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-'); // Regular numbers + } + + if (bothNumKeys || shortcutNumKeys == 'NUM_KEYPAD') { + keys.push('app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-'); // Key-pad numbers + } + + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) { + let appNum = i; + + Utils.addKeybinding(key + (i + 1), Me.settings, () => this._activateApp(appNum)); + } + }, this); + + this._hotKeysEnabled = true; + + if (Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(true); + }, + + _disableHotKeys: function() { + if (!this._hotKeysEnabled) + return; + + let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-', // Regular numbers + 'app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-']; // Key-pad numbers + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) { + Utils.removeKeybinding(key + (i + 1)); + } + }, this); + + if (Main.wm._switchToApplication) { + let gsSettings = new Gio.Settings({ schema_id: imports.ui.windowManager.SHELL_KEYBINDINGS_SCHEMA }); + + for (let i = 1; i < 10; ++i) { + Utils.addKeybinding(GS_HOTKEYS_KEY + i, gsSettings, Main.wm._switchToApplication.bind(Main.wm)); + } + } + + this._hotKeysEnabled = false; + + this.taskbar.toggleNumberOverlay(false); + }, + + _optionalNumberOverlay: function() { + // Enable extra shortcut + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, this._checkHotkeysOptions) + ], [ + Me.settings, + 'changed::hotkeys-overlay-combo', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys') && Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(true); + else + this.taskbar.toggleNumberOverlay(false); + }) + ], [ + Me.settings, + 'changed::shortcut-num-keys', + () => this._resetHotkeys() + ]); + }, + + _checkHotkeysOptions: function() { + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + else + this._disableExtraShortcut(); + }, + + _enableExtraShortcut: function() { + Utils.addKeybinding('shortcut', Me.settings, () => this._showOverlay(true)); + }, + + _disableExtraShortcut: function() { + Utils.removeKeybinding('shortcut'); + }, + + _showOverlay: function(overlayFromShortcut) { + //wait for intellihide timeout initialization + if (!this._panel.intellihide) { + return; + } + + // Restart the counting if the shortcut is pressed again + if (this._numberOverlayTimeoutId) { + Mainloop.source_remove(this._numberOverlayTimeoutId); + this._numberOverlayTimeoutId = 0; + } + + let hotkey_option = Me.settings.get_string('hotkeys-overlay-combo'); + + if (hotkey_option === 'NEVER') + return; + + if (hotkey_option === 'TEMPORARILY' || overlayFromShortcut) + this.taskbar.toggleNumberOverlay(true); + + this._panel.intellihide.revealAndHold(Intellihide.Hold.TEMPORARY); + + let timeout = Me.settings.get_int('overlay-timeout'); + + if (overlayFromShortcut) { + timeout = Me.settings.get_int('shortcut-timeout'); + } + + // Hide the overlay/dock after the timeout + this._numberOverlayTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, function() { + this._numberOverlayTimeoutId = 0; + + if (hotkey_option != 'ALWAYS') { + this.taskbar.toggleNumberOverlay(false); + } + + this._panel.intellihide.release(Intellihide.Hold.TEMPORARY); + })); + }, + + _optionalClickToExit: function() { + this._clickToExitEnabled = false; + if (Me.settings.get_boolean('overview-click-to-exit')) + this._enableClickToExit(); + + this._signalsHandler.add([ + Me.settings, + 'changed::overview-click-to-exit', + Lang.bind(this, function() { + if (Me.settings.get_boolean('overview-click-to-exit')) + Lang.bind(this, this._enableClickToExit)(); + else + Lang.bind(this, this._disableClickToExit)(); + }) + ]); + }, + + _enableClickToExit: function() { + if (this._clickToExitEnabled) + return; + + let view = imports.ui.appDisplay; + this._oldOverviewReactive = Main.overview._overview.reactive + + Main.overview._overview.reactive = true; + + this._clickAction = new Clutter.ClickAction(); + this._clickAction.connect('clicked', () => { + + if (this._swiping) + return Clutter.EVENT_PROPAGATE; + + let [x, y] = global.get_pointer(); + let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); + + Main.overview.toggle(); + }); + Main.overview._overview.add_action(this._clickAction); + + this._clickToExitEnabled = true; + }, + + _disableClickToExit: function () { + if (!this._clickToExitEnabled) + return; + + Main.overview._overview.remove_action(this._clickAction); + Main.overview._overview.reactive = this._oldOverviewReactive; + + this._signalsHandler.removeWithLabel('clickToExit'); + + this._clickToExitEnabled = false; + }, + + _onSwipeBegin: function() { + this._swiping = true; + return true; + }, + + _onSwipeEnd: function() { + this._timeoutsHandler.add([ + T1, + 0, + () => this._swiping = false + ]); + return true; + }, + + _hookupAllocation: function() { + Utils.hookVfunc(OverviewControls.ControlsManagerLayout.prototype, 'allocate', function vfunc_allocate(container, box) { + const childBox = new Clutter.ActorBox(); + + const { spacing } = this; + + let startY = 0; + let startX = 0; + + if (Me.settings.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.panelBox.y === Main.layoutManager.primaryMonitor.y) { + startY = Main.layoutManager.panelBox.height; + box.y1 += startY; + } + + const panel = global.dashToPanel.panels[0]; + if(panel) { + switch (panel.getPosition()) { + case St.Side.TOP: + startY = panel.panelBox.height; + box.y1 += startY; + break; + case St.Side.LEFT: + startX = panel.panelBox.width; + box.x1 += startX; + break; + case St.Side.RIGHT: + box.x2 -= panel.panelBox.width; + break; + + } + } + + + const [width, height] = box.get_size(); + let availableHeight = height; + + // Search entry + let [searchHeight] = this._searchEntry.get_preferred_height(width); + childBox.set_origin(startX, startY); + childBox.set_size(width, searchHeight); + this._searchEntry.allocate(childBox); + + availableHeight -= searchHeight + spacing; + + // Dash + const maxDashHeight = Math.round(box.get_height() * DASH_MAX_HEIGHT_RATIO); + this._dash.setMaxSize(width, maxDashHeight); + + let [, dashHeight] = this._dash.get_preferred_height(width); + if (Me.settings.get_boolean('stockgs-keep-dash')) + dashHeight = Math.min(dashHeight, maxDashHeight); + else + dashHeight = spacing*5; // todo: determine proper spacing for window labels on maximized windows on workspace display + childBox.set_origin(startX, startY + height - dashHeight); + childBox.set_size(width, dashHeight); + this._dash.allocate(childBox); + + availableHeight -= dashHeight + spacing; + + // Workspace Thumbnails + let thumbnailsHeight = 0; + if (this._workspacesThumbnails.visible) { + const { expandFraction } = this._workspacesThumbnails; + [thumbnailsHeight] = + this._workspacesThumbnails.get_preferred_height(width); + thumbnailsHeight = Math.min( + thumbnailsHeight * expandFraction, + height * WorkspaceThumbnail.MAX_THUMBNAIL_SCALE); + childBox.set_origin(startX, startY + searchHeight + spacing); + childBox.set_size(width, thumbnailsHeight); + this._workspacesThumbnails.allocate(childBox); + } + + // Workspaces + let params = [box, startX, startY, searchHeight, dashHeight, thumbnailsHeight]; + const transitionParams = this._stateAdjustment.getStateTransitionParams(); + + // Update cached boxes + for (const state of Object.values(OverviewControls.ControlsState)) { + this._cachedWorkspaceBoxes.set( + state, this._computeWorkspacesBoxForState(state, ...params)); + } + + let workspacesBox; + if (!transitionParams.transitioning) { + workspacesBox = this._cachedWorkspaceBoxes.get(transitionParams.currentState); + } else { + const initialBox = this._cachedWorkspaceBoxes.get(transitionParams.initialState); + const finalBox = this._cachedWorkspaceBoxes.get(transitionParams.finalState); + workspacesBox = initialBox.interpolate(finalBox, transitionParams.progress); + } + + this._workspacesDisplay.allocate(workspacesBox); + + // AppDisplay + if (this._appDisplay.visible) { + const workspaceAppGridBox = + this._cachedWorkspaceBoxes.get(OverviewControls.ControlsState.APP_GRID); + + if (Config.PACKAGE_VERSION > '40.3') { + const monitor = Main.layoutManager.findMonitorForActor(this._container); + const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index); + const workAreaBox = new Clutter.ActorBox(); + + workAreaBox.set_origin(startX, startY); + workAreaBox.set_size(workArea.width, workArea.height); + + params = [workAreaBox, searchHeight, dashHeight, workspaceAppGridBox] + } else { + params = [box, startX, searchHeight, dashHeight, workspaceAppGridBox]; + } + + let appDisplayBox; + if (!transitionParams.transitioning) { + appDisplayBox = + this._getAppDisplayBoxForState(transitionParams.currentState, ...params); + } else { + const initialBox = + this._getAppDisplayBoxForState(transitionParams.initialState, ...params); + const finalBox = + this._getAppDisplayBoxForState(transitionParams.finalState, ...params); + + appDisplayBox = initialBox.interpolate(finalBox, transitionParams.progress); + } + + this._appDisplay.allocate(appDisplayBox); + } + + // Search + childBox.set_origin(0, startY + searchHeight + spacing); + childBox.set_size(width, availableHeight); + + this._searchController.allocate(childBox); + + this._runPostAllocation(); + }); + + this._oldComputeWorkspacesBoxForState = OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState; + OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState = function _computeWorkspacesBoxForState(state, box, startX, startY, searchHeight, dashHeight, thumbnailsHeight) { + const workspaceBox = box.copy(); + const [width, height] = workspaceBox.get_size(); + const { spacing } = this; + const { expandFraction } = this._workspacesThumbnails; + + switch (state) { + case OverviewControls.ControlsState.HIDDEN: + break; + case OverviewControls.ControlsState.WINDOW_PICKER: + workspaceBox.set_origin(startX, + startY + searchHeight + spacing + + thumbnailsHeight + spacing * expandFraction); + workspaceBox.set_size(width, + height - + dashHeight - spacing - + searchHeight - spacing - + thumbnailsHeight - spacing * expandFraction); + break; + case OverviewControls.ControlsState.APP_GRID: + workspaceBox.set_origin(startX, startY + searchHeight + spacing); + workspaceBox.set_size( + width, + Math.round(height * SMALL_WORKSPACE_RATIO)); + break; + } + + return workspaceBox; + } + + Utils.hookVfunc(Workspace.WorkspaceBackground.prototype, 'allocate', function vfunc_allocate(box) { + const [width, height] = box.get_size(); + const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); + const scaledHeight = height - (BACKGROUND_MARGIN * 2 * scaleFactor); + const scaledWidth = (scaledHeight / height) * width; + + const scaledBox = box.copy(); + scaledBox.set_origin( + box.x1 + (width - scaledWidth) / 2, + box.y1 + (height - scaledHeight) / 2); + scaledBox.set_size(scaledWidth, scaledHeight); + + const progress = this._stateAdjustment.value; + + if (progress === 1) + box = scaledBox; + else if (progress !== 0) + box = box.interpolate(scaledBox, progress); + + this.set_allocation(box); + + const themeNode = this.get_theme_node(); + const contentBox = themeNode.get_content_box(box); + + this._bin.allocate(contentBox); + + + const [contentWidth, contentHeight] = contentBox.get_size(); + const monitor = Main.layoutManager.monitors[this._monitorIndex]; + let xOff = (contentWidth / this._workarea.width) * + (this._workarea.x - monitor.x); + let yOff = (contentHeight / this._workarea.height) * + (this._workarea.y - monitor.y); + + let startX = -xOff; + let startY = -yOff; + const panel = Utils.find(global.dashToPanel.panels, p => p.monitor.index == this._monitorIndex); + switch (panel.getPosition()) { + case St.Side.TOP: + yOff += panel.panelBox.height; + startY -= panel.panelBox.height; + break; + case St.Side.BOTTOM: + yOff += panel.panelBox.height; + break; + case St.Side.RIGHT: + xOff += panel.panelBox.width; + break; + } + contentBox.set_origin(startX, startY); + contentBox.set_size(xOff + contentWidth, yOff + contentHeight); + this._backgroundGroup.allocate(contentBox); + }); + + } +}); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js new file mode 100644 index 0000000..5e0b5f9 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js @@ -0,0 +1,1512 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Gtk = imports.gi.Gtk; +const Gi = imports._gi; +const AppIcons = Me.imports.appIcons; +const Utils = Me.imports.utils; +const Taskbar = Me.imports.taskbar; +const Pos = Me.imports.panelPositions; +const PanelSettings = Me.imports.panelSettings; +const PanelStyle = Me.imports.panelStyle; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const Dash = imports.ui.dash; +const CtrlAltTab = imports.ui.ctrlAltTab; +const Panel = imports.ui.panel; +const PanelMenu = imports.ui.panelMenu; +const St = imports.gi.St; +const GLib = imports.gi.GLib; +const Meta = imports.gi.Meta; +const Pango = imports.gi.Pango; +const DND = imports.ui.dnd; +const Shell = imports.gi.Shell; +const PopupMenu = imports.ui.popupMenu; +const IconGrid = imports.ui.iconGrid; +const DateMenu = imports.ui.dateMenu; +const Volume = imports.ui.status.volume; +const Progress = Me.imports.progress; + +const Intellihide = Me.imports.intellihide; +const Transparency = Me.imports.transparency; +const _ = imports.gettext.domain(Me.imports.utils.TRANSLATION_DOMAIN).gettext; + +let tracker = Shell.WindowTracker.get_default(); +var panelBoxes = ['_leftBox', '_centerBox', '_rightBox']; + +//timeout names +const T1 = 'startDynamicTransparencyTimeout'; +const T2 = 'startIntellihideTimeout'; +const T3 = 'allocationThrottleTimeout'; +const T4 = 'showDesktopTimeout'; +const T5 = 'trackerFocusAppTimeout'; +const T6 = 'scrollPanelDelayTimeout'; +const T7 = 'waitPanelBoxAllocation'; + +var dtpPanel = Utils.defineClass({ + Name: 'DashToPanel-Panel', + Extends: St.Widget, + + _init: function(panelManager, monitor, panelBox, isStandalone) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this.panelManager = panelManager; + this.panelStyle = new PanelStyle.dtpPanelStyle(); + + this.monitor = monitor; + this.panelBox = panelBox; + + // when the original gnome-shell top panel is kept, all panels are "standalone", + // so in this case use isPrimary to get the panel on the primary dtp monitor, which + // might be different from the system's primary monitor. + this.isStandalone = isStandalone; + this.isPrimary = !isStandalone || (Me.settings.get_boolean('stockgs-keep-top-panel') && + monitor == panelManager.dtpPrimaryMonitor); + + this._sessionStyle = null; + this._unmappedButtons = []; + this._elementGroups = []; + this.cornerSize = 0; + + let position = this.getPosition(); + + if (isStandalone) { + this.panel = new dtpSecondaryPanel({ name: 'panel', reactive: true }); + this.statusArea = this.panel.statusArea = {}; + + Utils.wrapActor(this.panel); + + //next 3 functions are needed by other extensions to add elements to the secondary panel + this.panel.addToStatusArea = function(role, indicator, position, box) { + return Main.panel.addToStatusArea.call(this, role, indicator, position, box); + }; + + this.panel._addToPanelBox = function(role, indicator, position, box) { + Main.panel._addToPanelBox.call(this, role, indicator, position, box); + }; + + this.panel._onMenuSet = function(indicator) { + Main.panel._onMenuSet.call(this, indicator); + }; + + this._leftBox = this.panel._leftBox = new St.BoxLayout({ name: 'panelLeft' }); + this._centerBox = this.panel._centerBox = new St.BoxLayout({ name: 'panelCenter' }); + this._rightBox = this.panel._rightBox = new St.BoxLayout({ name: 'panelRight' }); + + this.menuManager = this.panel.menuManager = new PopupMenu.PopupMenuManager(this.panel); + + this._setPanelMenu('aggregateMenu', dtpSecondaryAggregateMenu, this.panel.actor); + this._setPanelMenu('dateMenu', DateMenu.DateMenuButton, this.panel.actor); + this._setPanelMenu('activities', Panel.ActivitiesButton, this.panel.actor); + + this.panel.add_child(this._leftBox); + this.panel.add_child(this._centerBox); + this.panel.add_child(this._rightBox); + } else { + this.panel = Main.panel; + this.statusArea = Main.panel.statusArea; + this.menuManager = Main.panel.menuManager; + + panelBoxes.forEach(p => this[p] = Main.panel[p]); + + ['activities', 'aggregateMenu', 'dateMenu'].forEach(b => { + let container = this.statusArea[b].container; + let parent = container.get_parent(); + + container._dtpOriginalParent = parent; + parent ? parent.remove_child(container) : null; + this.panel.actor.add_child(container); + }); + } + + // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of + // its behavior is handled by the taskbar, but its positioning is done at the panel level + this.showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this); + this.panel.actor.add_child(this.showAppsIconWrapper.realShowAppsIcon); + + this.panel.actor._delegate = this; + + Utils.wrapActor(this.statusArea.activities); + + this.add_child(this.panel.actor); + + if (Main.panel._onButtonPress || Main.panel._tryDragWindow) { + this._signalsHandler.add([ + this.panel.actor, + [ + 'button-press-event', + 'touch-event' + ], + this._onButtonPress.bind(this) + ]); + } + + if (Main.panel._onKeyPress) { + this._signalsHandler.add([this.panel.actor, 'key-press-event', Main.panel._onKeyPress.bind(this)]); + } + + Main.ctrlAltTabManager.addGroup(this, _("Top Bar")+" "+ monitor.index, 'focus-top-bar-symbolic', + { sortGroup: CtrlAltTab.SortGroup.TOP }); + }, + + enable : function() { + let position = this.getPosition(); + + if (this.statusArea.aggregateMenu) { + Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll = 1; + } + + this.geom = this.getGeometry(); + + // The overview uses the panel height as a margin by way of a "ghost" transparent Clone + // This pushes everything down, which isn't desired when the panel is moved to the bottom + // I'm adding a 2nd ghost panel and will resize the top or bottom ghost depending on the panel position + this._myPanelGhost = new Clutter.Actor({ + x: this.geom.x, + y: this.geom.y , + reactive: false, + opacity: 0 + }); + + let isTop = this.geom.position == St.Side.TOP; + + if (isTop) { + this.panel._leftCorner = this.panel._leftCorner || new Panel.PanelCorner(St.Side.LEFT); + this.panel._rightCorner = this.panel._rightCorner || new Panel.PanelCorner(St.Side.RIGHT); + + Main.overview._overview.insert_child_at_index(this._myPanelGhost, 0); + } else { + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + Main.overview._overview.add_actor(this._myPanelGhost); + } + + if (this.panel._leftCorner) { + Utils.wrapActor(this.panel._leftCorner); + Utils.wrapActor(this.panel._rightCorner); + + if (isTop) { + if (this.isStandalone) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + } else if (Config.PACKAGE_VERSION >= '3.32') { + this.panel.actor.remove_child(this.panel._leftCorner.actor); + this.panel.actor.remove_child(this.panel._rightCorner.actor); + } + } + + this._setPanelPosition(); + + if (!this.isStandalone) { + if (this.panel.vfunc_allocate) { + this._panelConnectId = 0; + Utils.hookVfunc(this.panel.__proto__, 'allocate', (box, flags) => this._mainPanelAllocate(0, box, flags)); + } else { + this._panelConnectId = this.panel.actor.connect('allocate', (actor, box, flags) => this._mainPanelAllocate(actor, box, flags)); + } + + // remove the extra space before the clock when the message-indicator is displayed + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', () => [0,0]); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', () => [0,0]); + } + } + + if (!DateMenu.IndicatorPad && this.statusArea.dateMenu) { + //3.36 switched to a size constraint applied on an anonymous child + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints = indicatorPad.get_constraints(); + indicatorPad.clear_constraints(); + } + + // The main panel's connection to the "allocate" signal is competing with this extension + // trying to move the centerBox over to the right, creating a never-ending cycle. + // Since we don't have the ID to disconnect that handler, wrap the allocate() function + // it calls instead. If the call didn't originate from this file, ignore it. + panelBoxes.forEach(b => { + this[b].allocate = (box, flags, isFromDashToPanel) => { + if (isFromDashToPanel) { + Utils.allocate(this[b], box, flags, true); + } + } + }); + + this.menuManager._oldChangeMenu = this.menuManager._changeMenu; + this.menuManager._changeMenu = (menu) => { + if (!Me.settings.get_boolean('stockgs-panelbtn-click-only')) { + this.menuManager._oldChangeMenu(menu); + } + }; + + this.dynamicTransparency = new Transparency.DynamicTransparency(this); + + this.taskbar = new Taskbar.taskbar(this); + + this.panel.actor.add_child(this.taskbar.actor); + + this._setAppmenuVisible(Me.settings.get_boolean('show-appmenu')); + this._setShowDesktopButton(true); + + this._setAllocationMap(); + + this.panel.actor.add_style_class_name('dashtopanelMainPanel ' + this.getOrientation()); + + this._setPanelGhostSize(); + + this._timeoutsHandler.add([T2, Me.settings.get_int('intellihide-enable-start-delay'), () => this.intellihide = new Intellihide.Intellihide(this)]); + + this._signalsHandler.add( + // this is to catch changes to the theme or window scale factor + [ + Utils.getStageTheme(), + 'changed', + () => (this._resetGeometry(), this._setShowDesktopButtonStyle()), + ], + [ + // sync hover after a popupmenu is closed + this.taskbar, + 'menu-closed', + Lang.bind(this, function(){this.panel.actor.sync_hover();}) + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._adjustForOverview() + ], + [ + Main.overview, + 'hidden', + () => { + if (this.isPrimary) { + //reset the primary monitor when exiting the overview + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this.statusArea.activities.actor, + 'captured-event', + (actor, e) => { + // todo this is not being called right now, so the overview is not shown on the correct monitor + if (e.type() == Clutter.EventType.BUTTON_PRESS || e.type() == Clutter.EventType.TOUCH_BEGIN) { + //temporarily use as primary the monitor on which the activities btn was clicked + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this._centerBox, + 'actor-added', + () => this._onBoxActorAdded(this._centerBox) + ], + [ + this._rightBox, + 'actor-added', + () => this._onBoxActorAdded(this._rightBox) + ], + [ + this.panel.actor, + 'scroll-event', + this._onPanelMouseScroll.bind(this) + ], + [ + Main.layoutManager, + 'startup-complete', + () => this._resetGeometry() + ] + ); + + this._bindSettingsChanges(); + + this.panelStyle.enable(this); + + if (this.checkIfVertical()) { + this._signalsHandler.add([ + this.panelBox, + 'notify::visible', + () => { + if (this.panelBox.visible) { + this._refreshVerticalAlloc(); + } + } + ]); + + this._setSearchEntryOffset(this.geom.w); + + if (this.statusArea.dateMenu) { + this._formatVerticalClock(); + + this._signalsHandler.add([ + this.statusArea.dateMenu._clock, + 'notify::clock', + () => this._formatVerticalClock() + ]); + } + } + + // Since we are usually visible but not usually changing, make sure + // most repaint requests don't actually require us to repaint anything. + // This saves significant CPU when repainting the screen. + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this._initProgressManager(); + }, + + disable: function () { + this.panelStyle.disable(); + + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + this._disablePanelCornerSignals(); + + this.panel.actor.remove_child(this.taskbar.actor); + this._setAppmenuVisible(false); + + if (this.intellihide) { + this.intellihide.destroy(); + } + + this.dynamicTransparency.destroy(); + + this.progressManager.destroy(); + + this.taskbar.destroy(); + this.showAppsIconWrapper.destroy(); + + this.menuManager._changeMenu = this.menuManager._oldChangeMenu; + + this._myPanelGhost.get_parent().remove_actor(this._myPanelGhost); + this._setSearchEntryOffset(0); + + panelBoxes.forEach(b => delete this[b].allocate); + this._unmappedButtons.forEach(a => this._disconnectVisibleId(a)); + + if (this._dateMenuIndicatorPadContraints && this.statusArea.dateMenu) { + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints.forEach(c => indicatorPad.add_constraint(c)); + } + + this._setVertical(this.panel.actor, false); + + if (!this.isStandalone) { + this.statusArea.dateMenu._clockDisplay.text = this.statusArea.dateMenu._clock.clock; + + ['vertical', 'horizontal', 'dashtopanelMainPanel'].forEach(c => this.panel.actor.remove_style_class_name(c)); + + if (!Main.sessionMode.isLocked) { + [['activities', 0], ['aggregateMenu', -1], ['dateMenu', 0]].forEach(b => { + let container = this.statusArea[b[0]].container; + let originalParent = container._dtpOriginalParent; + + this.panel.actor.remove_child(container); + originalParent ? originalParent.insert_child_at_index(container, b[1]) : null; + delete container._dtpOriginalParent; + }); + } + + if (!this.panel._leftCorner.actor.mapped) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + + this._setShowDesktopButton(false); + + delete Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll; + + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_width); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_height); + } + + if (this._panelConnectId) { + this.panel.actor.disconnect(this._panelConnectId); + } else { + Utils.hookVfunc(this.panel.__proto__, 'allocate', this.panel.__proto__.vfunc_allocate); + } + + this.panel.actor._delegate = this.panel; + } else { + this._removePanelMenu('dateMenu'); + this._removePanelMenu('aggregateMenu'); + this._removePanelMenu('activities'); + } + + Main.ctrlAltTabManager.removeGroup(this); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + + // open overview so they can choose a window for focusing + // and ultimately dropping dragged item onto + if(Main.overview.shouldToggleByCornerOrButton()) + Main.overview.show(); + } + + return DND.DragMotionResult.CONTINUE; + }, + + getPosition: function() { + let position = PanelSettings.getPanelPosition(Me.settings, this.monitor.index); + + if (position == Pos.TOP) { + return St.Side.TOP; + } else if (position == Pos.RIGHT) { + return St.Side.RIGHT; + } else if (position == Pos.BOTTOM) { + return St.Side.BOTTOM; + } + + return St.Side.LEFT; + }, + + checkIfVertical: function() { + let position = this.getPosition(); + + return (position == St.Side.LEFT || position == St.Side.RIGHT); + }, + + getOrientation: function() { + return (this.checkIfVertical() ? 'vertical' : 'horizontal'); + }, + + updateElementPositions: function() { + let panelPositions = this.panelManager.panelsElementPositions[this.monitor.index] || Pos.defaults; + + this._updateGroupedElements(panelPositions); + + this._disablePanelCornerSignals(); + + if (this.getPosition() == St.Side.TOP) { + let visibleElements = panelPositions.filter(pp => pp.visible); + let connectCorner = (corner, button) => { + corner._button = button; + corner._buttonStyleChangedSignalId = button.connect('style-changed', () => { + corner.set_style_pseudo_class(button.get_style_pseudo_class()); + }); + } + + if (visibleElements[0].element == Pos.ACTIVITIES_BTN) { + connectCorner(this.panel._leftCorner, this.statusArea.activities); + } + + if (visibleElements[visibleElements.length - 1].element == Pos.SYSTEM_MENU) { + connectCorner(this.panel._rightCorner, this.statusArea.aggregateMenu); + } + } + + this.panel.actor.hide(); + this.panel.actor.show(); + }, + + _updateGroupedElements: function(panelPositions) { + let previousPosition = 0; + let previousCenteredPosition = 0; + let currentGroup = -1; + + this._elementGroups = []; + + panelPositions.forEach(pos => { + let allocationMap = this.allocationMap[pos.element]; + + if (allocationMap.actor) { + allocationMap.actor.visible = pos.visible; + + if (!pos.visible) { + return; + } + + let currentPosition = pos.position; + let isCentered = Pos.checkIfCentered(currentPosition); + + if (currentPosition == Pos.STACKED_TL && previousPosition == Pos.STACKED_BR) { + currentPosition = Pos.STACKED_BR; + } + + if (!previousPosition || + (previousPosition == Pos.STACKED_TL && currentPosition != Pos.STACKED_TL) || + (previousPosition != Pos.STACKED_BR && currentPosition == Pos.STACKED_BR) || + (isCentered && previousPosition != currentPosition && previousPosition != Pos.STACKED_BR)) { + this._elementGroups[++currentGroup] = { elements: [], index: this._elementGroups.length, expandableIndex: -1 }; + previousCenteredPosition = 0; + } + + if (pos.element == Pos.TASKBAR) { + this._elementGroups[currentGroup].expandableIndex = this._elementGroups[currentGroup].elements.length; + } + + if (isCentered && !this._elementGroups[currentGroup].isCentered) { + this._elementGroups[currentGroup].isCentered = 1; + previousCenteredPosition = currentPosition; + } + + this._elementGroups[currentGroup].position = previousCenteredPosition || currentPosition; + this._elementGroups[currentGroup].elements.push(allocationMap); + + allocationMap.position = currentPosition; + previousPosition = currentPosition; + } + }); + }, + + _disablePanelCornerSignals: function() { + if (this.panel._rightCorner && this.panel._rightCorner._buttonStyleChangedSignalId) { + this.panel._rightCorner._button.disconnect(this.panel._rightCorner._buttonStyleChangedSignalId); + delete this.panel._rightCorner._buttonStyleChangedSignalId; + } + + if (this.panel._leftCorner && this.panel._leftCorner._buttonStyleChangedSignalId) { + this.panel._leftCorner._button.disconnect(this.panel._leftCorner._buttonStyleChangedSignalId); + delete this.panel._leftCorner._buttonStyleChangedSignalId; + } + }, + + _bindSettingsChanges: function() { + let isVertical = this.checkIfVertical(); + + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::panel-sizes', + 'changed::group-apps' + ], + () => this._resetGeometry() + ], + [ + Me.settings, + [ + 'changed::appicon-margin', + 'changed::appicon-padding' + ], + () => this.taskbar.resetAppIcons() + ], + [ + Me.settings, + 'changed::show-appmenu', + () => this._setAppmenuVisible(Me.settings.get_boolean('show-appmenu')) + ], + [ + Me.settings, + [ + 'changed::showdesktop-button-width', + 'changed::trans-use-custom-bg', + 'changed::desktop-line-use-custom-color', + 'changed::desktop-line-custom-color', + 'changed::trans-bg-color' + ], + () => this._setShowDesktopButtonStyle() + ], + [ + Me.desktopSettings, + 'changed::clock-format', + () => { + this._clockFormat = null; + + if (isVertical) { + this._formatVerticalClock(); + } + } + ], + [ + Me.settings, + 'changed::progress-show-bar', + () => this._initProgressManager() + ], + [ + Me.settings, + 'changed::progress-show-count', + () => this._initProgressManager() + ] + ); + + if (isVertical) { + this._signalsHandler.add([Me.settings, 'changed::group-apps-label-max-width', () => this._resetGeometry()]); + } + }, + + _setPanelMenu: function(propName, constr, container) { + if (!this.statusArea[propName]) { + this.statusArea[propName] = this._getPanelMenu(propName, constr); + this.menuManager.addMenu(this.statusArea[propName].menu); + container.insert_child_at_index(this.statusArea[propName].container, 0); + } + }, + + _removePanelMenu: function(propName) { + if (this.statusArea[propName]) { + let parent = this.statusArea[propName].container.get_parent(); + + if (parent) { + parent.remove_actor(this.statusArea[propName].container); + } + + //calling this.statusArea[propName].destroy(); is buggy for now, gnome-shell never + //destroys those panel menus... + //since we can't destroy the menu (hence properly disconnect its signals), let's + //store it so the next time a panel needs one of its kind, we can reuse it instead + //of creating a new one + let panelMenu = this.statusArea[propName]; + + this.menuManager.removeMenu(panelMenu.menu); + Me.persistentStorage[propName].push(panelMenu); + this.statusArea[propName] = null; + } + }, + + _getPanelMenu: function(propName, constr) { + Me.persistentStorage[propName] = Me.persistentStorage[propName] || []; + + if (!Me.persistentStorage[propName].length) { + Me.persistentStorage[propName].push(new constr()); + } + + return Me.persistentStorage[propName].pop(); + }, + + _setPanelGhostSize: function() { + this._myPanelGhost.set_size(this.width, this.checkIfVertical() ? 1 : this.height); + }, + + _setSearchEntryOffset: function(offset) { + if (this.isPrimary) { + //In the overview, when the panel is vertical the search-entry is the only element + //that doesn't natively take into account the size of a side dock, as it is always + //centered relatively to the monitor. This looks misaligned, adjust it here so it + //is centered like the rest of the overview elements. + let paddingSide = this.getPosition() == St.Side.LEFT ? 'left' : 'right'; + let scaleFactor = Utils.getScaleFactor(); + let style = offset ? 'padding-' + paddingSide + ':' + (offset / scaleFactor) + 'px;' : null; + let searchEntry = Main.overview._overview._controls._searchEntry; + searchEntry.get_parent().set_style(style); + } + }, + + _adjustForOverview: function() { + let isFocusedMonitor = this.panelManager.checkIfFocusedMonitor(this.monitor); + let isOverview = !!Main.overview.visibleTarget; + let isOverviewFocusedMonitor = isOverview && isFocusedMonitor; + let isShown = !isOverview || isOverviewFocusedMonitor; + + this.panelBox[isShown ? 'show' : 'hide'](); + + if (isOverview) { + this._myPanelGhost[isOverviewFocusedMonitor ? 'show' : 'hide'](); + + if (isOverviewFocusedMonitor) { + Utils.getPanelGhost().set_size(1, this.geom.position == St.Side.TOP ? 0 : 32); + } + } + }, + + _resetGeometry: function() { + this.geom = this.getGeometry(); + this._setPanelGhostSize(); + this._setPanelPosition(); + this.taskbar.resetAppIcons(true); + this.dynamicTransparency.updateExternalStyle(); + + if (this.intellihide && this.intellihide.enabled) { + this.intellihide.reset(); + } + + if (this.checkIfVertical()) { + this.showAppsIconWrapper.realShowAppsIcon.toggleButton.set_width(this.geom.w); + this._refreshVerticalAlloc(); + this._setSearchEntryOffset(this.geom.w); + } + }, + + getGeometry: function() { + let scaleFactor = Utils.getScaleFactor(); + let panelBoxTheme = this.panelBox.get_theme_node(); + let lrPadding = panelBoxTheme.get_padding(St.Side.RIGHT) + panelBoxTheme.get_padding(St.Side.LEFT); + let topPadding = panelBoxTheme.get_padding(St.Side.TOP); + let tbPadding = topPadding + panelBoxTheme.get_padding(St.Side.BOTTOM); + let position = this.getPosition(); + let length = PanelSettings.getPanelLength(Me.settings, this.monitor.index) / 100; + let anchor = PanelSettings.getPanelAnchor(Me.settings, this.monitor.index); + let anchorPlaceOnMonitor = 0; + let gsTopPanelOffset = 0; + let x = 0, y = 0; + let w = 0, h = 0; + + const panelSize = PanelSettings.getPanelSize(Me.settings, this.monitor.index); + this.dtpSize = panelSize * scaleFactor; + + if (Me.settings.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.primaryMonitor == this.monitor) { + gsTopPanelOffset = Main.layoutManager.panelBox.height - topPadding; + } + + if (this.checkIfVertical()) { + if (!Me.settings.get_boolean('group-apps')) { + // add window title width and side padding of _dtpIconContainer when vertical + this.dtpSize += Me.settings.get_int('group-apps-label-max-width') + AppIcons.DEFAULT_PADDING_SIZE * 2 / scaleFactor; + } + + this.sizeFunc = 'get_preferred_height', + this.fixedCoord = { c1: 'x1', c2: 'x2' }, + this.varCoord = { c1: 'y1', c2: 'y2' }; + + w = this.dtpSize; + h = this.monitor.height * length - tbPadding - gsTopPanelOffset; + } else { + this.sizeFunc = 'get_preferred_width'; + this.fixedCoord = { c1: 'y1', c2: 'y2' }; + this.varCoord = { c1: 'x1', c2: 'x2' }; + + w = this.monitor.width * length - lrPadding; + h = this.dtpSize; + } + + if (position == St.Side.TOP || position == St.Side.LEFT) { + x = this.monitor.x; + y = this.monitor.y + gsTopPanelOffset; + } else if (position == St.Side.RIGHT) { + x = this.monitor.x + this.monitor.width - this.dtpSize - lrPadding; + y = this.monitor.y + gsTopPanelOffset; + } else { //BOTTOM + x = this.monitor.x; + y = this.monitor.y + this.monitor.height - this.dtpSize - tbPadding; + } + + if (this.checkIfVertical()) { + let viewHeight = this.monitor.height - gsTopPanelOffset; + + if (anchor === Pos.MIDDLE) { + anchorPlaceOnMonitor = (viewHeight - h) / 2; + } else if (anchor === Pos.END) { + anchorPlaceOnMonitor = viewHeight - h; + } else { // Pos.START + anchorPlaceOnMonitor = 0; + } + y = y + anchorPlaceOnMonitor; + } else { + if (anchor === Pos.MIDDLE) { + anchorPlaceOnMonitor = (this.monitor.width - w) / 2; + } else if (anchor === Pos.END) { + anchorPlaceOnMonitor = this.monitor.width - w; + } else { // Pos.START + anchorPlaceOnMonitor = 0; + } + x = x + anchorPlaceOnMonitor; + } + + return { + x: x, y: y, + w: w, h: h, + lrPadding: lrPadding, + tbPadding: tbPadding, + position: position + }; + }, + + _setAllocationMap: function() { + this.allocationMap = {}; + let setMap = (name, actor, isBox) => this.allocationMap[name] = { + actor: actor, + isBox: isBox || 0, + box: new Clutter.ActorBox() + }; + + setMap(Pos.SHOW_APPS_BTN, this.showAppsIconWrapper.realShowAppsIcon); + setMap(Pos.ACTIVITIES_BTN, this.statusArea.activities ? this.statusArea.activities.container : 0); + setMap(Pos.LEFT_BOX, this._leftBox, 1); + setMap(Pos.TASKBAR, this.taskbar.actor); + setMap(Pos.CENTER_BOX, this._centerBox, 1); + setMap(Pos.DATE_MENU, this.statusArea.dateMenu.container); + setMap(Pos.SYSTEM_MENU, this.statusArea.aggregateMenu.container); + setMap(Pos.RIGHT_BOX, this._rightBox, 1); + setMap(Pos.DESKTOP_BTN, this._showDesktopButton); + }, + + _mainPanelAllocate: function(actor, box, flags) { + Utils.setAllocation(this.panel.actor, box, flags); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + + let fixed = 0; + let centeredMonitorGroup; + let panelAlloc = new Clutter.ActorBox({ x1: 0, y1: 0, x2: this.geom.w, y2: this.geom.h }); + let assignGroupSize = (group, update) => { + group.size = 0; + group.tlOffset = 0; + group.brOffset = 0; + + group.elements.forEach(element => { + if (!update) { + element.box[this.fixedCoord.c1] = panelAlloc[this.fixedCoord.c1]; + element.box[this.fixedCoord.c2] = panelAlloc[this.fixedCoord.c2]; + element.natSize = element.actor[this.sizeFunc](-1)[1]; + } + + if (!group.isCentered || Pos.checkIfCentered(element.position)) { + group.size += element.natSize; + } else if (element.position == Pos.STACKED_TL) {  + group.tlOffset += element.natSize; + } else { // Pos.STACKED_BR + group.brOffset += element.natSize; + } + }); + + if (group.isCentered) { + group.size += Math.max(group.tlOffset, group.brOffset) * 2; + group.tlOffset = Math.max(group.tlOffset - group.brOffset, 0); + } + }; + let allocateGroup = (group, tlLimit, brLimit) => { + let startPosition = tlLimit; + let currentPosition = 0; + + if (group.expandableIndex >= 0) { + let availableSize = brLimit - tlLimit; + let expandable = group.elements[group.expandableIndex]; + let i = 0; + let l = this._elementGroups.length; + let tlSize = 0; + let brSize = 0; + + if (centeredMonitorGroup && (centeredMonitorGroup != group || expandable.position != Pos.CENTERED_MONITOR)) { + if (centeredMonitorGroup.index < group.index || (centeredMonitorGroup == group && expandable.position == Pos.STACKED_TL)) { + i = centeredMonitorGroup.index; + } else { + l = centeredMonitorGroup.index; + } + } + + for (; i < l; ++i) { + let refGroup = this._elementGroups[i]; + + if (i < group.index && (!refGroup.fixed || refGroup[this.varCoord.c2] > tlLimit)) { + tlSize += refGroup.size; + } else if (i > group.index && (!refGroup.fixed || refGroup[this.varCoord.c1] < brLimit)) { + brSize += refGroup.size; + } + } + + if (group.isCentered) { + availableSize -= Math.max(tlSize, brSize) * 2; + } else { + availableSize -= tlSize + brSize; + } + + if (availableSize < group.size) { + expandable.natSize -= (group.size - availableSize) * (group.isCentered && !Pos.checkIfCentered(expandable.position) ? .5 : 1); + assignGroupSize(group, true); + } + } + + if (group.isCentered) { + startPosition = tlLimit + (brLimit - tlLimit - group.size) * .5; + } else if (group.position == Pos.STACKED_BR) { + startPosition = brLimit - group.size; + } + + currentPosition = group.tlOffset + startPosition; + + group.elements.forEach(element => { + element.box[this.varCoord.c1] = Math.round(currentPosition); + element.box[this.varCoord.c2] = Math.round((currentPosition += element.natSize)); + + if (element.isBox) { + return element.actor.allocate(element.box, flags, true); + } + + Utils.allocate(element.actor, element.box, flags, false); + }); + + group[this.varCoord.c1] = startPosition; + group[this.varCoord.c2] = currentPosition; + group.fixed = 1; + ++fixed; + }; + + Utils.allocate(this.panel.actor, panelAlloc, flags); + + this._elementGroups.forEach(group => { + group.fixed = 0; + + assignGroupSize(group); + + if (group.position == Pos.CENTERED_MONITOR) { + centeredMonitorGroup = group; + } + }); + + if (centeredMonitorGroup) { + allocateGroup(centeredMonitorGroup, panelAlloc[this.varCoord.c1], panelAlloc[this.varCoord.c2]); + } + + let iterations = 0; //failsafe + while (fixed < this._elementGroups.length && ++iterations < 10) { + for (let i = 0, l = this._elementGroups.length; i < l; ++i) { + let group = this._elementGroups[i]; + + if (group.fixed) { + continue; + } + + let prevGroup = this._elementGroups[i - 1]; + let nextGroup = this._elementGroups[i + 1]; + let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : + centeredMonitorGroup && group.index > centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c2] : panelAlloc[this.varCoord.c1]; + let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : + centeredMonitorGroup && group.index < centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c1] : panelAlloc[this.varCoord.c2]; + + if (group.position == Pos.STACKED_TL) { + allocateGroup(group, panelAlloc[this.varCoord.c1], nextLimit); + } else if (group.position == Pos.STACKED_BR) { + allocateGroup(group, prevLimit, panelAlloc[this.varCoord.c2]); + } else if ((!prevGroup || prevGroup.fixed) && (!nextGroup || nextGroup.fixed)) { // CENTERED + allocateGroup(group, prevLimit, nextLimit); + } + } + } + + if (this.geom.position == St.Side.TOP) { + let childBoxLeftCorner = new Clutter.ActorBox(); + let childBoxRightCorner = new Clutter.ActorBox(); + let currentCornerSize = this.cornerSize; + let panelAllocFixedSize = box[this.fixedCoord.c2] - box[this.fixedCoord.c1]; + + [ , this.cornerSize] = this.panel._leftCorner.actor[this.sizeFunc](-1); + childBoxLeftCorner[this.varCoord.c1] = 0; + childBoxLeftCorner[this.varCoord.c2] = this.cornerSize; + childBoxLeftCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxLeftCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + childBoxRightCorner[this.varCoord.c1] = box[this.varCoord.c2] - this.cornerSize; + childBoxRightCorner[this.varCoord.c2] = box[this.varCoord.c2]; + childBoxRightCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxRightCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + Utils.allocate(this.panel._leftCorner.actor, childBoxLeftCorner, flags); + Utils.allocate(this.panel._rightCorner.actor, childBoxRightCorner, flags); + + if (this.cornerSize != currentCornerSize) { + this._setPanelClip(); + } + } + }, + + _setPanelPosition: function() { + let clipContainer = this.panelBox.get_parent(); + + this.set_size(this.geom.w, this.geom.h); + clipContainer.set_position(this.geom.x, this.geom.y); + + this._setVertical(this.panel.actor, this.checkIfVertical()); + + // styles for theming + Object.keys(St.Side).forEach(p => { + let cssName = 'dashtopanel' + p.charAt(0) + p.slice(1).toLowerCase(); + + this.panel.actor[(St.Side[p] == this.geom.position ? 'add' : 'remove') + '_style_class_name'](cssName); + }); + + this._setPanelClip(clipContainer); + + Main.layoutManager._updateHotCorners(); + Main.layoutManager._updatePanelBarrier(this); + }, + + _setPanelClip: function(clipContainer) { + clipContainer = clipContainer || this.panelBox.get_parent(); + this._timeoutsHandler.add([T7, 0, () => Utils.setClip(clipContainer, clipContainer.x, clipContainer.y, this.panelBox.width, this.panelBox.height + this.cornerSize)]); + }, + + _onButtonPress: function(actor, event) { + let type = event.type(); + let isPress = type == Clutter.EventType.BUTTON_PRESS; + let button = isPress ? event.get_button() : -1; + let [stageX, stageY] = event.get_coords(); + + if (button == 3 && global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, stageX, stageY) == this.panel.actor) { + //right click on an empty part of the panel, temporarily borrow and display the showapps context menu + Main.layoutManager.setDummyCursorGeometry(stageX, stageY, 0, 0); + + this.showAppsIconWrapper.createMenu(); + this.showAppsIconWrapper._menu.sourceActor = Main.layoutManager.dummyCursor; + this.showAppsIconWrapper.popupMenu(); + + return Clutter.EVENT_STOP; + } else if (Main.modalCount > 0 || event.get_source() != actor || + (!isPress && type != Clutter.EventType.TOUCH_BEGIN) || + (isPress && button != 1)) { + return Clutter.EVENT_PROPAGATE; + } + + let params = this.checkIfVertical() ? [stageY, 'y', 'height'] : [stageX, 'x', 'width']; + let dragWindow = this._getDraggableWindowForPosition.apply(this, params.concat(['maximized_' + this.getOrientation() + 'ly'])); + + if (!dragWindow) + return Clutter.EVENT_PROPAGATE; + + global.display.begin_grab_op(dragWindow, + Meta.GrabOp.MOVING, + false, /* pointer grab */ + true, /* frame action */ + button, + event.get_state(), + event.get_time(), + stageX, stageY); + + return Clutter.EVENT_STOP; + }, + + _getDraggableWindowForPosition: function(stageCoord, coord, dimension, maximizedProp) { + let workspace = Utils.getCurrentWorkspace(); + let allWindowsByStacking = global.display.sort_windows_by_stacking( + workspace.list_windows() + ).reverse(); + + return Utils.find(allWindowsByStacking, metaWindow => { + let rect = metaWindow.get_frame_rect(); + + return metaWindow.get_monitor() == this.monitor.index && + metaWindow.showing_on_its_workspace() && + metaWindow.get_window_type() != Meta.WindowType.DESKTOP && + metaWindow[maximizedProp] && + stageCoord > rect[coord] && stageCoord < rect[coord] + rect[dimension]; + }); + }, + + _onBoxActorAdded: function(box) { + if (this.checkIfVertical()) { + this._setVertical(box, true); + } + }, + + _refreshVerticalAlloc: function() { + this._setVertical(this._centerBox, true); + this._setVertical(this._rightBox, true); + this._formatVerticalClock(); + }, + + _setVertical: function(actor, isVertical) { + let _set = (actor, isVertical) => { + if (!actor || actor instanceof Dash.DashItemContainer || actor instanceof Taskbar.TaskbarItemContainer) { + return; + } + + if (actor instanceof St.BoxLayout) { + actor.vertical = isVertical; + } else if ((actor._delegate || actor) instanceof PanelMenu.ButtonBox && actor != this.statusArea.appMenu) { + let child = actor.get_first_child(); + + if (isVertical && !actor.visible && !actor._dtpVisibleId) { + this._unmappedButtons.push(actor); + actor._dtpVisibleId = actor.connect('notify::visible', () => { + this._disconnectVisibleId(actor); + this._refreshVerticalAlloc(); + }); + actor._dtpDestroyId = actor.connect('destroy', () => this._disconnectVisibleId(actor)); + } + + if (child) { + let [, natWidth] = actor.get_preferred_width(-1); + + child.x_align = Clutter.ActorAlign[isVertical ? 'CENTER' : 'START']; + actor.set_width(isVertical ? this.dtpSize : -1); + isVertical = isVertical && (natWidth > this.dtpSize); + actor[(isVertical ? 'add' : 'remove') + '_style_class_name']('vertical'); + } + } + + actor.get_children().forEach(c => _set(c, isVertical)); + }; + + _set(actor, false); + _set(actor, isVertical); + }, + + _disconnectVisibleId: function(actor) { + actor.disconnect(actor._dtpVisibleId); + actor.disconnect(actor._dtpDestroyId); + + delete actor._dtpVisibleId; + delete actor._dtpDestroyId; + + this._unmappedButtons.splice(this._unmappedButtons.indexOf(actor), 1); + }, + + _setAppmenuVisible: function(isVisible) { + let parent; + let appMenu = this.statusArea.appMenu; + + if(appMenu) + parent = appMenu.container.get_parent(); + + if (parent) { + parent.remove_child(appMenu.container); + } + + if (isVisible && appMenu) { + this._leftBox.insert_child_above(appMenu.container, null); + } + }, + + _formatVerticalClock: function() { + // https://github.com/GNOME/gnome-desktop/blob/master/libgnome-desktop/gnome-wall-clock.c#L310 + if (this.statusArea.dateMenu) { + let datetime = this.statusArea.dateMenu._clock.clock; + let datetimeParts = datetime.split(' '); + let time = datetimeParts[1]; + let clockText = this.statusArea.dateMenu._clockDisplay.clutter_text; + let setClockText = text => { + let stacks = text instanceof Array; + let separator = '\n‧‧\n'; + + clockText.set_text((stacks ? text.join(separator) : text).trim()); + clockText.set_use_markup(stacks); + clockText.get_allocation_box(); + + return !clockText.get_layout().is_ellipsized(); + }; + + if (clockText.ellipsize == Pango.EllipsizeMode.NONE) { + //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back + clockText.ellipsize = Pango.EllipsizeMode.END; + } + + if (!time) { + datetimeParts = datetime.split(' '); + time = datetimeParts.pop(); + datetimeParts = [datetimeParts.join(' '), time]; + } + + if (!setClockText(datetime) && + !setClockText(datetimeParts) && + !setClockText(time)) { + let timeParts = time.split('∶'); + + if (!this._clockFormat) { + this._clockFormat = Me.desktopSettings.get_string('clock-format'); + } + + if (this._clockFormat == '12h') { + timeParts.push.apply(timeParts, timeParts.pop().split(' ')); + } + + setClockText(timeParts); + } + } + }, + + _setShowDesktopButton: function (add) { + if (add) { + if(this._showDesktopButton) + return; + + this._showDesktopButton = new St.Bin({ style_class: 'showdesktop-button', + reactive: true, + can_focus: true, + // x_fill: true, + // y_fill: true, + track_hover: true }); + + this._setShowDesktopButtonStyle(); + + this._showDesktopButton.connect('button-press-event', () => this._onShowDesktopButtonPress()); + this._showDesktopButton.connect('enter-event', () => { + this._showDesktopButton.add_style_class_name(this._getBackgroundBrightness() ? + 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); + + if (Me.settings.get_boolean('show-showdesktop-hover')) { + this._timeoutsHandler.add([T4, Me.settings.get_int('show-showdesktop-delay'), () => { + this._hiddenDesktopWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + this._toggleWorkspaceWindows(true, this._hiddenDesktopWorkspace); + }]); + } + }); + + this._showDesktopButton.connect('leave-event', () => { + this._showDesktopButton.remove_style_class_name(this._getBackgroundBrightness() ? + 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); + + if (Me.settings.get_boolean('show-showdesktop-hover')) { + if (this._timeoutsHandler.getId(T4)) { + this._timeoutsHandler.remove(T4); + } else if (this._hiddenDesktopWorkspace) { + this._toggleWorkspaceWindows(false, this._hiddenDesktopWorkspace); + } +  } + }); + + this.panel.actor.add_child(this._showDesktopButton); + } else { + if(!this._showDesktopButton) + return; + + this.panel.actor.remove_child(this._showDesktopButton); + this._showDesktopButton.destroy(); + this._showDesktopButton = null; + } + }, + + _setShowDesktopButtonStyle: function() { + let rgb = this._getBackgroundBrightness() ? "rgba(55, 55, 55, .2)" : "rgba(200, 200, 200, .2)"; + + let isLineCustom = Me.settings.get_boolean('desktop-line-use-custom-color'); + rgb = isLineCustom ? Me.settings.get_string('desktop-line-custom-color') : rgb; + + if (this._showDesktopButton) { + let buttonSize = Me.settings.get_int('showdesktop-button-width') + 'px;'; + let isVertical = this.checkIfVertical(); + + let sytle = "border: 0 solid " + rgb + ";"; + sytle += isVertical ? 'border-top-width:1px;height:' + buttonSize : 'border-left-width:1px;width:' + buttonSize; + + this._showDesktopButton.set_style(sytle); + this._showDesktopButton[(isVertical ? 'x' : 'y') + '_expand'] = true; + } + }, + + // _getBackgroundBrightness: return true if panel has a bright background color + _getBackgroundBrightness: function() { + return Utils.checkIfColorIsBright(this.dynamicTransparency.backgroundColorRgb); + }, + + _toggleWorkspaceWindows: function(hide, workspace) { + let time = Me.settings.get_int('show-showdesktop-time') * .001; + + workspace.list_windows().forEach(w => { + if (!w.minimized) { + let tweenOpts = { + opacity: hide ? 0 : 255, + time: time, + transition: 'easeOutQuad' + }; + + Utils.animateWindowOpacity(w.get_compositor_private(), tweenOpts); + } + }); + }, + + _onShowDesktopButtonPress: function() { + let label = 'trackerFocusApp'; + + this._signalsHandler.removeWithLabel(label); + this._timeoutsHandler.remove(T5); + + if(this._restoreWindowList && this._restoreWindowList.length) { + this._timeoutsHandler.remove(T4); + + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows(); + this._restoreWindowList.forEach(function(w) { + if(windows.indexOf(w) > -1) + Main.activateWindow(w); + }); + this._restoreWindowList = null; + } else { + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows().filter(function (w) { + return w.showing_on_its_workspace() && !w.skip_taskbar; + }); + windows = global.display.sort_windows_by_stacking(windows); + + windows.forEach(function(w) { + w.minimize(); + }); + + this._restoreWindowList = windows; + + this._timeoutsHandler.add([T5, 20, () => this._signalsHandler.addWithLabel( + label, + [ + tracker, + 'notify::focus-app', + () => this._restoreWindowList = null + ] + )]); + } + + Main.overview.hide(); + }, + + _onPanelMouseScroll: function(actor, event) { + let scrollAction = Me.settings.get_string('scroll-panel-action'); + let direction = Utils.getMouseScrollDirection(event); + + if (!this._checkIfIgnoredScrollSource(event.get_source()) && !this._timeoutsHandler.getId(T6)) { + if (direction && scrollAction === 'SWITCH_WORKSPACE') { + let args = [global.display]; + + //adjust for horizontal workspaces + if (Utils.DisplayWrapper.getWorkspaceManager().layout_rows === 1) { + direction = direction == 'up' ? 'left' : 'right'; + } + + //gnome-shell < 3.30 needs an additional "screen" param + global.screen ? args.push(global.screen) : 0; + + let showWsPopup = Me.settings.get_boolean('scroll-panel-show-ws-popup'); + showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = { display: () => {} }; + Main.wm._showWorkspaceSwitcher.apply(Main.wm, args.concat([0, { get_name: () => 'switch---' + direction }])); + showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = null; + } else if (direction && scrollAction === 'CYCLE_WINDOWS') { + let windows = this.taskbar.getAppInfos().reduce((ws, appInfo) => ws.concat(appInfo.windows), []); + + Utils.activateSiblingWindow(windows, direction); + } else if (scrollAction === 'CHANGE_VOLUME' && !event.is_pointer_emulated()) { + var proto = Volume.Indicator.prototype; + var func = proto._handleScrollEvent || proto.vfunc_scroll_event || proto._onScrollEvent; + + func.call(Main.panel.statusArea.aggregateMenu._volume, 0, event); + } else { + return; + } + + var scrollDelay = Me.settings.get_int('scroll-panel-delay'); + + if (scrollDelay) { + this._timeoutsHandler.add([T6, scrollDelay, () => {}]); + } + } + }, + + _checkIfIgnoredScrollSource: function(source) { + let ignoredConstr = ['WorkspaceIndicator']; + + return source.get_parent()._dtpIgnoreScroll || ignoredConstr.indexOf(source.constructor.name) >= 0; + }, + + _initProgressManager: function() { + if(!this.progressManager && (Me.settings.get_boolean('progress-show-bar') || Me.settings.get_boolean('progress-show-count'))) + this.progressManager = new Progress.ProgressManager(); + }, +}); + +var dtpSecondaryPanel = Utils.defineClass({ + Name: 'DashToPanel-SecondaryPanel', + Extends: St.Widget, + + _init: function(params) { + this.callParent('_init', params); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + } +}); + +var dtpSecondaryAggregateMenu = Utils.defineClass({ + Name: 'DashToPanel-SecondaryAggregateMenu', + Extends: PanelMenu.Button, + + _init: function() { + this.callParent('_init', 0.0, C_("System menu in the top bar", "System"), false); + + Utils.wrapActor(this); + + this.menu.actor.add_style_class_name('aggregate-menu'); + + let menuLayout = new Panel.AggregateLayout(); + this.menu.box.set_layout_manager(menuLayout); + + this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); + this.actor.add_child(this._indicators); + + this._power = new imports.ui.status.power.Indicator(); + this._volume = new imports.ui.status.volume.Indicator(); + this._brightness = new imports.ui.status.brightness.Indicator(); + this._system = new imports.ui.status.system.Indicator(); + + if (Config.PACKAGE_VERSION >= '3.28') { + this._thunderbolt = new imports.ui.status.thunderbolt.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._thunderbolt)); + } + + if (Config.PACKAGE_VERSION < '3.37') { + this._screencast = new imports.ui.status.screencast.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._screencast)); + } + + if (Config.PACKAGE_VERSION >= '3.24') { + this._nightLight = new imports.ui.status.nightLight.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._nightLight)); + } + + if (Config.HAVE_NETWORKMANAGER && Config.PACKAGE_VERSION >= '3.24') { + this._network = new imports.ui.status.network.NMApplet(); + this._indicators.add_child(Utils.getIndicators(this._network)); + } + + if (Config.HAVE_BLUETOOTH) { + this._bluetooth = new imports.ui.status.bluetooth.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._bluetooth)); + } + + this._indicators.add_child(Utils.getIndicators(this._volume)); + this._indicators.add_child(Utils.getIndicators(this._power)); + + this.menu.addMenuItem(this._volume.menu); + this._volume._volumeMenu._readOutput(); + this._volume._volumeMenu._readInput(); + + this.menu.addMenuItem(this._brightness.menu); + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + if (this._network) { + this.menu.addMenuItem(this._network.menu); + } + + if (this._bluetooth) { + this.menu.addMenuItem(this._bluetooth.menu); + } + + this.menu.addMenuItem(this._power.menu); + this._power._sync(); + + if (this._nightLight) { + this.menu.addMenuItem(this._nightLight.menu); + } + + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this.menu.addMenuItem(this._system.menu); + + menuLayout.addSizeChild(this._power.menu.actor); + menuLayout.addSizeChild(this._system.menu.actor); + }, +}); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js new file mode 100644 index 0000000..d572d8b --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js @@ -0,0 +1,789 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Overview = Me.imports.overview; +const Panel = Me.imports.panel; +const PanelSettings = Me.imports.panelSettings; +const Proximity = Me.imports.proximity; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +const Config = imports.misc.config; +const Lang = imports.lang; +const Gi = imports._gi; +const GLib = imports.gi.GLib; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +const AppDisplay = imports.ui.appDisplay; +const BoxPointer = imports.ui.boxpointer; +const Dash = imports.ui.dash; +const IconGrid = imports.ui.iconGrid; +const LookingGlass = imports.ui.lookingGlass; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const Layout = imports.ui.layout; +const WM = imports.ui.windowManager; +const WorkspacesView = imports.ui.workspacesView; + +var dtpPanelManager = Utils.defineClass({ + Name: 'DashToPanel.PanelManager', + + _init: function() { + this.overview = new Overview.dtpOverview(); + this.panelsElementPositions = {}; + + this._saveMonitors(); + + Utils.getAppDisplayViews().forEach(v => { + Utils.wrapActor(v.view); + Utils.wrapActor(v.view._grid); + }); + }, + + enable: function(reset) { + let dtpPrimaryIndex = Me.settings.get_int('primary-monitor'); + + this.dtpPrimaryMonitor = Main.layoutManager.monitors[dtpPrimaryIndex] || Main.layoutManager.primaryMonitor; + this.proximityManager = new Proximity.ProximityManager(); + + this._oldGetShowAppsButton = imports.ui.main.overview.dash.showAppsButton; + + Utils.wrapActor(Main.panel); + Utils.wrapActor(Main.overview.dash || 0); + + this.primaryPanel = this._createPanel(this.dtpPrimaryMonitor, Me.settings.get_boolean('stockgs-keep-top-panel')); + this.allPanels = [ this.primaryPanel ]; + + this.overview.enable(this.primaryPanel); + + if (Me.settings.get_boolean('multi-monitors')) { + Main.layoutManager.monitors.filter(m => m != this.dtpPrimaryMonitor).forEach(m => { + this.allPanels.push(this._createPanel(m, true)); + }); + } + + global.dashToPanel.panels = this.allPanels; + global.dashToPanel.emit('panels-created'); + + this.allPanels.forEach(p => { + let panelPosition = p.getPosition(); + let leftOrRight = (panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT); + + p.panelBox.set_size( + leftOrRight ? -1 : p.geom.w + p.geom.lrPadding, + leftOrRight ? p.geom.h + p.geom.tbPadding : -1 + ); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => this._adjustPanelMenuButton(pmb, p.monitor, panelPosition)); + + p.taskbar.iconAnimator.start(); + }); + + //in 3.32, BoxPointer now inherits St.Widget + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + let panelManager = this; + + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', function(forWidth) { + let alloc = { min_size: 0, natural_size: 0 }; + + [alloc.min_size, alloc.natural_size] = this.vfunc_get_preferred_height(forWidth); + + return panelManager._getBoxPointerPreferredHeight(this, alloc); + }); + } + + this._updatePanelElementPositions(); + this.setFocusedMonitor(this.dtpPrimaryMonitor); + + if (this.primaryPanel.checkIfVertical()) { + Main.wm._getPositionForDirection = newGetPositionForDirection; + } + + if (reset) return; + + if (Config.PACKAGE_VERSION > '3.35.1') { + this._oldDoSpringAnimation = AppDisplay.BaseAppView.prototype._doSpringAnimation; + AppDisplay.BaseAppView.prototype._doSpringAnimation = newDoSpringAnimation; + } + + this._oldUpdatePanelBarrier = Main.layoutManager._updatePanelBarrier; + Main.layoutManager._updatePanelBarrier = (panel) => { + let panelUpdates = panel ? [panel] : this.allPanels; + + panelUpdates.forEach(p => newUpdatePanelBarrier.call(Main.layoutManager, p)); + }; + Main.layoutManager._updatePanelBarrier(); + + this._oldUpdateHotCorners = Main.layoutManager._updateHotCorners; + Main.layoutManager._updateHotCorners = Lang.bind(Main.layoutManager, newUpdateHotCorners); + Main.layoutManager._updateHotCorners(); + + this._forceHotCornerId = Me.settings.connect('changed::stockgs-force-hotcorner', () => Main.layoutManager._updateHotCorners()); + + if (Main.layoutManager._interfaceSettings) { + this._enableHotCornersId = Main.layoutManager._interfaceSettings.connect('changed::enable-hot-corners', () => Main.layoutManager._updateHotCorners()); + } + + Main.overview.getShowAppsButton = this._newGetShowAppsButton.bind(this); + + this._needsDashItemContainerAllocate = !Dash.DashItemContainer.prototype.hasOwnProperty('vfunc_allocate'); + + if (this._needsDashItemContainerAllocate) { + Utils.hookVfunc(Dash.DashItemContainer.prototype, 'allocate', this._newDashItemContainerAllocate); + } + + LookingGlass.LookingGlass.prototype._oldResize = LookingGlass.LookingGlass.prototype._resize; + LookingGlass.LookingGlass.prototype._resize = _newLookingGlassResize; + + LookingGlass.LookingGlass.prototype._oldOpen = LookingGlass.LookingGlass.prototype.open; + LookingGlass.LookingGlass.prototype.open = _newLookingGlassOpen; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + if (Config.PACKAGE_VERSION > '3.35.9') { + let currentAppsView; + + this._oldAnimateIconPosition = IconGrid.animateIconPosition; + IconGrid.animateIconPosition = newAnimateIconPosition.bind(this); + + this._signalsHandler.add( + [ + Utils.DisplayWrapper.getScreen(), + 'window-entered-monitor', + () => this._needsIconAllocate = 1 + ] + ); + + Utils.getAppDisplayViews().forEach(v => { + if (!v.control || v.control.has_style_pseudo_class('checked')) { + currentAppsView = v; + } + + if (v.control) { + this._signalsHandler.add( + [ + v.control, + 'clicked', + () => { + this._needsIconAllocate = currentAppsView != v; + currentAppsView = v; + } + ] + ); + } + + this._signalsHandler.add( + [ + v.view, + 'notify::visible', + () => this._needsIconAllocate = !(currentAppsView != v && !v.view.visible) + ], + [ + v.view._grid, + 'animation-done', + () => this._needsIconAllocate = 0 + ] + ); + }); + } + + //listen settings + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::primary-monitor', + 'changed::multi-monitors', + 'changed::isolate-monitors', + 'changed::panel-positions', + 'changed::panel-lengths', + 'changed::panel-anchors', + 'changed::stockgs-keep-top-panel' + ], + () => this._reset() + ], + [ + Me.settings, + 'changed::panel-element-positions', + () => this._updatePanelElementPositions() + ], + [ + Me.settings, + 'changed::intellihide-key-toggle-text', + () => this._setKeyBindings(true) + ], + [ + Utils.DisplayWrapper.getMonitorManager(), + 'monitors-changed', + () => { + if (Main.layoutManager.primaryMonitor) { + this._saveMonitors(); + this._reset(); + } + } + ] + ); + + Panel.panelBoxes.forEach(c => this._signalsHandler.add( + [Main.panel[c], 'actor-added', (parent, child) => this._adjustPanelMenuButton(this._getPanelMenuButton(child), this.primaryPanel.monitor, this.primaryPanel.getPosition())] + )); + + this._setKeyBindings(true); + + // keep GS overview.js from blowing away custom panel styles + if(!Me.settings.get_boolean('stockgs-keep-top-panel')) + Object.defineProperty(Main.panel, "style", {configurable: true, set: function(v) {}}); + }, + + disable: function(reset) { + this.overview.disable(); + this.proximityManager.destroy(); + + this.allPanels.forEach(p => { + p.taskbar.iconAnimator.pause(); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => { + if (pmb.menu._boxPointer._dtpGetPreferredHeightId) { + pmb.menu._boxPointer._container.disconnect(pmb.menu._boxPointer._dtpGetPreferredHeightId); + } + + pmb.menu._boxPointer.sourceActor = pmb.menu._boxPointer._dtpSourceActor; + delete pmb.menu._boxPointer._dtpSourceActor; + pmb.menu._boxPointer._userArrowSide = St.Side.TOP; + }) + + this._removePanelBarriers(p); + + p.disable(); + + let clipContainer = p.panelBox.get_parent(); + + Main.layoutManager._untrackActor(p.panelBox); + Main.layoutManager.removeChrome(clipContainer); + + if (p.isStandalone) { + p.panelBox.destroy(); + } else { + p.panelBox.remove_child(p); + p.remove_child(p.panel.actor); + p.panelBox.add(p.panel.actor); + + p.panelBox.set_position(clipContainer.x, clipContainer.y); + + clipContainer.remove_child(p.panelBox); + Main.layoutManager.addChrome(p.panelBox, { affectsStruts: true, trackFullscreen: true }); + } + }); + + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height); + } + + delete Main.wm._getPositionForDirection; + + if (Main.layoutManager.primaryMonitor) { + Main.layoutManager.panelBox.set_position(Main.layoutManager.primaryMonitor.x, Main.layoutManager.primaryMonitor.y); + Main.layoutManager.panelBox.set_size(Main.layoutManager.primaryMonitor.width, -1); + } + + if (reset) return; + + this._setKeyBindings(false); + + this._signalsHandler.destroy(); + + Main.layoutManager._updateHotCorners = this._oldUpdateHotCorners; + Main.layoutManager._updateHotCorners(); + + Me.settings.disconnect(this._forceHotCornerId); + + if (this._enableHotCornersId) { + Main.layoutManager._interfaceSettings.disconnect(this._enableHotCornersId); + } + + Main.layoutManager._updatePanelBarrier = this._oldUpdatePanelBarrier; + Main.layoutManager._updatePanelBarrier(); + + Utils.getPanelGhost().set_size(-1, -1); + + if (this._oldDoSpringAnimation) { + AppDisplay.BaseAppView.prototype._doSpringAnimation = this._oldDoSpringAnimation; + } + + if (this._oldAnimateIconPosition) { + IconGrid.animateIconPosition = this._oldAnimateIconPosition; + } + + LookingGlass.LookingGlass.prototype._resize = LookingGlass.LookingGlass.prototype._oldResize; + delete LookingGlass.LookingGlass.prototype._oldResize; + + LookingGlass.LookingGlass.prototype.open = LookingGlass.LookingGlass.prototype._oldOpen; + delete LookingGlass.LookingGlass.prototype._oldOpen + + delete Main.panel.style; + }, + + setFocusedMonitor: function(monitor, ignoreRelayout) { + // todo show overview on non primary monitor is not working right now on gnome40 + + // this._needsIconAllocate = 1; + + // if (!this.checkIfFocusedMonitor(monitor)) { + // Main.overview._overview._controls._workspacesDisplay._primaryIndex = monitor.index; + + // Main.overview._overview.clear_constraints(); + // Main.overview._overview.add_constraint(new Layout.MonitorConstraint({ index: monitor.index })); + // } + }, + + _saveMonitors: function() { + //Mutter meta_monitor_manager_get_primary_monitor (global.display.get_primary_monitor()) doesn't return the same + //monitor as GDK gdk_screen_get_primary_monitor (imports.gi.Gdk.Screen.get_default().get_primary_monitor()). + //Since the Mutter function is what's used in gnome-shell and we can't access it from the settings dialog, store + //the monitors information in a setting so we can use the same monitor indexes as the ones in gnome-shell + let primaryIndex = Main.layoutManager.primaryIndex; + let monitors = [primaryIndex]; + + Main.layoutManager.monitors.filter(m => m.index != primaryIndex).forEach(m => monitors.push(m.index)); + Me.settings.set_value('available-monitors', new GLib.Variant('ai', monitors)); + }, + + checkIfFocusedMonitor: function(monitor) { + return Main.overview._overview._controls._workspacesDisplay._primaryIndex == monitor.index; + }, + + _createPanel: function(monitor, isStandalone) { + let panelBox; + let panel; + let clipContainer = new Clutter.Actor(); + + if (isStandalone) { + panelBox = new St.BoxLayout({ name: 'panelBox' }); + } else { + panelBox = Main.layoutManager.panelBox; + Main.layoutManager._untrackActor(panelBox); + panelBox.remove_child(Main.panel.actor); + Main.layoutManager.removeChrome(panelBox); + } + + Main.layoutManager.addChrome(clipContainer, { affectsInputRegion: false }); + clipContainer.add_child(panelBox); + Main.layoutManager.trackChrome(panelBox, { trackFullscreen: true, affectsStruts: true, affectsInputRegion: true }); + + panel = new Panel.dtpPanel(this, monitor, panelBox, isStandalone); + panelBox.add(panel); + panel.enable(); + + panelBox.visible = true; + if (monitor.inFullscreen) { + panelBox.hide(); + } + panelBox.set_position(0, 0); + + return panel; + }, + + _reset: function() { + this.disable(true); + this.allPanels = []; + this.enable(true); + }, + + _updatePanelElementPositions: function() { + this.panelsElementPositions = PanelSettings.getSettingsJson(Me.settings, 'panel-element-positions'); + this.allPanels.forEach(p => p.updateElementPositions()); + }, + + _adjustPanelMenuButton: function(button, monitor, arrowSide) { + if (button) { + Utils.wrapActor(button); + button.menu._boxPointer._dtpSourceActor = button.menu._boxPointer.sourceActor; + button.menu._boxPointer.sourceActor = button.actor; + button.menu._boxPointer._userArrowSide = arrowSide; + button.menu._boxPointer._dtpInPanel = 1; + + if (!button.menu._boxPointer.vfunc_get_preferred_height) { + button.menu._boxPointer._dtpGetPreferredHeightId = button.menu._boxPointer._container.connect('get-preferred-height', (actor, forWidth, alloc) => { + this._getBoxPointerPreferredHeight(button.menu._boxPointer, alloc, monitor); + }); + } + } + }, + + _getBoxPointerPreferredHeight: function(boxPointer, alloc, monitor) { + if (boxPointer._dtpInPanel && boxPointer.sourceActor && Me.settings.get_boolean('intellihide')) { + monitor = monitor || Main.layoutManager.findMonitorForActor(boxPointer.sourceActor); + let panel = Utils.find(global.dashToPanel.panels, p => p.monitor == monitor); + let excess = alloc.natural_size + panel.dtpSize + 10 - monitor.height; // 10 is arbitrary + + if (excess > 0) { + alloc.natural_size -= excess; + } + } + + return [alloc.min_size, alloc.natural_size]; + }, + + _findPanelMenuButtons: function(container) { + let panelMenuButtons = []; + let panelMenuButton; + + let find = parent => parent.get_children().forEach(c => { + if ((panelMenuButton = this._getPanelMenuButton(c))) { + panelMenuButtons.push(panelMenuButton); + } + + find(c); + }); + + find(container); + + return panelMenuButtons; + }, + + _removePanelBarriers: function(panel) { + if (panel.isStandalone && panel._rightPanelBarrier) { + panel._rightPanelBarrier.destroy(); + } + + if (panel._leftPanelBarrier) { + panel._leftPanelBarrier.destroy(); + delete panel._leftPanelBarrier; + } + }, + + _getPanelMenuButton: function(obj) { + return obj._delegate && obj._delegate instanceof PanelMenu.Button ? obj._delegate : 0; + }, + + _setKeyBindings: function(enable) { + let keys = { + 'intellihide-key-toggle': () => this.allPanels.forEach(p => p.intellihide.toggle()) + }; + + Object.keys(keys).forEach(k => { + Utils.removeKeybinding(k); + + if (enable) { + Utils.addKeybinding(k, Me.settings, keys[k], Shell.ActionMode.NORMAL); + } + }); + }, + + _newGetShowAppsButton: function() { + let focusedMonitorIndex = Utils.findIndex(this.allPanels, p => this.checkIfFocusedMonitor(p.monitor)); + + return this.allPanels[focusedMonitorIndex].taskbar.showAppsButton; + } +}); + +// This class drives long-running icon animations, to keep them running in sync +// with each other. +var IconAnimator = Utils.defineClass({ + Name: 'DashToPanel.IconAnimator', + + _init: function(actor) { + this._count = 0; + this._started = false; + this._animations = { + dance: [], + }; + this._timeline = new Clutter.Timeline({ + duration: 3000, + repeat_count: -1, + }); + + /* Just use the construction property when no need to support 3.36 */ + if (this._timeline.set_actor) + this._timeline.set_actor(actor); + + this._timeline.connect('new-frame', () => { + const progress = this._timeline.get_progress(); + const danceRotation = progress < 1/6 ? 15*Math.sin(progress*24*Math.PI) : 0; + const dancers = this._animations.dance; + for (let i = 0, iMax = dancers.length; i < iMax; i++) { + dancers[i].target.rotation_angle_z = danceRotation; + } + }); + }, + + destroy: function() { + this._timeline.stop(); + this._timeline = null; + for (let name in this._animations) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + pair.target.disconnect(pair.targetDestroyId); + } + } + this._animations = null; + }, + + pause: function() { + if (this._started && this._count > 0) { + this._timeline.stop(); + } + this._started = false; + }, + + start: function() { + if (!this._started && this._count > 0) { + this._timeline.start(); + } + this._started = true; + }, + + addAnimation: function(target, name) { + const targetDestroyId = target.connect('destroy', () => this.removeAnimation(target, name)); + this._animations[name].push({ target: target, targetDestroyId: targetDestroyId }); + if (this._started && this._count === 0) { + this._timeline.start(); + } + this._count++; + }, + + removeAnimation: function(target, name) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + if (pair.target === target) { + target.disconnect(pair.targetDestroyId); + pairs.splice(i, 1); + this._count--; + if (this._started && this._count === 0) { + this._timeline.stop(); + } + return; + } + } + } +}); + +function newGetPositionForDirection(direction, fromWs, toWs) { + let [xDest, yDest] = WM.WindowManager.prototype._getPositionForDirection(direction, fromWs, toWs); + + if (direction == Meta.MotionDirection.UP || + direction == Meta.MotionDirection.UP_LEFT || + direction == Meta.MotionDirection.UP_RIGHT) { + yDest -= Main.panel.height; + } else if (direction != Meta.MotionDirection.LEFT && + direction != Meta.MotionDirection.RIGHT) { + yDest += Main.panel.height; + } + + return [xDest, yDest]; +} + +function newDoSpringAnimation(animationDirection) { + this._grid.opacity = 255; + this._grid.animateSpring(animationDirection, Main.overview.getShowAppsButton()); +} + +function newAnimateIconPosition(icon, box, flags, nChangedIcons) { + if (this._needsIconAllocate) { + Utils.allocate(icon, box, flags); + return; + } + + return this._oldAnimateIconPosition(icon, box, flags, nChangedIcons);; +} + +function newUpdateHotCorners() { + // destroy old hot corners + this.hotCorners.forEach(function(corner) { + if (corner) + corner.destroy(); + }); + this.hotCorners = []; + + //global.settings is ubuntu specific setting to disable the hot corner (Tweak tool > Top Bar > Activities Overview Hot Corner) + //this._interfaceSettings is for the setting to disable the hot corner introduced in gnome-shell 3.34 + if ((global.settings.list_keys().indexOf('enable-hot-corners') >= 0 && !global.settings.get_boolean('enable-hot-corners')) || + (this._interfaceSettings && !this._interfaceSettings.get_boolean('enable-hot-corners'))) { + this.emit('hot-corners-changed'); + return; + } + + // build new hot corners + for (let i = 0; i < this.monitors.length; i++) { + let panel = Utils.find(global.dashToPanel.panels, p => p.monitor.index == i); + let panelPosition = panel ? panel.getPosition() : St.Side.BOTTOM; + let panelTopLeft = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT; + let monitor = this.monitors[i]; + let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x; + let cornerY = monitor.y; + + let haveTopLeftCorner = true; + + // If the panel is on the bottom, unless this is explicitly forced, don't add a topleft + // hot corner unless it is actually a top left panel. Otherwise, it stops the mouse + // as you are dragging across. In the future, maybe we will automatically move the + // hotcorner to the bottom when the panel is positioned at the bottom + if (i != this.primaryIndex || (!panelTopLeft && !Me.settings.get_boolean('stockgs-force-hotcorner'))) { + // Check if we have a top left (right for RTL) corner. + // I.e. if there is no monitor directly above or to the left(right) + let besideX = this._rtl ? monitor.x + 1 : cornerX - 1; + let besideY = cornerY; + let aboveX = cornerX; + let aboveY = cornerY - 1; + + for (let j = 0; j < this.monitors.length; j++) { + if (i == j) + continue; + let otherMonitor = this.monitors[j]; + if (besideX >= otherMonitor.x && + besideX < otherMonitor.x + otherMonitor.width && + besideY >= otherMonitor.y && + besideY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + if (aboveX >= otherMonitor.x && + aboveX < otherMonitor.x + otherMonitor.width && + aboveY >= otherMonitor.y && + aboveY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + } + } + + if (haveTopLeftCorner) { + let corner = new Layout.HotCorner(this, monitor, cornerX, cornerY); + + corner.setBarrierSize = size => corner.__proto__.setBarrierSize.call(corner, Math.min(size, 32)); + corner.setBarrierSize(panel ? panel.dtpSize : 32); + this.hotCorners.push(corner); + } else { + this.hotCorners.push(null); + } + } + + this.emit('hot-corners-changed'); +} + +function newUpdatePanelBarrier(panel) { + let barriers = { + _rightPanelBarrier: [(panel.isStandalone ? panel : this)], + _leftPanelBarrier: [panel] + }; + + Object.keys(barriers).forEach(k => { + let obj = barriers[k][0]; + + if (obj[k]) { + obj[k].destroy(); + obj[k] = null; + } + }); + + if (!this.primaryMonitor || !panel.panelBox.height) { + return; + } + + let barrierSize = Math.min(10, panel.panelBox.height); + let fixed1 = panel.monitor.y; + let fixed2 = panel.monitor.y + barrierSize; + + if (panel.checkIfVertical()) { + barriers._rightPanelBarrier.push(panel.monitor.y + panel.monitor.height, Meta.BarrierDirection.POSITIVE_Y); + barriers._leftPanelBarrier.push(panel.monitor.y, Meta.BarrierDirection.NEGATIVE_Y); + } else { + barriers._rightPanelBarrier.push(panel.monitor.x + panel.monitor.width, Meta.BarrierDirection.NEGATIVE_X); + barriers._leftPanelBarrier.push(panel.monitor.x, Meta.BarrierDirection.POSITIVE_X); + } + + switch (panel.getPosition()) { + //values are initialized as St.Side.TOP + case St.Side.BOTTOM: + fixed1 = panel.monitor.y + panel.monitor.height - barrierSize; + fixed2 = panel.monitor.y + panel.monitor.height; + break; + case St.Side.LEFT: + fixed1 = panel.monitor.x; + fixed2 = panel.monitor.x + barrierSize; + break; + case St.Side.RIGHT: + fixed1 = panel.monitor.x + panel.monitor.width; + fixed2 = panel.monitor.x + panel.monitor.width - barrierSize; + break; + } + + //remove left barrier if it overlaps one of the hotcorners + for (let k in this.hotCorners) { + let hc = this.hotCorners[k]; + + if (hc && hc._monitor == panel.monitor && + ((fixed1 == hc._x || fixed2 == hc._x) || fixed1 == hc._y || fixed2 == hc._y)) { + delete barriers._leftPanelBarrier; + break; + } + } + + Object.keys(barriers).forEach(k => { + let barrierOptions = { + display: global.display, + directions: barriers[k][2] + }; + + barrierOptions[panel.varCoord.c1] = barrierOptions[panel.varCoord.c2] = barriers[k][1]; + barrierOptions[panel.fixedCoord.c1] = fixed1; + barrierOptions[panel.fixedCoord.c2] = fixed2; + + barriers[k][0][k] = new Meta.Barrier(barrierOptions); + }); +} + +function _newLookingGlassResize() { + let primaryMonitorPanel = Utils.find(global.dashToPanel.panels, p => p.monitor == Main.layoutManager.primaryMonitor); + let topOffset = primaryMonitorPanel.getPosition() == St.Side.TOP ? primaryMonitorPanel.dtpSize + 8 : 32; + + this._oldResize(); + Utils.wrapActor(this); + Utils.wrapActor(this._objInspector); + + this._hiddenY = Main.layoutManager.primaryMonitor.y + topOffset - this.actor.height; + this._targetY = this._hiddenY + this.actor.height; + this.actor.y = this._hiddenY; + + this._objInspector.actor.set_position(this.actor.x + Math.floor(this.actor.width * 0.1), this._targetY + Math.floor(this.actor.height * 0.1)); +} + +function _newLookingGlassOpen() { + if (this._open) + return; + + this._resize(); + this._oldOpen(); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js new file mode 100644 index 0000000..52458bb --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js @@ -0,0 +1,61 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +var SHOW_APPS_BTN = 'showAppsButton'; +var ACTIVITIES_BTN = 'activitiesButton'; +var TASKBAR = 'taskbar'; +var DATE_MENU = 'dateMenu'; +var SYSTEM_MENU = 'systemMenu'; +var LEFT_BOX = 'leftBox'; +var CENTER_BOX = 'centerBox'; +var RIGHT_BOX = 'rightBox'; +var DESKTOP_BTN = 'desktopButton'; + +var STACKED_TL = 'stackedTL'; +var STACKED_BR = 'stackedBR'; +var CENTERED = 'centered'; +var CENTERED_MONITOR = 'centerMonitor'; + +var TOP = 'TOP'; +var BOTTOM = 'BOTTOM'; +var LEFT = 'LEFT'; +var RIGHT = 'RIGHT'; + +var START = 'START'; +var MIDDLE = 'MIDDLE'; +var END = 'END'; + +var defaults = [ + { element: SHOW_APPS_BTN, visible: true, position: STACKED_TL }, + { element: ACTIVITIES_BTN, visible: false, position: STACKED_TL }, + { element: LEFT_BOX, visible: true, position: STACKED_TL }, + { element: TASKBAR, visible: true, position: STACKED_TL }, + { element: CENTER_BOX, visible: true, position: STACKED_BR }, + { element: RIGHT_BOX, visible: true, position: STACKED_BR }, + { element: DATE_MENU, visible: true, position: STACKED_BR }, + { element: SYSTEM_MENU, visible: true, position: STACKED_BR }, + { element: DESKTOP_BTN, visible: true, position: STACKED_BR }, +]; + +var optionDialogFunctions = {}; + +optionDialogFunctions[SHOW_APPS_BTN] = '_showShowAppsButtonOptions'; +optionDialogFunctions[DESKTOP_BTN] = '_showDesktopButtonOptions'; + +function checkIfCentered(position) { + return position == CENTERED || position == CENTERED_MONITOR; +} \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js new file mode 100644 index 0000000..4feb3fd --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js @@ -0,0 +1,112 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Pos = Me.imports.panelPositions; + +/** Return object representing a settings value that is stored as JSON. */ +function getSettingsJson(settings, setting) { + try { + return JSON.parse(settings.get_string(setting)); + } catch(e) { + log('Error parsing positions: ' + e.message); + } +} +/** Write value object as JSON to setting in settings. */ +function setSettingsJson(settings, setting, value) { + try { + const json = JSON.stringify(value); + settings.set_string(setting, json); + } catch(e) { + log('Error serializing setting: ' + e.message); + } +} + +/** Returns size of panel on a specific monitor, in pixels. */ +function getPanelSize(settings, monitorIndex) { + const sizes = getSettingsJson(settings, 'panel-sizes'); + // Pull in deprecated setting if panel-sizes does not have setting for monitor. + const fallbackSize = settings.get_int('panel-size'); + const theDefault = 48; + return sizes[monitorIndex] || fallbackSize || theDefault; +} + +function setPanelSize(settings, monitorIndex, value) { + if (!(Number.isInteger(value) && value <= 128 && value >= 16)) { + log('Not setting invalid panel size: ' + value); + return; + } + let sizes = getSettingsJson(settings, 'panel-sizes'); + sizes[monitorIndex] = value; + setSettingsJson(settings, 'panel-sizes', sizes); +} + +/** + * Returns length of panel on a specific monitor, as a whole number percent, + * from settings. e.g. 100 + */ +function getPanelLength(settings, monitorIndex) { + const lengths = getSettingsJson(settings, 'panel-lengths'); + const theDefault = 100; + return lengths[monitorIndex] || theDefault; +} + +function setPanelLength(settings, monitorIndex, value) { + if (!(Number.isInteger(value) && value <= 100 && value >= 0)) { + log('Not setting invalid panel length: ' + value); + return; + } + let lengths = getSettingsJson(settings, 'panel-lengths'); + lengths[monitorIndex] = value; + setSettingsJson(settings, 'panel-lengths', lengths); +} + +/** Returns position of panel on a specific monitor. */ +function getPanelPosition(settings, monitorIndex) { + const positions = getSettingsJson(settings, 'panel-positions'); + const fallbackPosition = settings.get_string('panel-position'); + const theDefault = Pos.BOTTOM; + return positions[monitorIndex] || fallbackPosition || theDefault; +} + +function setPanelPosition(settings, monitorIndex, value) { + if (!(value === Pos.TOP || value === Pos.BOTTOM || value === Pos.LEFT + || value === Pos.RIGHT)) { + log('Not setting invalid panel position: ' + value); + return; + } + const positions = getSettingsJson(settings, 'panel-positions'); + positions[monitorIndex] = value; + setSettingsJson(settings, 'panel-positions', positions); +} + +/** Returns anchor location of panel on a specific monitor. */ +function getPanelAnchor(settings, monitorIndex) { + const anchors = getSettingsJson(settings, 'panel-anchors'); + const theDefault = Pos.MIDDLE; + return anchors[monitorIndex] || theDefault; +} + +function setPanelAnchor(settings, monitorIndex, value) { + if (!(value === Pos.START || value === Pos.MIDDLE || value === Pos.END)) { + log('Not setting invalid panel anchor: ' + value); + return; + } + const anchors = getSettingsJson(settings, 'panel-anchors'); + anchors[monitorIndex] = value; + setSettingsJson(settings, 'panel-anchors', anchors); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js new file mode 100644 index 0000000..2697ace --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js @@ -0,0 +1,326 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * Ideas for recursing child actors and assigning inline styles + * are based on code from the StatusAreaHorizontalSpacing extension + * https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension + * mathematical.coffee@gmail.com + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const ExtensionUtils = imports.misc.extensionUtils; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const St = imports.gi.St; +const Shell = imports.gi.Shell; + +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +var dtpPanelStyle = Utils.defineClass({ + Name: 'DashToPanel.PanelStyle', + + _init: function() { + + }, + + enable : function(panel) { + this.panel = panel; + + this._applyStyles(); + + this._bindSettingsChanges(); + }, + + disable: function () { + for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { + Me.settings.disconnect(this._dtpSettingsSignalIds[i]); + } + + this._removeStyles(); + }, + + _bindSettingsChanges: function() { + let configKeys = [ + "tray-size", + "leftbox-size", + "tray-padding", + "leftbox-padding", + "status-icon-padding", + ]; + + this._dtpSettingsSignalIds = []; + + for(let i in configKeys) { + this._dtpSettingsSignalIds.push(Me.settings.connect('changed::' + configKeys[i], Lang.bind(this, function () { + this._removeStyles(); + this._applyStyles(); + }))); + } + }, + + _applyStyles: function() { + this._rightBoxOperations = []; + + let trayPadding = Me.settings.get_int('tray-padding'); + let isVertical = this.panel.checkIfVertical(); + let paddingStyle = 'padding: ' + (isVertical ? '%dpx 0' : '0 %dpx'); + + if(trayPadding >= 0) { + let operation = {}; + let trayPaddingStyleLine; + + if (isVertical) { + trayPaddingStyleLine = paddingStyle.format(trayPadding); + operation.compareFn = function (actor) { + let parent = actor.get_parent(); + return (parent && parent.has_style_class_name && parent.has_style_class_name('panel-button')); + }; + } else { + trayPaddingStyleLine = '-natural-hpadding: %dpx'.format(trayPadding); + if (trayPadding < 6) { + trayPaddingStyleLine += '; -minimum-hpadding: %dpx'.format(trayPadding); + } + + operation.compareFn = function (actor) { + return (actor.has_style_class_name && actor.has_style_class_name('panel-button')); + }; + } + + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayPaddingStyleLine, operationIdx); + this._refreshPanelButton(actor); + }); + this._rightBoxOperations.push(operation); + } + + let statusIconPadding = Me.settings.get_int('status-icon-padding'); + if(statusIconPadding >= 0) { + let statusIconPaddingStyleLine = paddingStyle.format(statusIconPadding) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.has_style_class_name && actor.has_style_class_name('system-status-icon')); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, statusIconPaddingStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + } + + let trayContentSize = Me.settings.get_int('tray-size'); + if(trayContentSize > 0) { + let trayIconSizeStyleLine = 'icon-size: %dpx'.format(trayContentSize) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Icon'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayIconSizeStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + + let trayContentSizeStyleLine = 'font-size: %dpx'.format(trayContentSize) + operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Label'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayContentSizeStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + + this._overrideStyle(this.panel._rightBox, trayContentSizeStyleLine, 0); + this._overrideStyle(this.panel._centerBox, trayContentSizeStyleLine, 0); + } + + // center box has been moved next to the right box and will be treated the same + this._centerBoxOperations = this._rightBoxOperations; + + this._leftBoxOperations = []; + + let leftboxPadding = Me.settings.get_int('leftbox-padding'); + if(leftboxPadding >= 0) { + let leftboxPaddingStyleLine = paddingStyle.format(leftboxPadding); + let operation = {}; + operation.compareFn = function (actor) { + let parent = actor.get_parent(); + return (parent && parent.has_style_class_name && parent.has_style_class_name('panel-button')); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxPaddingStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + } + + let leftboxContentSize = Me.settings.get_int('leftbox-size'); + if(leftboxContentSize > 0) { + let leftboxIconSizeStyleLine = 'icon-size: %dpx'.format(leftboxContentSize) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Icon'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxIconSizeStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + + let leftboxContentSizeStyleLine = 'font-size: %dpx'.format(leftboxContentSize) + operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Label'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxContentSizeStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + + this._overrideStyle(this.panel._leftBox, leftboxContentSizeStyleLine, 0); + } + + this._applyStylesRecursively(); + + /* connect signal */ + this._rightBoxActorAddedID = this.panel._rightBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._rightBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._rightBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._centerBoxActorAddedID = this.panel._centerBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._centerBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._centerBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._leftBoxActorAddedID = this.panel._leftBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._leftBoxOperations.length) + this._recursiveApply(actor, this._leftBoxOperations); + }) + ); + }, + + _removeStyles: function() { + /* disconnect signal */ + if (this._rightBoxActorAddedID) + this.panel._rightBox.disconnect(this._rightBoxActorAddedID); + if (this._centerBoxActorAddedID) + this.panel._centerBox.disconnect(this._centerBoxActorAddedID); + if (this._leftBoxActorAddedID) + this.panel._leftBox.disconnect(this._leftBoxActorAddedID); + + this._restoreOriginalStyle(this.panel._rightBox); + this._restoreOriginalStyle(this.panel._centerBox); + this._restoreOriginalStyle(this.panel._leftBox); + + this._applyStylesRecursively(true); + }, + + _applyStylesRecursively: function(restore) { + /*recurse actors */ + if(this._rightBoxOperations.length) { + // add the system menu as we move it from the rightbox to the panel to position it independently + let children = this.panel._rightBox.get_children().concat([this.panel.statusArea.aggregateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._rightBoxOperations, restore); + } + + if(this._centerBoxOperations.length) { + // add the date menu as we move it from the centerbox to the panel to position it independently + let children = this.panel._centerBox.get_children().concat([this.panel.statusArea.dateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._centerBoxOperations, restore); + } + + if(this._leftBoxOperations.length) { + let children = this.panel._leftBox.get_children(); + for(let i in children) + this._recursiveApply(children[i], this._leftBoxOperations, restore); + } + }, + + _recursiveApply: function(actor, operations, restore) { + for(let i in operations) { + let o = operations[i]; + if(o.compareFn(actor)) + if(restore) + o.restoreFn ? o.restoreFn(actor) : this._restoreOriginalStyle(actor); + else + o.applyFn(actor, i); + } + + if(actor.get_children) { + let children = actor.get_children(); + for(let i in children) { + this._recursiveApply(children[i], operations, restore); + } + } + }, + + _overrideStyle: function(actor, styleLine, operationIdx) { + if (actor._dtp_original_inline_style === undefined) { + actor._dtp_original_inline_style = actor.get_style(); + } + + if(actor._dtp_style_overrides === undefined) { + actor._dtp_style_overrides = {}; + } + + actor._dtp_style_overrides[operationIdx] = styleLine; + let newStyleLine = ''; + for(let i in actor._dtp_style_overrides) + newStyleLine += actor._dtp_style_overrides[i] + '; '; + actor.set_style(newStyleLine + (actor._dtp_original_inline_style || '')); + }, + + _restoreOriginalStyle: function(actor) { + if (actor._dtp_original_inline_style !== undefined) { + actor.set_style(actor._dtp_original_inline_style); + delete actor._dtp_original_inline_style; + delete actor._dtp_style_overrides; + } + + if (actor.has_style_class_name('panel-button')) { + this._refreshPanelButton(actor); + } + }, + + _refreshPanelButton: function(actor) { + if (actor.visible && imports.misc.config.PACKAGE_VERSION >= '3.34.0') { + //force gnome 3.34+ to refresh (having problem with the -natural-hpadding) + let parent = actor.get_parent(); + let children = parent.get_children(); + let actorIndex = 0; + + if (children.length > 1) { + actorIndex = children.indexOf(actor); + } + + this._ignoreAddedChild = [this.panel._centerBox, this.panel._rightBox].indexOf(parent) >= 0; + + parent.remove_child(actor); + parent.insert_child_at_index(actor, actorIndex); + } + } + +}); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js new file mode 100644 index 0000000..3040787 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js @@ -0,0 +1,2468 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg. + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const GdkPixbuf = imports.gi.GdkPixbuf; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Gdk = imports.gi.Gdk; +const Lang = imports.lang; +const Mainloop = imports.mainloop; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; +const N_ = function(e) { return e }; +const PanelSettings = Me.imports.panelSettings; +const Pos = Me.imports.panelPositions; + +const SCALE_UPDATE_TIMEOUT = 500; +const DEFAULT_PANEL_SIZES = [ 128, 96, 64, 48, 32, 24, 16 ]; +const DEFAULT_FONT_SIZES = [ 96, 64, 48, 32, 24, 16, 0 ]; +const DEFAULT_MARGIN_SIZES = [ 32, 24, 16, 12, 8, 4, 0 ]; +const DEFAULT_PADDING_SIZES = [ 32, 24, 16, 12, 8, 4, 0, -1 ]; +// Minimum length could be 0, but a higher value may help prevent confusion about where the panel went. +const LENGTH_MARKS = [ 100, 90, 80, 70, 60, 50, 40, 30, 20, 10 ]; +const MAX_WINDOW_INDICATOR = 4; + +const SCHEMA_PATH = '/org/gnome/shell/extensions/dash-to-panel/'; +const GSET = 'gnome-shell-extension-tool'; + +/** + * This function was copied from the activities-config extension + * https://github.com/nls1729/acme-code/tree/master/activities-config + * by Norman L. Smith. + */ +function cssHexString(css) { + let rrggbb = '#'; + let start; + for (let loop = 0; loop < 3; loop++) { + let end = 0; + let xx = ''; + for (let loop = 0; loop < 2; loop++) { + while (true) { + let x = css.slice(end, end + 1); + if ((x == '(') || (x == ',') || (x == ')')) + break; + end++; + } + if (loop == 0) { + end++; + start = end; + } + } + xx = parseInt(css.slice(start, end)).toString(16); + if (xx.length == 1) + xx = '0' + xx; + rrggbb += xx; + css = css.slice(end); + } + return rrggbb; +} + +function setShortcut(settings, shortcutName) { + let shortcut_text = settings.get_string(shortcutName + '-text'); + let [key, mods] = Gtk.accelerator_parse(shortcut_text); + + if (Gtk.accelerator_valid(key, mods)) { + let shortcut = Gtk.accelerator_name(key, mods); + settings.set_strv(shortcutName, [shortcut]); + } + else { + settings.set_strv(shortcutName, []); + } +} + +function checkHotkeyPrefix(settings) { + settings.delay(); + + let hotkeyPrefix = settings.get_string('hotkey-prefix-text'); + if (hotkeyPrefix == 'Super') + hotkeyPrefix = ''; + else if (hotkeyPrefix == 'SuperAlt') + hotkeyPrefix = ''; + let [, mods] = Gtk.accelerator_parse(hotkeyPrefix); + let [, shift_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + let [, ctrl_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + + let numHotkeys = 10; + for (let i = 1; i <= numHotkeys; i++) { + let number = i; + if (number == 10) + number = 0; + let key = Gdk.keyval_from_name(number.toString()); + let key_kp = Gdk.keyval_from_name('KP_' + number.toString()); + if (Gtk.accelerator_valid(key, mods)) { + let shortcut = Gtk.accelerator_name(key, mods); + let shortcut_kp = Gtk.accelerator_name(key_kp, mods); + + // Setup shortcut strings + settings.set_strv('app-hotkey-' + i, [shortcut]); + settings.set_strv('app-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, shift_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, shift_mods); + settings.set_strv('app-shift-hotkey-' + i, [shortcut]); + settings.set_strv('app-shift-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, ctrl_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, ctrl_mods); + settings.set_strv('app-ctrl-hotkey-' + i, [shortcut]); + settings.set_strv('app-ctrl-hotkey-kp-' + i, [shortcut_kp]); + } + else { + // Reset default settings for the relevant keys if the + // accelerators are invalid + let keys = ['app-hotkey-' + i, 'app-shift-hotkey-' + i, 'app-ctrl-hotkey-' + i, // Regular numbers + 'app-hotkey-kp-' + i, 'app-shift-hotkey-kp-' + i, 'app-ctrl-hotkey-kp-' + i]; // Key-pad numbers + keys.forEach(function(val) { + settings.set_value(val, settings.get_default_value(val)); + }, this); + } + } + + settings.apply(); +} + +function mergeObjects(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +const Preferences = new Lang.Class({ + Name: 'DashToPanel.Preferences', + + _init: function() { + this._settings = Convenience.getSettings('org.gnome.shell.extensions.dash-to-panel'); + this._rtl = (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL); + this._builder = new Gtk.Builder(); + this._builder.set_scope(new BuilderScope(this)); + this._builder.set_translation_domain(Me.metadata['gettext-domain']); + this._builder.add_from_file(Me.path + '/Settings.ui'); + this.notebook = this._builder.get_object('settings_notebook'); + + // Timeout to delay the update of the settings + this._panel_size_timeout = 0; + this._dot_height_timeout = 0; + this._tray_size_timeout = 0; + this._leftbox_size_timeout = 0; + this._appicon_margin_timeout = 0; + this._appicon_padding_timeout = 0; + this._opacity_timeout = 0; + this._tray_padding_timeout = 0; + this._statusicon_padding_timeout = 0; + this._leftbox_padding_timeout = 0; + this._addFormatValueCallbacks(); + this._bindSettings(); + }, + + /** + * Connect signals + */ + _connector: function(builder, object, signal, handler) { + object.connect(signal, Lang.bind(this, this._SignalHandler[handler])); + }, + + _updateVerticalRelatedOptions: function() { + let position = this._getPanelPosition(this._currentMonitorIndex); + let isVertical = position == Pos.LEFT || position == Pos.RIGHT; + let showDesktopWidthLabel = this._builder.get_object('show_showdesktop_width_label'); + + showDesktopWidthLabel.set_text(isVertical ? _('Show Desktop button height (px)') : _('Show Desktop button width (px)')); + + this._displayPanelPositionsForMonitor(this._currentMonitorIndex); + }, + + _maybeDisableTopPosition: function() { + let keepTopPanel = this._settings.get_boolean('stockgs-keep-top-panel'); + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let topAvailable = !keepTopPanel || (!monitorSync && this._currentMonitorIndex != this.monitors[0]); + let topRadio = this._builder.get_object('position_top_button'); + + topRadio.set_sensitive(topAvailable); + topRadio.set_tooltip_text(!topAvailable ? _('Unavailable when gnome-shell top panel is present') : ''); + }, + + _getPanelPosition: function(monitorIndex) { + return PanelSettings.getPanelPosition(this._settings, monitorIndex); + }, + + _setPanelPosition: function(position) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelPosition(this._settings, monitorIndex, position); + }); + this._setAnchorLabels(this._currentMonitorIndex); + }, + + _setPositionRadios: function(position) { + this._ignorePositionRadios = true; + + switch (position) { + case Pos.BOTTOM: + this._builder.get_object('position_bottom_button').set_active(true); + break; + case Pos.TOP: + this._builder.get_object('position_top_button').set_active(true); + break; + case Pos.LEFT: + this._builder.get_object('position_left_button').set_active(true); + break; + case Pos.RIGHT: + this._builder.get_object('position_right_button').set_active(true); + break; + } + + this._ignorePositionRadios = false; + }, + + /** + * Set panel anchor combo labels according to whether the monitor's panel is vertical + * or horizontal, or if all monitors' panels are being configured and they are a mix + * of vertical and horizontal. + */ + _setAnchorLabels: function(currentMonitorIndex) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [currentMonitorIndex]; + const allVertical = monitorsToSetFor.every(i => { + const position = PanelSettings.getPanelPosition(this._settings, i); + return position === Pos.LEFT || position === Pos.RIGHT + }); + const allHorizontal = monitorsToSetFor.every(i => { + const position = PanelSettings.getPanelPosition(this._settings, i); + return position === Pos.TOP || position === Pos.BOTTOM; + }); + + const anchor_combo = this._builder.get_object('panel_anchor_combo'); + anchor_combo.remove_all(); + + if (allHorizontal) { + anchor_combo.append(Pos.START, _('Left')); + anchor_combo.append(Pos.MIDDLE, _('Center')); + anchor_combo.append(Pos.END, _('Right')); + } else if (allVertical) { + anchor_combo.append(Pos.START, _('Top')); + anchor_combo.append(Pos.MIDDLE, _('Middle')); + anchor_combo.append(Pos.END, _('Bottom')); + } else { + // Setting for a mix of horizontal and vertical panels on different monitors. + anchor_combo.append(Pos.START, _('Start')); + anchor_combo.append(Pos.MIDDLE, _('Middle')); + anchor_combo.append(Pos.END, _('End')); + } + + // Set combo box after re-populating its options. But only if it's for a single-panel + // configuration, or a multi-panel configuration where they all have the same anchor + // setting. So don't set the combo box if there is a multi-panel configuration with + // different anchor settings. + const someAnchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); + if (monitorsToSetFor.every(i => + PanelSettings.getPanelAnchor(this._settings, i) === someAnchor)) { + const panel_anchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); + this._builder.get_object('panel_anchor_combo').set_active_id(panel_anchor); + } + }, + + /** + * When a monitor is selected, update the widgets for panel position, size, anchoring, + * and contents so they accurately show the settings for the panel on that monitor. + */ + _updateWidgetSettingsForMonitor: function(monitorIndex) { + // Update display of panel screen position setting + this._maybeDisableTopPosition(); + const panelPosition = this._getPanelPosition(monitorIndex); + this._setPositionRadios(panelPosition); + + // Update display of thickness, length, and anchor settings + const panel_size_scale = this._builder.get_object('panel_size_scale'); + const size = PanelSettings.getPanelSize(this._settings, monitorIndex); + panel_size_scale.set_value(size); + + const panel_length_scale = this._builder.get_object('panel_length_scale'); + const length = PanelSettings.getPanelLength(this._settings, monitorIndex); + panel_length_scale.set_value(length); + this._setAnchorWidgetSensitivity(length); + + this._setAnchorLabels(monitorIndex); + + // Update display of panel content settings + this._displayPanelPositionsForMonitor(monitorIndex); + }, + + /** + * Anchor is only relevant if panel length is less than 100%. Enable or disable + * anchor widget sensitivity accordingly. + */ + _setAnchorWidgetSensitivity: function(panelLength) { + const isPartialLength = panelLength < 100; + this._builder.get_object('panel_anchor_label').set_sensitive(isPartialLength); + this._builder.get_object('panel_anchor_combo').set_sensitive(isPartialLength); + }, + + _displayPanelPositionsForMonitor: function(monitorIndex) { + let taskbarListBox = this._builder.get_object('taskbar_display_listbox'); + + while(taskbarListBox.get_first_child()) + { + taskbarListBox.remove(taskbarListBox.get_first_child()); + } + + let labels = {}; + let panelPosition = this._getPanelPosition(monitorIndex); + let isVertical = panelPosition == Pos.LEFT || panelPosition == Pos.RIGHT; + let panelElementPositionsSettings = PanelSettings.getSettingsJson(this._settings, 'panel-element-positions'); + let panelElementPositions = panelElementPositionsSettings[monitorIndex] || Pos.defaults; + let updateElementsSettings = () => { + let newPanelElementPositions = []; + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let monitors = monitorSync ? this.monitors : [monitorIndex]; + + let child = taskbarListBox.get_first_child(); + while (child != null) + { + newPanelElementPositions.push({ + element: child.id, + visible: child.visibleToggleBtn.get_active(), + position: child.positionCombo.get_active_id() + }); + child = child.get_next_sibling(); + } + + monitors.forEach(m => panelElementPositionsSettings[m] = newPanelElementPositions); + this._settings.set_string('panel-element-positions', JSON.stringify(panelElementPositionsSettings)); + }; + + + labels[Pos.SHOW_APPS_BTN] = _('Show Applications button'); + labels[Pos.ACTIVITIES_BTN] = _('Activities button'); + labels[Pos.TASKBAR] = _('Taskbar'); + labels[Pos.DATE_MENU] = _('Date menu'); + labels[Pos.SYSTEM_MENU] = _('System menu'); + labels[Pos.LEFT_BOX] = _('Left box'); + labels[Pos.CENTER_BOX] = _('Center box'); + labels[Pos.RIGHT_BOX] = _('Right box'); + labels[Pos.DESKTOP_BTN] = _('Desktop button'); + + panelElementPositions.forEach(el => { + let row = new Gtk.ListBoxRow(); + let grid = new Gtk.Grid({ margin_start: 12, margin_end: 12, column_spacing: 8 }); + let upDownGrid = new Gtk.Grid({ column_spacing: 2 }); + let upBtn = new Gtk.Button({ tooltip_text: _('Move up') }); + let upImg = new Gtk.Image({ icon_name: 'go-up-symbolic', pixel_size: 12 }); + let downBtn = new Gtk.Button({ tooltip_text: _('Move down') }); + let downImg = new Gtk.Image({ icon_name: 'go-down-symbolic', pixel_size: 12 }); + let visibleToggleBtn = new Gtk.ToggleButton({ label: _('Visible'), active: el.visible }); + let positionCombo = new Gtk.ComboBoxText({ tooltip_text: _('Select element position') }); + let upDownClickHandler = limit => { + let index = row.get_index(); + + if (index != limit) { + taskbarListBox.remove(row); + taskbarListBox.insert(row, index + (!limit ? -1 : 1)); + updateElementsSettings(); + } + }; + + positionCombo.append(Pos.STACKED_TL, isVertical ? _('Stacked to top') : _('Stacked to left')); + positionCombo.append(Pos.STACKED_BR, isVertical ? _('Stacked to bottom') :_('Stacked to right')); + positionCombo.append(Pos.CENTERED, _('Centered')); + positionCombo.append(Pos.CENTERED_MONITOR, _('Monitor Center')); + positionCombo.set_active_id(el.position); + + upBtn.connect('clicked', () => upDownClickHandler(0)); + downBtn.connect('clicked', () => upDownClickHandler(panelElementPositions.length - 1)); + visibleToggleBtn.connect('toggled', () => updateElementsSettings()); + positionCombo.connect('changed', () => updateElementsSettings()); + + upBtn.set_child(upImg); + downBtn.set_child(downImg); + + upDownGrid.attach(upBtn, 0, 0, 1, 1); + upDownGrid.attach(downBtn, 1, 0, 1, 1); + + grid.attach(upDownGrid, 0, 0, 1, 1); + grid.attach(new Gtk.Label({ label: labels[el.element], xalign: 0, hexpand: true }), 1, 0, 1, 1); + + if (Pos.optionDialogFunctions[el.element]) { + let cogImg = new Gtk.Image({ icon_name: 'emblem-system-symbolic' }); + let optionsBtn = new Gtk.Button({ tooltip_text: _('More options') }); + + optionsBtn.get_style_context().add_class('circular'); + optionsBtn.set_child(cogImg); + grid.attach(optionsBtn, 2, 0, 1, 1); + + optionsBtn.connect('clicked', () => this[Pos.optionDialogFunctions[el.element]]()); + } + + grid.attach(visibleToggleBtn, 3, 0, 1, 1); + grid.attach(positionCombo, 4, 0, 1, 1); + + row.id = el.element; + row.visibleToggleBtn = visibleToggleBtn; + row.positionCombo = positionCombo; + + row.set_child(grid); + taskbarListBox.insert(row, -1); + }); + }, + + _showShowAppsButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Applications options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('show_applications_options'); + dialog.get_content_area().append(box); + + let fileChooserButton = this._builder.get_object('show_applications_icon_file_filebutton'); + let fileChooser = new Gtk.FileChooserNative({ title: _('Open icon'), transient_for: dialog }); + let fileImage = this._builder.get_object('show_applications_current_icon_image'); + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + fileChooser.filter = fileFilter; + + let handleIconChange = function(newIconPath) { + if (newIconPath && GLib.file_test(newIconPath, GLib.FileTest.EXISTS)) { + let file = Gio.File.new_for_path(newIconPath); + let pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale(file.read(null), 32, 32, true, null); + + fileImage.set_from_pixbuf(pixbuf); + fileChooser.set_file(file); + fileChooserButton.set_label(newIconPath); + } else { + newIconPath = ''; + fileImage.set_from_icon_name('view-app-grid-symbolic'); + let picturesFolder = Gio.File.new_for_path(GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES)); + fileChooser.set_file(picturesFolder); + fileChooserButton.set_label("(None)"); + } + + this._settings.set_string('show-apps-icon-file', newIconPath || ''); + }; + + fileChooserButton.connect('clicked', Lang.bind(this, function() { + fileChooser.show(); + })); + + fileChooser.connect('response', widget => handleIconChange.call(this, widget.get_file().get_path())); + handleIconChange.call(this, this._settings.get_string('show-apps-icon-file')); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-apps-icon-side-padding', this._settings.get_default_value('show-apps-icon-side-padding')); + this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); + this._settings.set_value('show-apps-override-escape', this._settings.get_default_value('show-apps-override-escape')); + handleIconChange.call(this, null); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + fileChooser.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + }, + + _showDesktopButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Desktop options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_show_showdesktop_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('showdesktop-button-width', widget.get_value()); + })); + + this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); + this._builder.get_object('show_showdesktop_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-showdesktop-delay', widget.get_value()); + })); + + this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); + this._builder.get_object('show_showdesktop_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-showdesktop-time', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('showdesktop-button-width', this._settings.get_default_value('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + + this._settings.set_value('show-showdesktop-hover', this._settings.get_default_value('show-showdesktop-hover')); + + this._settings.set_value('show-showdesktop-delay', this._settings.get_default_value('show-showdesktop-delay')); + this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); + + this._settings.set_value('show-showdesktop-time', this._settings.get_default_value('show-showdesktop-time')); + this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + }, + + _addFormatValueCallbacks: function() { + // position + this._builder.get_object('panel_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // style + this._builder.get_object('appicon_margin_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('appicon_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // fine-tune box1 + this._builder.get_object('tray_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('leftbox_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // fine-tune box2 + this._builder.get_object('tray_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('statusicon_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('leftbox_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // animate hovering app icons dialog + this._builder.get_object('animate_appicon_hover_options_duration_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d ms").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_rotation_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d °").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_travel_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d %%").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_zoom_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d %%").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_convexity_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%.1f").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_extent_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return Gettext.ngettext("%d icon", "%d icons", value).format(value); + })); + }, + + _bindSettings: function() { + // size options + let panel_size_scale = this._builder.get_object('panel_size_scale'); + panel_size_scale.set_range(DEFAULT_PANEL_SIZES[DEFAULT_PANEL_SIZES.length - 1], DEFAULT_PANEL_SIZES[0]); + DEFAULT_PANEL_SIZES.slice(1, -1).forEach(function(val) { + panel_size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); + }); + + // Correct for rtl languages + if (this._rtl) { + // Flip value position: this is not done automatically + panel_size_scale.set_value_pos(Gtk.PositionType.LEFT); + // I suppose due to a bug, having a more than one mark and one above a value of 100 + // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable + // and then manually inverting it + panel_size_scale.set_flippable(false); + panel_size_scale.set_inverted(true); + } + + // Dots Position option + let dotPosition = this._settings.get_string('dot-position'); + + switch (dotPosition) { + case 'BOTTOM': + this._builder.get_object('dots_bottom_button').set_active(true); + break; + case 'TOP': + this._builder.get_object('dots_top_button').set_active(true); + break; + case 'LEFT': + this._builder.get_object('dots_left_button').set_active(true); + break; + case 'RIGHT': + this._builder.get_object('dots_right_button').set_active(true); + break; + } + + this._builder.get_object('dot_style_focused_combo').set_active_id(this._settings.get_string('dot-style-focused')); + this._builder.get_object('dot_style_focused_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('dot-style-focused', widget.get_active_id()); + })); + + this._builder.get_object('dot_style_unfocused_combo').set_active_id(this._settings.get_string('dot-style-unfocused')); + this._builder.get_object('dot_style_unfocused_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('dot-style-unfocused', widget.get_active_id()); + })); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + let idx = i; + this._builder.get_object('dot_color_' + idx + '_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('dot-color-' + idx, hexString); + })); + + this._builder.get_object('dot_color_unfocused_' + idx + '_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('dot-color-unfocused-' + idx, hexString); + })); + } + + this._builder.get_object('dot_color_apply_all_button').connect('clicked', Lang.bind(this, function() { + for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-' + i, this._settings.get_value('dot-color-1')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + } + })); + + this._builder.get_object('dot_color_unfocused_apply_all_button').connect('clicked', Lang.bind(this, function() { + for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_value('dot-color-unfocused-1')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + })); + + this._builder.get_object('focus_highlight_color_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('focus-highlight-color', hexString); + })); + + this._builder.get_object('dot_style_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Running Indicator Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_dots_options'); + dialog.get_content_area().append(box); + + this._settings.bind('dot-color-dominant', + this._builder.get_object('dot_color_dominant_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('dot_color_override_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + // when either becomes active, turn the other off + this._builder.get_object('dot_color_dominant_switch').connect('state-set', Lang.bind (this, function(widget) { + if (widget.get_active()) this._settings.set_boolean('dot-color-override', false); + })); + this._builder.get_object('dot_color_override_switch').connect('state-set', Lang.bind (this, function(widget) { + if (widget.get_active()) this._settings.set_boolean('dot-color-dominant', false); + })); + + this._settings.bind('dot-color-unfocused-different', + this._builder.get_object('dot_color_unfocused_different_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('grid_dot_color'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('dot_color_unfocused_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-unfocused-different', + this._builder.get_object('grid_dot_color_unfocused'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + + this._settings.bind('focus-highlight', + this._builder.get_object('focus_highlight_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight', + this._builder.get_object('grid_focus_highlight_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_dominant_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_color_label'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('focus-highlight-color')); + this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); + }).apply(this); + + this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); + this._builder.get_object('focus_highlight_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('focus-highlight-opacity', widget.get_value()); + })); + + this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); + this._builder.get_object('dot_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('dot-size', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('dot-color-dominant', this._settings.get_default_value('dot-color-dominant')); + this._settings.set_value('dot-color-override', this._settings.get_default_value('dot-color-override')); + this._settings.set_value('dot-color-unfocused-different', this._settings.get_default_value('dot-color-unfocused-different')); + + this._settings.set_value('focus-highlight-color', this._settings.get_default_value('focus-highlight-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('focus-highlight-color')); + this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); + + this._settings.set_value('focus-highlight-opacity', this._settings.get_default_value('focus-highlight-opacity')); + this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-' + i, this._settings.get_default_value('dot-color-' + i)); + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + + this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_default_value('dot-color-unfocused-' + i)); + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + + this._settings.set_value('dot-size', this._settings.get_default_value('dot-size')); + this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); + + this._settings.set_value('focus-highlight', this._settings.get_default_value('focus-highlight')); + this._settings.set_value('focus-highlight-dominant', this._settings.get_default_value('focus-highlight-dominant')); + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + //multi-monitor + this.monitors = this._settings.get_value('available-monitors').deep_unpack(); + + let dtpPrimaryMonitorIndex = this.monitors.indexOf(this._settings.get_int('primary-monitor')); + + if (dtpPrimaryMonitorIndex < 0) { + dtpPrimaryMonitorIndex = 0; + } + + this._currentMonitorIndex = this.monitors[dtpPrimaryMonitorIndex]; + + this._settings.connect('changed::panel-positions', () => this._updateVerticalRelatedOptions()); + this._updateVerticalRelatedOptions(); + + for (let i = 0; i < this.monitors.length; ++i) { + //the primary index is the first one in the "available-monitors" setting + let label = !i ? _('Primary monitor') : _('Monitor ') + (i + 1); + + this._builder.get_object('multimon_primary_combo').append_text(label); + this._builder.get_object('taskbar_position_monitor_combo').append_text(label); + } + + this._builder.get_object('multimon_primary_combo').set_active(dtpPrimaryMonitorIndex); + this._builder.get_object('taskbar_position_monitor_combo').set_active(dtpPrimaryMonitorIndex); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_sync_button'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_monitor_combo'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.connect('changed::panel-element-positions-monitors-sync', () => { + this._maybeDisableTopPosition(); + // The anchor combo box may has different labels for single- or all-monitor configuration. + this._setAnchorLabels(this._currentMonitorIndex); + }); + + this._builder.get_object('multimon_primary_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('primary-monitor', this.monitors[widget.get_active()]); + })); + + this._builder.get_object('taskbar_position_monitor_combo').connect('changed', Lang.bind (this, function(widget) { + this._currentMonitorIndex = this.monitors[widget.get_active()]; + this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); + })); + + this._settings.bind('multi-monitors', + this._builder.get_object('multimon_multi_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + if (this.monitors.length === 1) { + this._builder.get_object('multimon_multi_switch').set_sensitive(false); + } + + const panel_length_scale = this._builder.get_object('panel_length_scale'); + panel_length_scale.connect('value-changed', Lang.bind (this, function(widget) { + const value = widget.get_value(); + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelLength(this._settings, monitorIndex, value); + }); + + this._setAnchorWidgetSensitivity(value); + })); + + this._builder.get_object('panel_anchor_combo').connect('changed', Lang.bind (this, function(widget) { + const value = widget.get_active_id(); + // Value can be null while anchor labels are being swapped out + if (value !== null) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelAnchor(this._settings, monitorIndex, value); + }); + } + })); + + this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); + + //dynamic opacity + this._settings.bind('trans-use-custom-bg', + this._builder.get_object('trans_bg_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-bg', + this._builder.get_object('trans_bg_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('trans-bg-color')); + this._builder.get_object('trans_bg_color_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_bg_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-bg-color', hexString); + })); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_override_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('trans_opacity_override_switch').connect('notify::active', (widget) => { + if (!widget.get_active()) + this._builder.get_object('trans_dyn_switch').set_active(false); + }); + + this._builder.get_object('trans_opacity_spinbutton').set_value(this._settings.get_double('trans-panel-opacity') * 100); + this._builder.get_object('trans_opacity_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-panel-opacity', widget.get_value() * 0.01); + })); + + this._settings.bind('trans-use-dynamic-opacity', + this._builder.get_object('trans_dyn_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-dynamic-opacity', + this._builder.get_object('trans_dyn_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-dynamic-behavior', + this._builder.get_object('trans_options_window_type_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-gradient', + this._builder.get_object('trans_gradient_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-gradient', + this._builder.get_object('trans_gradient_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + rgba.parse(this._settings.get_string('trans-gradient-top-color')); + this._builder.get_object('trans_gradient_color1_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_gradient_color1_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-gradient-top-color', hexString); + })); + + this._builder.get_object('trans_gradient_color1_spinbutton').set_value(this._settings.get_double('trans-gradient-top-opacity') * 100); + this._builder.get_object('trans_gradient_color1_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-gradient-top-opacity', widget.get_value() * 0.01); + })); + + rgba.parse(this._settings.get_string('trans-gradient-bottom-color')); + this._builder.get_object('trans_gradient_color2_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_gradient_color2_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-gradient-bottom-color', hexString); + })); + + this._builder.get_object('trans_gradient_color2_spinbutton').set_value(this._settings.get_double('trans-gradient-bottom-opacity') * 100); + this._builder.get_object('trans_gradient_color2_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-gradient-bottom-opacity', widget.get_value() * 0.01); + })); + + this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); + this._builder.get_object('trans_options_distance_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('trans-dynamic-distance', widget.get_value()); + })); + + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); + this._builder.get_object('trans_options_min_opacity_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-dynamic-anim-target', widget.get_value() * 0.01); + })); + + this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); + this._builder.get_object('trans_options_anim_time_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('trans-dynamic-anim-time', widget.get_value()); + })); + + this._builder.get_object('trans_dyn_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Dynamic opacity options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_dynamic_opacity_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('trans-dynamic-behavior', this._settings.get_default_value('trans-dynamic-behavior')); + + this._settings.set_value('trans-dynamic-distance', this._settings.get_default_value('trans-dynamic-distance')); + this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); + + this._settings.set_value('trans-dynamic-anim-target', this._settings.get_default_value('trans-dynamic-anim-target')); + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); + + this._settings.set_value('trans-dynamic-anim-time', this._settings.get_default_value('trans-dynamic-anim-time')); + this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + this._settings.bind('desktop-line-use-custom-color', + this._builder.get_object('override_show_desktop_line_color_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('desktop-line-use-custom-color', + this._builder.get_object('override_show_desktop_line_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + rgba.parse(this._settings.get_string('desktop-line-custom-color')); + this._builder.get_object('override_show_desktop_line_color_colorbutton').set_rgba(rgba); + this._builder.get_object('override_show_desktop_line_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + this._settings.set_string('desktop-line-custom-color', css); + })); + + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_window_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_behaviour_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-behaviour', + this._builder.get_object('intellihide_behaviour_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-use-pressure', + this._builder.get_object('intellihide_use_pressure_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-use-pressure', + this._builder.get_object('intellihide_use_pressure_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-show-in-fullscreen', + this._builder.get_object('intellihide_show_in_fullscreen_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-only-secondary', + this._builder.get_object('intellihide_only_secondary_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('multi-monitors', + this._builder.get_object('grid_intellihide_only_secondary'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('multimon_multi_switch').connect('notify::active', (widget) => { + if (!widget.get_active()) + this._builder.get_object('intellihide_only_secondary_switch').set_active(false); + }); + + this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); + this._builder.get_object('intellihide_pressure_threshold_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('intellihide-pressure-threshold', widget.get_value()); + })); + + this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); + this._builder.get_object('intellihide_pressure_time_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('intellihide-pressure-time', widget.get_value()); + })); + + this._settings.bind('intellihide-key-toggle-text', + this._builder.get_object('intellihide_toggle_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::intellihide-key-toggle-text', () => setShortcut(this._settings, 'intellihide-key-toggle')); + + this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); + this._builder.get_object('intellihide_animation_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-animation-time', widget.get_value()); + })); + + this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); + this._builder.get_object('intellihide_close_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-close-delay', widget.get_value()); + })); + + this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); + this._builder.get_object('intellihide_enable_start_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-enable-start-delay', widget.get_value()); + })); + + this._builder.get_object('intellihide_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Intellihide options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_intellihide_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('intellihide-hide-from-windows', this._settings.get_default_value('intellihide-hide-from-windows')); + this._settings.set_value('intellihide-behaviour', this._settings.get_default_value('intellihide-behaviour')); + this._settings.set_value('intellihide-use-pressure', this._settings.get_default_value('intellihide-use-pressure')); + this._settings.set_value('intellihide-show-in-fullscreen', this._settings.get_default_value('intellihide-show-in-fullscreen')); + this._settings.set_value('intellihide-only-secondary', this._settings.get_default_value('intellihide-only-secondary')); + + this._settings.set_value('intellihide-pressure-threshold', this._settings.get_default_value('intellihide-pressure-threshold')); + this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); + + this._settings.set_value('intellihide-pressure-time', this._settings.get_default_value('intellihide-pressure-time')); + this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); + + this._settings.set_value('intellihide-key-toggle-text', this._settings.get_default_value('intellihide-key-toggle-text')); + + this._settings.set_value('intellihide-animation-time', this._settings.get_default_value('intellihide-animation-time')); + this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); + + this._settings.set_value('intellihide-close-delay', this._settings.get_default_value('intellihide-close-delay')); + this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); + + this._settings.set_value('intellihide-enable-start-delay', this._settings.get_default_value('intellihide-enable-start-delay')); + this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + // Behavior panel + + this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); + this._builder.get_object('show_applications_side_padding_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-apps-icon-side-padding', widget.get_value()); + })); + + this._settings.bind('show-apps-override-escape', + this._builder.get_object('show_applications_esc_key_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-hover', + this._builder.get_object('show_showdesktop_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-hover', + this._builder.get_object('grid_show_showdesktop_hide_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-appmenu', + this._builder.get_object('show_appmenu_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-tooltip', + this._builder.get_object('show_tooltip_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('show_favorite_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites-all-monitors', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-running-apps', + this._builder.get_object('show_runnning_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._setPreviewTitlePosition(); + + this._builder.get_object('grid_preview_title_font_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('window-preview-title-font-color', hexString); + })); + + this._builder.get_object('show_window_previews_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Window preview options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let scrolledWindow = this._builder.get_object('box_window_preview_options'); + + dialog.get_content_area().append(scrolledWindow); + + this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); + this._builder.get_object('preview_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-window-previews-timeout', widget.get_value()); + })); + + this._settings.bind('preview-middle-click-close', + this._builder.get_object('preview_middle_click_close_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-fixed-x', + this._builder.get_object('preview_aspect_ratio_x_fixed_togglebutton'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-fixed-y', + this._builder.get_object('preview_aspect_ratio_y_fixed_togglebutton'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('preview-use-custom-opacity', + this._builder.get_object('preview_custom_opacity_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('preview-use-custom-opacity', + this._builder.get_object('preview_custom_opacity_spinbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-use-custom-icon-size', + this._builder.get_object('preview_custom_icon_size_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-use-custom-icon-size', + this._builder.get_object('preview_custom_icon_size_spinbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); + this._builder.get_object('preview_custom_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('preview-custom-opacity', widget.get_value()); + })); + + this._settings.bind('peek-mode', + this._builder.get_object('peek_mode_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('peek-mode', + this._builder.get_object('grid_enter_peek_mode_timeout'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('peek-mode', + this._builder.get_object('grid_peek_mode_opacity'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-show-title', + this._builder.get_object('preview_show_title_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_custom_icon_size'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_size'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_weight'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_font_color'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); + this._builder.get_object('enter_peek_mode_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('enter-peek-mode-timeout', widget.get_value()); + })); + + this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); + this._builder.get_object('leave_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('leave-timeout', widget.get_value()); + })); + + this._settings.bind('window-preview-hide-immediate-click', + this._builder.get_object('preview_immediate_click_button'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); + this._builder.get_object('animation_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-animation-time', widget.get_value()); + })); + + this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); + this._builder.get_object('peek_mode_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('peek-mode-opacity', widget.get_value()); + })); + + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-size', widget.get_value()); + })); + + this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); + this._builder.get_object('preview_aspect_ratio_x_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-aspect-ratio-x', parseInt(widget.get_active_id(), 10)); + })); + + this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); + this._builder.get_object('preview_aspect_ratio_y_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-aspect-ratio-y', parseInt(widget.get_active_id(), 10)); + })); + + this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); + this._builder.get_object('preview_padding_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-padding', widget.get_value()); + })); + + this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); + this._builder.get_object('preview_title_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-title-font-size', widget.get_value()); + })); + + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); + this._builder.get_object('preview_custom_icon_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-custom-icon-size', widget.get_value()); + })); + + this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); + this._builder.get_object('grid_preview_title_weight_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('window-preview-title-font-weight', widget.get_active_id()); + })); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('window-preview-title-font-color')); + this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); + }).apply(this); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-window-previews-timeout', this._settings.get_default_value('show-window-previews-timeout')); + this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); + + this._settings.set_value('leave-timeout', this._settings.get_default_value('leave-timeout')); + this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); + + this._settings.set_value('window-preview-hide-immediate-click', this._settings.get_default_value('window-preview-hide-immediate-click')); + + this._settings.set_value('window-preview-animation-time', this._settings.get_default_value('window-preview-animation-time')); + this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); + + this._settings.set_value('preview-use-custom-opacity', this._settings.get_default_value('preview-use-custom-opacity')); + + this._settings.set_value('window-preview-use-custom-icon-size', this._settings.get_default_value('window-preview-use-custom-icon-size')); + + this._settings.set_value('preview-custom-opacity', this._settings.get_default_value('preview-custom-opacity')); + this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); + + this._settings.set_value('window-preview-title-position', this._settings.get_default_value('window-preview-title-position')); + this._setPreviewTitlePosition(); + + this._settings.set_value('peek-mode', this._settings.get_default_value('peek-mode')); + this._settings.set_value('window-preview-show-title', this._settings.get_default_value('window-preview-show-title')); + this._settings.set_value('enter-peek-mode-timeout', this._settings.get_default_value('enter-peek-mode-timeout')); + this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); + this._settings.set_value('peek-mode-opacity', this._settings.get_default_value('peek-mode-opacity')); + this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); + + this._settings.set_value('window-preview-size', this._settings.get_default_value('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + + this._settings.set_value('window-preview-fixed-x', this._settings.get_default_value('window-preview-fixed-x')); + this._settings.set_value('window-preview-fixed-y', this._settings.get_default_value('window-preview-fixed-y')); + + this._settings.set_value('window-preview-aspect-ratio-x', this._settings.get_default_value('window-preview-aspect-ratio-x')); + this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); + + this._settings.set_value('window-preview-aspect-ratio-y', this._settings.get_default_value('window-preview-aspect-ratio-y')); + this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); + + this._settings.set_value('window-preview-padding', this._settings.get_default_value('window-preview-padding')); + this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); + + this._settings.set_value('preview-middle-click-close', this._settings.get_default_value('preview-middle-click-close')); + + this._settings.set_value('window-preview-title-font-size', this._settings.get_default_value('window-preview-title-font-size')); + this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); + + this._settings.set_value('window-preview-custom-icon-size', this._settings.get_default_value('window-preview-custom-icon-size')); + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); + + this._settings.set_value('window-preview-title-font-weight', this._settings.get_default_value('window-preview-title-font-weight')); + this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); + + this._settings.set_value('window-preview-title-font-color', this._settings.get_default_value('window-preview-title-font-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('window-preview-title-font-color')); + this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(scrolledWindow); + dialog.destroy(); + } + return; + })); + + dialog.show(); + + })); + + this._settings.bind('isolate-workspaces', + this._builder.get_object('isolate_workspaces_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('isolate-monitors', + this._builder.get_object('multimon_multi_isolate_monitor_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('overview-click-to-exit', + this._builder.get_object('clicktoexit_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('hide-overview-on-startup', + this._builder.get_object('hide_overview_on_startup_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps', + this._builder.get_object('group_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('group-apps', + this._builder.get_object('show_group_apps_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._builder.get_object('group_apps_label_font_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('group-apps-label-font-color', hexString); + })); + + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('group-apps-label-font-color-minimized', hexString); + })); + + this._settings.bind('group-apps-use-fixed-width', + this._builder.get_object('group_apps_use_fixed_width_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps-underline-unfocused', + this._builder.get_object('group_apps_underline_unfocused_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps-use-launchers', + this._builder.get_object('group_apps_use_launchers_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('show_group_apps_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Ungrouped application options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_group_apps_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); + this._builder.get_object('group_apps_label_font_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('group-apps-label-font-size', widget.get_value()); + })); + + this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); + this._builder.get_object('group_apps_label_font_weight_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('group-apps-label-font-weight', widget.get_active_id()); + })); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color')); + this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); + }).apply(this); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color-minimized')); + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(rgba); + }).apply(this); + + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('group-apps-label-max-width', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('group-apps-label-font-size', this._settings.get_default_value('group-apps-label-font-size')); + this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); + + this._settings.set_value('group-apps-label-font-weight', this._settings.get_default_value('group-apps-label-font-weight')); + this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); + + this._settings.set_value('group-apps-label-font-color', this._settings.get_default_value('group-apps-label-font-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color')); + this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); + + this._settings.set_value('group-apps-label-font-color-minimized', this._settings.get_default_value('group-apps-label-font-color-minimized')); + let minimizedFontColor = new Gdk.RGBA(); + minimizedFontColor.parse(this._settings.get_string('group-apps-label-font-color-minimized')); + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(minimizedFontColor); + + this._settings.set_value('group-apps-label-max-width', this._settings.get_default_value('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + + this._settings.set_value('group-apps-use-fixed-width', this._settings.get_default_value('group-apps-use-fixed-width')); + this._settings.set_value('group-apps-underline-unfocused', this._settings.get_default_value('group-apps-underline-unfocused')); + this._settings.set_value('group-apps-use-launchers', this._settings.get_default_value('group-apps-use-launchers')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(600, 1); + + })); + + this._builder.get_object('click_action_combo').set_active_id(this._settings.get_string('click-action')); + this._builder.get_object('click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('click-action', widget.get_active_id()); + })); + + this._builder.get_object('shift_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-click-action', widget.get_active_id()); + })); + + this._builder.get_object('middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('middle-click-action', widget.get_active_id()); + })); + this._builder.get_object('shift_middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-middle-click-action', widget.get_active_id()); + })); + + // Create dialog for middle-click options + this._builder.get_object('middle_click_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Customize middle-click behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_middle_click_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); + + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); + + this._settings.bind('shift-click-action', + this._builder.get_object('shift_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('middle-click-action', + this._builder.get_object('middle_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('shift-middle-click-action', + this._builder.get_object('shift_middle_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings for the relevant keys + let keys = ['shift-click-action', 'middle-click-action', 'shift-middle-click-action']; + keys.forEach(function(val) { + this._settings.set_value(val, this._settings.get_default_value(val)); + }, this); + this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(700, 1); + + })); + + this._builder.get_object('scroll_panel_combo').set_active_id(this._settings.get_string('scroll-panel-action')); + this._builder.get_object('scroll_panel_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('scroll-panel-action', widget.get_active_id()); + })); + + this._builder.get_object('scroll_icon_combo').set_active_id(this._settings.get_string('scroll-icon-action')); + this._builder.get_object('scroll_icon_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('scroll-icon-action', widget.get_active_id()); + })); + + // Create dialog for panel scroll options + this._builder.get_object('scroll_panel_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Customize panel scroll behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('scroll_panel_options_box'); + dialog.get_content_area().append(box); + + this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); + this._builder.get_object('scroll_panel_options_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('scroll-panel-delay', widget.get_value()); + })); + + this._settings.bind('scroll-panel-show-ws-popup', + this._builder.get_object('scroll_panel_options_show_ws_popup_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('scroll-panel-delay', this._settings.get_default_value('scroll-panel-delay')); + this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); + + this._settings.set_value('scroll-panel-show-ws-popup', this._settings.get_default_value('scroll-panel-show-ws-popup')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(640, 1); + + })); + + // Create dialog for icon scroll options + this._builder.get_object('scroll_icon_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Customize icon scroll behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('scroll_icon_options_box'); + dialog.get_content_area().append(box); + + this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); + this._builder.get_object('scroll_icon_options_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('scroll-icon-delay', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('scroll-icon-delay', this._settings.get_default_value('scroll-icon-delay')); + this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(640, 1); + + })); + + this._settings.bind('hot-keys', + this._builder.get_object('hot_keys_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('hot-keys', + this._builder.get_object('overlay_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('overlay_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('hotkeys-overlay-combo', widget.get_active_id()); + })); + + this._settings.bind('shortcut-previews', + this._builder.get_object('shortcut_preview_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('shortcut_num_keys_combo').set_active_id(this._settings.get_string('shortcut-num-keys')); + this._builder.get_object('shortcut_num_keys_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shortcut-num-keys', widget.get_active_id()); + })); + + this._settings.connect('changed::hotkey-prefix-text', Lang.bind(this, function() {checkHotkeyPrefix(this._settings);})); + + this._builder.get_object('hotkey_prefix_combo').set_active_id(this._settings.get_string('hotkey-prefix-text')); + + this._settings.bind('hotkey-prefix-text', + this._builder.get_object('hotkey_prefix_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('overlay_combo').set_active_id(this._settings.get_string('hotkeys-overlay-combo')); + + this._settings.bind('hotkeys-overlay-combo', + this._builder.get_object('overlay_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('overlay-timeout', + this._builder.get_object('timeout_spinbutton'), + 'value', + Gio.SettingsBindFlags.DEFAULT); + if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') { + this._builder.get_object('timeout_spinbutton').set_sensitive(false); + } + + this._settings.connect('changed::hotkeys-overlay-combo', Lang.bind(this, function() { + if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') + this._builder.get_object('timeout_spinbutton').set_sensitive(false); + else + this._builder.get_object('timeout_spinbutton').set_sensitive(true); + })); + + this._settings.bind('shortcut-text', + this._builder.get_object('shortcut_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::shortcut-text', Lang.bind(this, function() {setShortcut(this._settings, 'shortcut');})); + + // Create dialog for number overlay options + this._builder.get_object('overlay_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Advanced hotkeys options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_overlay_shortcut'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings for the relevant keys + let keys = ['hotkey-prefix-text', 'shortcut-text', 'hotkeys-overlay-combo', 'overlay-timeout', 'shortcut-previews']; + keys.forEach(function(val) { + this._settings.set_value(val, this._settings.get_default_value(val)); + }, this); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(600, 1); + + })); + + // setup dialog for secondary menu options + this._builder.get_object('secondarymenu_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Secondary Menu Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_secondarymenu_options'); + dialog.get_content_area().append(box); + + this._settings.bind('secondarymenu-contains-appmenu', + this._builder.get_object('secondarymenu_appmenu_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('secondarymenu-contains-showdetails', + this._builder.get_object('secondarymenu_showdetails_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('secondarymenu-contains-appmenu', this._settings.get_default_value('secondarymenu-contains-appmenu')); + this._settings.set_value('secondarymenu-contains-showdetails', this._settings.get_default_value('secondarymenu-contains-showdetails')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(480, 1); + + })); + + // setup dialog for advanced options + this._builder.get_object('button_advanced_options').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Advanced Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_advanced_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(480, 1); + + })); + + // Fine-tune panel + + let sizeScales = [ + {objectName: 'tray_size_scale', valueName: 'tray-size', range: DEFAULT_FONT_SIZES }, + {objectName: 'leftbox_size_scale', valueName: 'leftbox-size', range: DEFAULT_FONT_SIZES }, + {objectName: 'appicon_margin_scale', valueName: 'appicon-margin', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'appicon_padding_scale', valueName: 'appicon-padding', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'tray_padding_scale', valueName: 'tray-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'leftbox_padding_scale', valueName: 'leftbox-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'statusicon_padding_scale', valueName: 'status-icon-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS } + ]; + + for(var idx in sizeScales) { + let size_scale = this._builder.get_object(sizeScales[idx].objectName); + let range = sizeScales[idx].range; + size_scale.set_range(range[range.length - 1], range[0]); + let value; + if (sizeScales[idx].objectName === 'panel_length_scale') { + value = PanelSettings.getPanelLength(this._settings, this._currentMonitorIndex); + } else { + value = this._settings.get_int(sizeScales[idx].valueName); + } + size_scale.set_value(value); + // Add marks from range arrays, omitting the first and last values. + range.slice(1, -1).forEach(function(val) { + size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); + }); + + // Corrent for rtl languages + if (this._rtl) { + // Flip value position: this is not done automatically + size_scale.set_value_pos(Gtk.PositionType.LEFT); + // I suppose due to a bug, having a more than one mark and one above a value of 100 + // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable + // and then manually inverting it + size_scale.set_flippable(false); + size_scale.set_inverted(true); + } + } + + this._settings.bind('animate-app-switch', + this._builder.get_object('animate_app_switch_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-window-launch', + this._builder.get_object('animate_window_launch_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-appicon-hover', + this._builder.get_object('animate_appicon_hover_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-appicon-hover', + this._builder.get_object('animate_appicon_hover_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + { + this._settings.bind('animate-appicon-hover-animation-type', + this._builder.get_object('animate_appicon_hover_options_type_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + let scales = [ + ['animate_appicon_hover_options_duration_scale', 'animate-appicon-hover-animation-duration', 1], + ['animate_appicon_hover_options_rotation_scale', 'animate-appicon-hover-animation-rotation', 1], + ['animate_appicon_hover_options_travel_scale', 'animate-appicon-hover-animation-travel', 100], + ['animate_appicon_hover_options_zoom_scale', 'animate-appicon-hover-animation-zoom', 100], + ['animate_appicon_hover_options_convexity_scale', 'animate-appicon-hover-animation-convexity', 1], + ['animate_appicon_hover_options_extent_scale', 'animate-appicon-hover-animation-extent', 1], + ]; + + let updateScale = scale => { + let [id, key, factor] = scale; + let type = this._settings.get_string('animate-appicon-hover-animation-type'); + let value = this._settings.get_value(key).deep_unpack()[type]; + let defaultValue = this._settings.get_default_value(key).deep_unpack()[type]; + this._builder.get_object(id).sensitive = defaultValue !== undefined; + this._builder.get_object(id).set_value(value * factor || 0); + this._builder.get_object(id).clear_marks(); + this._builder.get_object(id).add_mark(defaultValue * factor, Gtk.PositionType.TOP, + defaultValue !== undefined ? (defaultValue * factor).toString() : ' '); + }; + + scales.forEach(scale => { + let [id, key, factor] = scale; + this._settings.connect('changed::' + key, () => updateScale(scale)); + this._builder.get_object(id).connect('value-changed', widget => { + let type = this._settings.get_string('animate-appicon-hover-animation-type'); + let variant = this._settings.get_value(key); + let unpacked = variant.deep_unpack(); + if (unpacked[type] != widget.get_value() / factor) { + unpacked[type] = widget.get_value() / factor; + this._settings.set_value(key, new GLib.Variant(variant.get_type_string(), unpacked)); + } + }); + }); + + this._settings.connect('changed::animate-appicon-hover-animation-type', () => scales.forEach(updateScale)); + scales.forEach(updateScale); + } + + this._builder.get_object('animate_appicon_hover_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('App icon animation options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('animate_appicon_hover_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('animate-appicon-hover-animation-type', this._settings.get_default_value('animate-appicon-hover-animation-type')); + this._settings.set_value('animate-appicon-hover-animation-duration', this._settings.get_default_value('animate-appicon-hover-animation-duration')); + this._settings.set_value('animate-appicon-hover-animation-rotation', this._settings.get_default_value('animate-appicon-hover-animation-rotation')); + this._settings.set_value('animate-appicon-hover-animation-travel', this._settings.get_default_value('animate-appicon-hover-animation-travel')); + this._settings.set_value('animate-appicon-hover-animation-zoom', this._settings.get_default_value('animate-appicon-hover-animation-zoom')); + this._settings.set_value('animate-appicon-hover-animation-convexity', this._settings.get_default_value('animate-appicon-hover-animation-convexity')); + this._settings.set_value('animate-appicon-hover-animation-extent', this._settings.get_default_value('animate-appicon-hover-animation-extent')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + + })); + + this._settings.bind('stockgs-keep-dash', + this._builder.get_object('stockgs_dash_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('stockgs-keep-top-panel', + this._builder.get_object('stockgs_top_panel_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + + + this._settings.connect('changed::stockgs-keep-top-panel', () => this._maybeDisableTopPosition()); + + this._maybeDisableTopPosition(); + + this._settings.bind('stockgs-panelbtn-click-only', + this._builder.get_object('stockgs_panelbtn_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('stockgs-force-hotcorner', + this._builder.get_object('stockgs_hotcorner_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + // About Panel + + this._builder.get_object('extension_version').set_label(Me.metadata.version.toString() + (Me.metadata.commit ? ' (' + Me.metadata.commit + ')' : '')); + + this._builder.get_object('importexport_export_button').connect('clicked', widget => { + this._showFileChooser( + _('Export settings'), + { action: Gtk.FileChooserAction.SAVE }, + "Save", + filename => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + + out.write_all(GLib.spawn_command_line_sync('dconf dump ' + SCHEMA_PATH)[1], null); + out.close(null); + } + ); + }); + + this._builder.get_object('importexport_import_button').connect('clicked', widget => { + this._showFileChooser( + _('Import settings'), + { action: Gtk.FileChooserAction.OPEN }, + "Open", + filename => { + if (filename && GLib.file_test(filename, GLib.FileTest.EXISTS)) { + let settingsFile = Gio.File.new_for_path(filename); + let [ , pid, stdin, stdout, stderr] = + GLib.spawn_async_with_pipes( + null, + ['dconf', 'load', SCHEMA_PATH], + null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null + ); + + stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); + GLib.close(stdout); + GLib.close(stderr); + + let [ , , , retCode] = GLib.spawn_command_line_sync(GSET + ' -d ' + Me.uuid); + if (retCode == 0) { + GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, () => GLib.spawn_command_line_sync(GSET + ' -e ' + Me.uuid)); + } + + stdin.splice(settingsFile.read(null), Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, null); + } + } + ); + }); + + }, + + _setPreviewTitlePosition: function() { + switch (this._settings.get_string('window-preview-title-position')) { + case 'BOTTOM': + this._builder.get_object('preview_title_position_bottom_button').set_active(true); + break; + case 'TOP': + this._builder.get_object('preview_title_position_top_button').set_active(true); + break; + } + }, + + _showFileChooser: function(title, params, acceptBtn, acceptHandler) { + let dialog = new Gtk.FileChooserDialog(mergeObjects({ title: title, transient_for: this.notebook.get_root() }, params)); + + dialog.add_button("Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button(acceptBtn, Gtk.ResponseType.ACCEPT); + + dialog.show(); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + acceptHandler.call(this, dialog.get_file().get_path()); + dialog.destroy(); + })); + } +}); + + +const BuilderScope = GObject.registerClass({ + Implements: [Gtk.BuilderScope], +}, class BuilderScope extends GObject.Object { + + _init(preferences) { + this._preferences = preferences; + super._init(); + } + + vfunc_create_closure(builder, handlerName, flags, connectObject) { + if (flags & Gtk.BuilderClosureFlags.SWAPPED) + throw new Error('Unsupported template signal flag "swapped"'); + + if (typeof this[handlerName] === 'undefined') + throw new Error(`${handlerName} is undefined`); + + return this[handlerName].bind(connectObject || this); + } + + on_btn_click(connectObject) { + connectObject.set_label("Clicked"); + } + + position_bottom_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.BOTTOM); + } + + position_top_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.TOP); + } + + position_left_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.LEFT); + } + + position_right_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.RIGHT); + } + + dots_bottom_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "BOTTOM"); + } + + dots_top_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "TOP"); + } + + dots_left_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "LEFT"); + } + + dots_right_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "RIGHT"); + } + + preview_title_position_bottom_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('window-preview-title-position', 'BOTTOM'); + } + + preview_title_position_top_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('window-preview-title-position', 'TOP'); + } + + panel_size_scale_value_changed_cb(scale) { + // Avoid settings the size continuously + if (this._preferences._panel_size_timeout > 0) + Mainloop.source_remove(this._preferences._panel_size_timeout); + + this._preferences._panel_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this._preferences, function() { + const value = scale.get_value(); + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelSize(this._settings, monitorIndex, value); + }); + + this._panel_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + tray_size_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._tray_size_timeout > 0) + Mainloop.source_remove(this._preferences._tray_size_timeout); + + this._preferences._tray_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('tray-size', scale.get_value()); + this._preferences._tray_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + leftbox_size_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._leftbox_size_timeout > 0) + Mainloop.source_remove(this._preferences._leftbox_size_timeout); + + this._preferences._leftbox_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('leftbox-size', scale.get_value()); + this._preferences._leftbox_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + appicon_margin_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_margin_timeout > 0) + Mainloop.source_remove(this._preferences._appicon_margin_timeout); + + this._preferences._appicon_margin_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('appicon-margin', scale.get_value()); + this._preferences._appicon_margin_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + appicon_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_padding_timeout > 0) + Mainloop.source_remove(this._preferences._appicon_padding_timeout); + + this._preferences._appicon_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('appicon-padding', scale.get_value()); + this._preferences._appicon_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + tray_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._tray_padding_timeout > 0) + Mainloop.source_remove(this._preferences._tray_padding_timeout); + + this._preferences._tray_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('tray-padding', scale.get_value()); + this._preferences._tray_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + statusicon_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._statusicon_padding_timeout > 0) + Mainloop.source_remove(this._preferences._statusicon_padding_timeout); + + this._preferences._statusicon_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('status-icon-padding', scale.get_value()); + this._preferences._statusicon_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + leftbox_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._leftbox_padding_timeout > 0) + Mainloop.source_remove(this._preferences._leftbox_padding_timeout); + + this._preferences._leftbox_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('leftbox-padding', scale.get_value()); + this._preferences._leftbox_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } +}); + +function init() { + Convenience.initTranslations(); +} + +function buildPrefsWidget() { + Gtk.Window.list_toplevels()[0].set_default_size(680, 740); + + let preferences = new Preferences(); + + return preferences.notebook; +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js new file mode 100644 index 0000000..1e84e82 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js @@ -0,0 +1,598 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gio = imports.gi.Gio; +const Cairo = imports.cairo; +const Clutter = imports.gi.Clutter; +const Pango = imports.gi.Pango; +const St = imports.gi.St; +const Signals = imports.signals; +const Utils = Me.imports.utils; + + +var ProgressManager = Utils.defineClass({ + Name: 'DashToPanel.ProgressManager', + + _init: function() { + + this._entriesByDBusName = {}; + + this._launcher_entry_dbus_signal_id = + Gio.DBus.session.signal_subscribe(null, // sender + 'com.canonical.Unity.LauncherEntry', // iface + null, // member + null, // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onEntrySignalReceived.bind(this)); + + this._dbus_name_owner_changed_signal_id = + Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender + 'org.freedesktop.DBus', // interface + 'NameOwnerChanged', // member + '/org/freedesktop/DBus', // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onDBusNameOwnerChanged.bind(this)); + + this._acquireUnityDBus(); + }, + + destroy: function() { + if (this._launcher_entry_dbus_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id); + } + + if (this._dbus_name_owner_changed_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id); + } + + this._releaseUnityDBus(); + }, + + size: function() { + return Object.keys(this._entriesByDBusName).length; + }, + + lookupByDBusName: function(dbusName) { + return this._entriesByDBusName.hasOwnProperty(dbusName) ? this._entriesByDBusName[dbusName] : null; + }, + + lookupById: function(appId) { + let ret = []; + for (let dbusName in this._entriesByDBusName) { + let entry = this._entriesByDBusName[dbusName]; + if (entry && entry.appId() == appId) { + ret.push(entry); + } + } + + return ret; + }, + + addEntry: function(entry) { + let existingEntry = this.lookupByDBusName(entry.dbusName()); + if (existingEntry) { + existingEntry.update(entry); + } else { + this._entriesByDBusName[entry.dbusName()] = entry; + this.emit('progress-entry-added', entry); + } + }, + + removeEntry: function(entry) { + delete this._entriesByDBusName[entry.dbusName()] + this.emit('progress-entry-removed', entry); + }, + + _acquireUnityDBus: function() { + if (!this._unity_bus_id) { + Gio.DBus.session.own_name('com.canonical.Unity', + Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null); + } + }, + + _releaseUnityDBus: function() { + if (this._unity_bus_id) { + Gio.DBus.session.unown_name(this._unity_bus_id); + this._unity_bus_id = 0; + } + }, + + _onEntrySignalReceived: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !signal_name) + return; + + if (signal_name == 'Update') { + if (!sender_name) { + return; + } + + this._handleUpdateRequest(sender_name, parameters); + } + }, + + _onDBusNameOwnerChanged: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !this.size()) + return; + + let [name, before, after] = parameters.deep_unpack(); + + if (!after) { + if (this._entriesByDBusName.hasOwnProperty(before)) { + this.removeEntry(this._entriesByDBusName[before]); + } + } + }, + + _handleUpdateRequest: function(senderName, parameters) { + if (!senderName || !parameters) { + return; + } + + let [appUri, properties] = parameters.deep_unpack(); + let appId = appUri.replace(/(^\w+:|^)\/\//, ''); + let entry = this.lookupByDBusName(senderName); + + if (entry) { + entry.setDBusName(senderName); + entry.update(properties); + } else { + let entry = new AppProgress(senderName, appId, properties); + this.addEntry(entry); + } + } +}); +Signals.addSignalMethods(ProgressManager.prototype); + +var AppProgress = Utils.defineClass({ + Name: 'DashToPanel.AppProgress', + + _init: function(dbusName, appId, properties) { + this._dbusName = dbusName; + this._appId = appId; + this._count = 0; + this._countVisible = false; + this._progress = 0.0; + this._progressVisible = false; + this._urgent = false; + this.update(properties); + }, + + appId: function() { + return this._appId; + }, + + dbusName: function() { + return this._dbusName; + }, + + count: function() { + return this._count; + }, + + setCount: function(count) { + if (this._count != count) { + this._count = count; + this.emit('count-changed', this._count); + } + }, + + countVisible: function() { + return this._countVisible; + }, + + setCountVisible: function(countVisible) { + if (this._countVisible != countVisible) { + this._countVisible = countVisible; + this.emit('count-visible-changed', this._countVisible); + } + }, + + progress: function() { + return this._progress; + }, + + setProgress: function(progress) { + if (this._progress != progress) { + this._progress = progress; + this.emit('progress-changed', this._progress); + } + }, + + progressVisible: function() { + return this._progressVisible; + }, + + setProgressVisible: function(progressVisible) { + if (this._progressVisible != progressVisible) { + this._progressVisible = progressVisible; + this.emit('progress-visible-changed', this._progressVisible); + } + }, + + urgent: function() { + return this._urgent; + }, + + setUrgent: function(urgent) { + if (this._urgent != urgent) { + this._urgent = urgent; + this.emit('urgent-changed', this._urgent); + } + }, + + setDBusName: function(dbusName) { + if (this._dbusName != dbusName) { + let oldName = this._dbusName; + this._dbusName = dbusName; + this.emit('dbus-name-changed', oldName); + } + }, + + update: function(other) { + if (other instanceof AppProgress) { + this.setDBusName(other.dbusName()) + this.setCount(other.count()); + this.setCountVisible(other.countVisible()); + this.setProgress(other.progress()); + this.setProgressVisible(other.progressVisible()) + this.setUrgent(other.urgent()); + } else { + for (let property in other) { + if (other.hasOwnProperty(property)) { + if (property == 'count') { + this.setCount(other[property].get_int64()); + } else if (property == 'count-visible') { + this.setCountVisible(Me.settings.get_boolean('progress-show-count') && other[property].get_boolean()); + } else if (property == 'progress') { + this.setProgress(other[property].get_double()); + } else if (property == 'progress-visible') { + this.setProgressVisible(Me.settings.get_boolean('progress-show-bar') && other[property].get_boolean()); + } else if (property == 'urgent') { + this.setUrgent(other[property].get_boolean()); + } else { + // Not implemented yet + } + } + } + } + } +}); +Signals.addSignalMethods(AppProgress.prototype); + + +var ProgressIndicator = Utils.defineClass({ + Name: 'DashToPanel.ProgressIndicator', + + _init: function(source, progressManager) { + this._source = source; + this._progressManager = progressManager; + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._sourceDestroyId = this._source.actor.connect('destroy', () => { + this._signalsHandler.destroy(); + }); + + this._notificationBadgeLabel = new St.Label({ style_class: 'badge' }); + this._notificationBadgeBin = new St.Bin({ + child: this._notificationBadgeLabel, y: 2, x: 2 + }); + this._notificationBadgeLabel.add_style_class_name('notification-badge'); + this._notificationBadgeCount = 0; + this._notificationBadgeBin.hide(); + + this._source._dtpIconContainer.add_child(this._notificationBadgeBin); + this._source._dtpIconContainer.connect('notify::allocation', this.updateNotificationBadge.bind(this)); + + this._progressManagerEntries = []; + this._progressManager.lookupById(this._source.app.id).forEach( + (entry) => { + this.insertEntry(entry); + } + ); + + this._signalsHandler.add([ + this._progressManager, + 'progress-entry-added', + this._onEntryAdded.bind(this) + ], [ + this._progressManager, + 'progress-entry-removed', + this._onEntryRemoved.bind(this) + ]); + }, + + destroy: function() { + this._source.actor.disconnect(this._sourceDestroyId); + this._signalsHandler.destroy(); + }, + + _onEntryAdded: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.insertEntry(entry); + } + }, + + _onEntryRemoved: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.removeEntry(entry); + } + }, + + updateNotificationBadge: function() { + this._source.updateNumberOverlay(this._notificationBadgeBin); + this._notificationBadgeLabel.clutter_text.ellipsize = Pango.EllipsizeMode.MIDDLE; + }, + + _notificationBadgeCountToText: function(count) { + if (count <= 9999) { + return count.toString(); + } else if (count < 1e5) { + let thousands = count / 1e3; + return thousands.toFixed(1).toString() + "k"; + } else if (count < 1e6) { + let thousands = count / 1e3; + return thousands.toFixed(0).toString() + "k"; + } else if (count < 1e8) { + let millions = count / 1e6; + return millions.toFixed(1).toString() + "M"; + } else if (count < 1e9) { + let millions = count / 1e6; + return millions.toFixed(0).toString() + "M"; + } else { + let billions = count / 1e9; + return billions.toFixed(1).toString() + "B"; + } + }, + + setNotificationBadge: function(count) { + this._notificationBadgeCount = count; + let text = this._notificationBadgeCountToText(count); + this._notificationBadgeLabel.set_text(text); + }, + + toggleNotificationBadge: function(activate) { + if (activate && this._notificationBadgeCount > 0) { + this.updateNotificationBadge(); + this._notificationBadgeBin.show(); + } + else + this._notificationBadgeBin.hide(); + }, + + _showProgressOverlay: function() { + if (this._progressOverlayArea) { + this._updateProgressOverlay(); + return; + } + + this._progressOverlayArea = new St.DrawingArea({x_expand: true, y_expand: true}); + this._progressOverlayArea.add_style_class_name('progress-bar'); + this._progressOverlayArea.connect('repaint', () => { + this._drawProgressOverlay(this._progressOverlayArea); + }); + + this._source._iconContainer.add_child(this._progressOverlayArea); + let node = this._progressOverlayArea.get_theme_node(); + + let [hasColor, color] = node.lookup_color('-progress-bar-background', false); + if (hasColor) + this._progressbar_background = color + else + this._progressbar_background = new Clutter.Color({red: 204, green: 204, blue: 204, alpha: 255}); + + [hasColor, color] = node.lookup_color('-progress-bar-border', false); + if (hasColor) + this._progressbar_border = color; + else + this._progressbar_border = new Clutter.Color({red: 230, green: 230, blue: 230, alpha: 255}); + + this._updateProgressOverlay(); + }, + + _hideProgressOverlay: function() { + if (this._progressOverlayArea) + this._progressOverlayArea.destroy(); + + this._progressOverlayArea = null; + this._progressbar_background = null; + this._progressbar_border = null; + }, + + _updateProgressOverlay: function() { + + if (this._progressOverlayArea) { + this._progressOverlayArea.queue_repaint(); + } + }, + + _drawProgressOverlay: function(area) { + let scaleFactor = Utils.getScaleFactor(); + let [surfaceWidth, surfaceHeight] = area.get_surface_size(); + let cr = area.get_context(); + + let iconSize = this._source.icon.iconSize * scaleFactor; + + let x = Math.floor((surfaceWidth - iconSize) / 2); + let y = Math.floor((surfaceHeight - iconSize) / 2); + + let lineWidth = Math.floor(1.0 * scaleFactor); + let padding = Math.floor(iconSize * 0.05); + let width = iconSize - 2.0*padding; + let height = Math.floor(Math.min(18.0*scaleFactor, 0.20*iconSize)); + x += padding; + y += iconSize - height - padding; + + cr.setLineWidth(lineWidth); + + // Draw the outer stroke + let stroke = new Cairo.LinearGradient(0, y, 0, y + height); + let fill = null; + stroke.addColorStopRGBA(0.5, 0.5, 0.5, 0.5, 0.1); + stroke.addColorStopRGBA(0.9, 0.8, 0.8, 0.8, 0.4); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the background + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + stroke = Cairo.SolidPattern.createRGBA(0.20, 0.20, 0.20, 0.9); + fill = new Cairo.LinearGradient(0, y, 0, y + height); + fill.addColorStopRGBA(0.4, 0.25, 0.25, 0.25, 1.0); + fill.addColorStopRGBA(0.9, 0.35, 0.35, 0.35, 1.0); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the finished bar + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + let finishedWidth = Math.ceil(this._progress * width); + + let bg = this._progressbar_background; + let bd = this._progressbar_border; + + stroke = Cairo.SolidPattern.createRGBA(bd.red/255, bd.green/255, bd.blue/255, bd.alpha/255); + fill = Cairo.SolidPattern.createRGBA(bg.red/255, bg.green/255, bg.blue/255, bg.alpha/255); + + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + Utils.drawRoundedLine(cr, x + lineWidth/2.0 + width - finishedWidth, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + else + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + + cr.$dispose(); + }, + + setProgress: function(progress) { + this._progress = Math.min(Math.max(progress, 0.0), 1.0); + this._updateProgressOverlay(); + }, + + toggleProgressOverlay: function(activate) { + if (activate) { + this._showProgressOverlay(); + } + else { + this._hideProgressOverlay(); + } + }, + + insertEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) !== -1) + return; + + this._progressManagerEntries.push(appProgress); + this._selectEntry(appProgress); + }, + + removeEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) == -1) + return; + + this._progressManagerEntries.splice(this._progressManagerEntries.indexOf(appProgress), 1); + + if (this._progressManagerEntries.length > 0) { + this._selectEntry(this._progressManagerEntries[this._progressManagerEntries.length-1]); + } else { + this.setNotificationBadge(0); + this.toggleNotificationBadge(false); + this.setProgress(0); + this.toggleProgressOverlay(false); + this.setUrgent(false); + } + }, + + _selectEntry: function(appProgress) { + if (!appProgress) + return; + + this._signalsHandler.removeWithLabel('progress-entry'); + + this._signalsHandler.addWithLabel('progress-entry', + [ + appProgress, + 'count-changed', + (appProgress, value) => { + this.setNotificationBadge(value); + } + ], [ + appProgress, + 'count-visible-changed', + (appProgress, value) => { + this.toggleNotificationBadge(value); + } + ], [ + appProgress, + 'progress-changed', + (appProgress, value) => { + this.setProgress(value); + } + ], [ + appProgress, + 'progress-visible-changed', + (appProgress, value) => { + this.toggleProgressOverlay(value); + } + ], [ + appProgress, + 'urgent-changed', + (appProgress, value) => { + this.setUrgent(value) + } + ]); + + this.setNotificationBadge(appProgress.count()); + this.toggleNotificationBadge(appProgress.countVisible()); + this.setProgress(appProgress.progress()); + this.toggleProgressOverlay(appProgress.progressVisible()); + + this._isUrgent = false; + }, + + setUrgent: function(urgent) { + const icon = this._source.icon._iconBin; + if (urgent) { + if (!this._isUrgent) { + icon.set_pivot_point(0.5, 0.5); + this._source.iconAnimator.addAnimation(icon, 'dance'); + this._isUrgent = true; + } + } else { + if (this._isUrgent) { + this._source.iconAnimator.removeAnimation(icon, 'dance'); + this._isUrgent = false; + } + icon.rotation_angle_z = 0; + } + } +}); diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js new file mode 100644 index 0000000..c298f84 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js @@ -0,0 +1,262 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Lang = imports.lang; +const Meta = imports.gi.Meta; + +const Layout = imports.ui.layout; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; + +//timeout intervals +const MIN_UPDATE_MS = 200; + +//timeout names +const T1 = 'limitUpdateTimeout'; + +var Mode = { + ALL_WINDOWS: 0, + FOCUSED_WINDOWS: 1, + MAXIMIZED_WINDOWS: 2 +}; + +var ProximityWatch = Utils.defineClass({ + Name: 'DashToPanel.ProximityWatch', + + _init: function(actor, mode, xThreshold, yThreshold, handler) { + this.actor = actor; + this.overlap = 0; + this.mode = mode; + this.threshold = [xThreshold, yThreshold]; + this.handler = handler; + + this._allocationChangedId = actor.connect('notify::allocation', () => this._update()); + + this._update(); + }, + + destroy: function() { + this.actor.disconnect(this._allocationChangedId); + }, + + _update: function() { + this.monitorIndex = Main.layoutManager.findIndexForActor(this.actor); + + this._updateWatchRect(); + }, + + _updateWatchRect: function() { + let [actorX, actorY] = this.actor.get_position(); + + this.rect = new Meta.Rectangle({ + x: actorX - this.threshold[0], + y: actorY - this.threshold[1], + width: this.actor.width + this.threshold[0] * 2, + height: this.actor.height + this.threshold[1] * 2 + }); + }, +}); + +var ProximityManager = Utils.defineClass({ + Name: 'DashToPanel.ProximityManager', + + _init: function() { + this._counter = 1; + this._watches = {}; + this._focusedWindowInfo = null; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._bindSignals(); + this._setFocusedWindow(); + }, + + createWatch: function(actor, mode, xThreshold, yThreshold, handler) { + let watch = new ProximityWatch(actor, mode, xThreshold, yThreshold, handler); + + this._watches[this._counter] = watch; + this.update(); + + return this._counter++; + }, + + removeWatch: function(id) { + if (this._watches[id]) { + this._watches[id].destroy(); + delete this._watches[id]; + } + }, + + update: function() { + this._queueUpdate(true); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + this._disconnectFocusedWindow(); + Object.keys(this._watches).forEach(id => this.removeWatch(id)); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + global.window_manager, + 'switch-workspace', + () => Object.keys(this._watches).forEach(id => this._watches[id].overlap = 0) + ], + [ + Main.overview, + 'hidden', + () => this._queueUpdate() + ], + [ + global.display, + 'notify::focus-window', + () => { + this._setFocusedWindow(); + this._queueUpdate(); + } + ], + [ + global.window_group, + [ + 'actor-added', + 'actor-removed' + ], + () => this._queueUpdate() + ] + ); + }, + + _setFocusedWindow: function() { + this._disconnectFocusedWindow(); + + let focusedWindow = global.display.focus_window; + + if (focusedWindow) { + let focusedWindowInfo = this._getFocusedWindowInfo(focusedWindow); + + if (focusedWindowInfo && this._checkIfHandledWindowType(focusedWindowInfo.metaWindow)) { + focusedWindowInfo.allocationId = focusedWindowInfo.window.connect('notify::allocation', () => this._queueUpdate()); + focusedWindowInfo.destroyId = focusedWindowInfo.window.connect('destroy', () => this._disconnectFocusedWindow(true)); + + this._focusedWindowInfo = focusedWindowInfo; + } + } + }, + + _getFocusedWindowInfo: function(focusedWindow) { + let window = focusedWindow.get_compositor_private(); + let focusedWindowInfo; + + if (window) { + focusedWindowInfo = { window: window }; + focusedWindowInfo.metaWindow = focusedWindowInfo.window.get_meta_window(); + + if (focusedWindow.is_attached_dialog()) { + let mainMetaWindow = focusedWindow.get_transient_for(); + + if (focusedWindowInfo.metaWindow.get_frame_rect().height < mainMetaWindow.get_frame_rect().height) { + focusedWindowInfo.window = mainMetaWindow.get_compositor_private(); + focusedWindowInfo.metaWindow = mainMetaWindow; + } + } + } + + return focusedWindowInfo; + }, + + _disconnectFocusedWindow: function(destroy) { + if (this._focusedWindowInfo && !destroy) { + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.allocationId); + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.destroyId); + } + + this._focusedWindowInfo = null; + }, + + _getHandledWindows: function() { + return global.get_window_actors() + .filter(w => w.visible) + .map(w => w.get_meta_window()) + .filter(mw => this._checkIfHandledWindow(mw)); + }, + + _checkIfHandledWindow: function(metaWindow) { + return metaWindow && !metaWindow.minimized && + this._checkIfHandledWindowType(metaWindow); + }, + + _checkIfHandledWindowType: function(metaWindow) { + let metaWindowType = metaWindow.get_window_type(); + + //https://www.roojs.org/seed/gir-1.2-gtk-3.0/seed/Meta.WindowType.html + return metaWindowType <= Meta.WindowType.SPLASHSCREEN && + metaWindowType != Meta.WindowType.DESKTOP; + }, + + _queueUpdate: function(noDelay) { + if (!noDelay && this._timeoutsHandler.getId(T1)) { + //limit the number of updates + this._pendingUpdate = true; + return; + } + + this._timeoutsHandler.add([T1, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + + let metaWindows = this._getHandledWindows(); + + Object.keys(this._watches).forEach(id => { + let watch = this._watches[id]; + let overlap = this._update(watch, metaWindows); + + if (overlap !== watch.overlap) { + watch.handler(overlap); + watch.overlap = overlap; + } + }); + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdate(); + } + }, + + _update: function(watch, metaWindows) { + if (watch.mode === Mode.FOCUSED_WINDOWS) { + return (this._focusedWindowInfo && + this._checkIfHandledWindow(this._focusedWindowInfo.metaWindow) && + this._checkProximity(this._focusedWindowInfo.metaWindow, watch)); + } else if (watch.mode === Mode.MAXIMIZED_WINDOWS) { + return metaWindows.some(mw => mw.maximized_vertically && mw.maximized_horizontally && + mw.get_monitor() == watch.monitorIndex); + } + + //Mode.ALL_WINDOWS + return metaWindows.some(mw => this._checkProximity(mw, watch)); + }, + + _checkProximity: function(metaWindow, watch) { + return metaWindow.get_frame_rect().overlap(watch.rect); + }, +}); \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..ef5dc7d725cc6ada68fe998189bc3350e0edcf9b GIT binary patch literal 17276 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 U$w{AwIrcfSca2Za-&NTE0-?-ey8r+H literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml new file mode 100644 index 0000000..7e8ea3a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -0,0 +1,1278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'BOTTOM' + Panel position (Deprecated) + Panel is shown on the Bottom or Top of the screen. + + + true + Sync element positions + Sync panel element positions on all monitors. + + + '{}' + Panel positions + Panel positions (JSON). + + + '{}' + Panel element positions + Panel element positions (JSON). + + + '{}' + Percentages of screen edge for panel to span + Length of the panels, in percent (JSON). + + + '{}' + Positions along screen edge + Where to show the panels if it is not the full length of the screen edge (JSON). + + + '{}' + Panel sizes + Sizes of panels, in pixels. + + + 48 + Panel size (Deprecated) + Set the size of the panel. + + + false + Override Show Desktop line color + Replace current Show Desktop button line color + + + "rgba(200,200,200,0.2)" + Custom Show Desktop line color + Custom Show Desktop button line color + + + 'BOTTOM' + Dot position + Running indicators are shown on the Bottom or Top of the screen. + + + 'METRO' + Style of the running indicator (focused) + Style of the running indicator for the icon for the currently focused application + + + 'METRO' + Style of the running indicator (unfocused) + Style of the running indicator for the icon for applications which are not currently focused + + + false + Running indicator dominant color + Whether to use the app icon's dominant color for .app-well-running-dot + + + false + Running indicator color override + Whether to override the theme background color for .app-well-running-dot + + + "#5294e2" + Color of running indicator (1 window) + Customize the color of the running indicator when one window is running for that application + + + "#5294e2" + Color of running indicator (2 windows) + Customize the color of the running indicator when two windows are running for that application + + + "#5294e2" + Color of running indicator (3 windows) + Customize the color of the running indicator when three windows are running for that application + + + "#5294e2" + Color of running indicator (4+ windows) + Customize the color of the running indicator when four or more windows are running for that application + + + false + Unfocused color is different than focused + Whether to apply a 2nd color scheme to the indicator when the app is not focused + + + "#5294e2" + Color of unfocused running indicator (1 window) + Customize the color of the unfocused running indicator when one window is running for that application + + + "#5294e2" + Color of unfocused running indicator (2 windows) + Customize the color of the unfocused running indicator when two windows are running for that application + + + "#5294e2" + Color of unfocused running indicator (3 windows) + Customize the color of the unfocused running indicator when three windows are running for that application + + + "#5294e2" + Color of unfocused running indicator (4+ windows) + Customize the color of the unfocused running indicator when four or more windows are running for that application + + + 3 + Running indicator height + Height of the running indicator line/diameter of window indicator dots + + + true + Highlight icon of focused application + Whether to highlight the background of the currently focused application's icon + + + false + Highlight icon dominant color + Base the active window highlight color on that application's icon + + + "#EEEEEE" + Color of highlight of focused application + Customize the color of the highlight of the focused application + + + 25 + Opacity of highlight of focused application + Customize the opacity of the highlight of the focused application + + + false + Keep dash + Whether to keep the stock gnome-shell dash while in overview + + + false + Keep top panel + Whether to keep the stock gnome-shell top panel + + + false + Panel menu buttons require click + Whether to activate the panel menu buttons on hover or on click + + + false + Force hot corner + Wheter to force having an Activities hot corner on the primary monitor + + + false + Lock the taskbar + Specifies if the user can modify the taskbar + + + false + Override theme background color + Replace current theme background color for the panel + + + "#000" + Custom background color + Custom background color for the panel + + + false + Custom background color + Replace current theme background color for the panel + + + false + Dynamic opacity + Enable dynamic opacity + + + 0.4 + Panel opacity + Custom opacity for the panel + + + 'ALL_WINDOWS' + Dynamic opacity behavior + Dictates which window type affects the panel opacity + + + 20 + Distance to change opacity + The distance a window needs to be from the panel to change opacity + + + 0.8 + Modified panel opacity + Modified opacity for the panel when a window is near + + + 300 + Opacity change duration + The duration of the animation when the opacity changes + + + false + Custom gradient + Replace current theme gradient for the panel + + + "#000" + Custom gradient top color + Custom gradient top color for the panel + + + 0 + Custom gradient top opacity + Custom gradient top opacity for the panel + + + "#000" + Custom gradient bottom color + Custom gradient bottom color for the panel + + + 0.2 + Custom gradient bottom opacity + Custom gradient bottom opacity for the panel + + + false + Intellihide + Whether to intelligently hide the panel + + + false + Only hide from windows + Dictates if the dash should only hide when in conflict with windows + + + 'FOCUSED_WINDOWS' + Intellihide behaviour + Dictates how to intelligently hide the panel + + + false + Intellihide pressure + To reveal the panel, pressure needs to be applied to the edege of the screen + + + 100 + Intellihide pressure threshold + The pressure needed to reveal the panel + + + 1000 + Intellihide pressure time + The numer of milliseconds that the pressure needs to be applied to reveal the panel + + + false + Intellihide pressure + Allow the panel to be revealed while an application is in fullscreen mode + + + false + Intellihide only secondary + Whether to only hide secondary panels + + + 200 + Intellihide animation time + The animation time (ms) to hide and reveal the panel + + + 400 + Intellihide close delay + The delay (ms) before hiding the panel + + + "<Super>i" + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + i']]]> + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + 2000 + Intellihide enable start delay + The delay before enabling intellihide on start + + + "" + Custom Show Applications icon + Customize the Show Applications icon + + + 8 + Show Applications icon side padding + Customize the Show Applications icon side padding + + + true + Override escape key + Override the escape key to return to the desktop when entering the overview using the Show Applications button + + + [] + Show Apps button context menu commands + Commands to add to the Show Apps button right click menu + + + [] + Show Apps button context menu titles + Titles for commands added to Show Apps button right click menu + + + [] + Panel context menu commands + Commands to add to the panel right click menu + + + [] + Panel context menu titles + Titles for commands added to panel right click menu + + + false + Show activities button + Show activities button on the left hand side of the taskbar + + + 8 + Width of show Desktop button + Customize the width of the show Desktop button + + + false + Show desktop on hover + Show the desktop on mouse hover + + + 1000 + Delay show desktop + Delay before showing the desktop + + + 300 + Show desktop animation time + Window fade animation time when showing the destop + + + false + Show appMenu button + Show appMenu on the right hand side of the panel + + + true + Show window preview + Show preview of running window on hover of app icon + + + true + Show tooltip + Show tooltip on hover of app icon + + + true + Show running apps + Show or hide running application icons in the dash + + + true + Show favorites apps + Show or hide favorite application icons in the dash + + + 400 + Icon enter display time + Amount of time after entering icon to wait before displaying window preview if icon is not clicked or mouse has not left. + + + true + Enable peek mode + Peek a window upon hover for some time + + + true + Display title in preview + Display window title in preview + + + false + Window previews manual styling + This defines if the default window previews styling should be applied + + + 'TOP' + Title position + Position of the window title, close button and icon in preview. + + + "#dddddd" + Window previews title font color + This defines the window preview titles font color. + + + 14 + Window previews title font size + This defines the window preview titles font size. + + + false + Window previews use custom icon size + Window previews use custom application icon size. + + + 16 + Window previews custom icon size + Window previews custom application icon size. + + + 260 + Window previews animation time + This defines the window previews animation time. + + + 'inherit' + Font weight of window preview titles + This defines the font weight of window preview titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. + + + 240 + Window previews size + Preferred window previews size + + + false + Fixed aspect ratio X + This defines if the window previews use a fixed aspect ratio X. + + + true + Fixed aspect ratio Y + This defines if the window previews use a fixed aspect ratio Y. + + + 8 + Window previews padding + The padding of the window previews + + + 16 + Aspect ratio X + The window previews respected aspect ratio X. + + + 9 + Aspect ratio Y + The window previews respected aspect ratio Y. + + + false + Immediate hide on icon click + The window previews immediately hide when an application icon is clicked. + + + false + Provide workspace isolation + Dash shows only windows from the current workspace + + + false + Close overview by clicking in empty space + Close overview or app grid by clicking in empty space + + + false + Hide overview on startup + Hide overview on startup, which would be shown by default at gnome startup. + + + true + Group applications + Dash groups the application instances under the same icon + + + 14 + Application title font size + When the applications are ungrouped, this defines the application titles font size. + + + 'inherit' + Font weight of application titles + When the applications are ungrouped, this defines font weight of application titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. + + + "#dddddd" + Application title font color + When the applications are ungrouped, this defines the application titles font color. + + + "#dddddd" + Minimized application title font color + When the applications are ungrouped, this defines the titles font color for minimized applications. + + + 160 + Application title max width + When the applications are ungrouped, this defines the application titles maximum width. + + + true + Use a fixed width for the application titles + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + + + true + Display running indicators on unfocused applications + When the applications are ungrouped, this defines if running applications should display an indicator. + + + false + Use favorite icons as application launchers + When the applications are ungrouped, this defines if running applications stay separate from the favorite icons. + + + 0 + Primary monitor index + Specifies the index of the primary monitor. + + + true + Display panels on all monitors + Specifies if a panel is shown on every monitors + + + [] + Available monitors + Available gnome-shell (Mutter) monitors, internal use + + + false + Provide monitor isolation + Dash shows only windows from the current monitor + + + true + Display the favorites on all monitors + Specifies if every panel should display the favorite applications. If false, the favorite appplications are only displayed on the primary monitor. + + + true + Customize click behaviour + Customize action on various mouse events + + + true + Minimize on shift+click + + + true + Activate only one window + + + 'CYCLE-MIN' + Action when clicking on a running app + Set the action that is executed when clicking on the icon of a running application + + + 'MINIMIZE' + Action when shift+clicking on a running app + Set the action that is executed when shift+clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when middle-clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when shift+middle-clicking on the icon of a running application + + + 'SWITCH_WORKSPACE' + Action when scrolling over the panel + Set the action that is executed when scrolling over the panel + + + 0 + Delay between panel mouse scroll events + Set the minimum delay between panel mouse scroll events + + + true + Show the workspace switch head-up when workspace is changed by scrolling on the panel + + + 'CYCLE_WINDOWS' + Action when scrolling over a running app + Set the action that is executed when scrolling over a running application + + + 0 + Delay between icon mouse scroll events + Set the minimum delay between icon mouse scroll events + + + 100 + Icon leave preview timeout + Amount of time to leave preview windows open when the mouse has left the application's icon. + + + 500 + Enter window peeking mode timeout + Amount of time of inactivity to enter the window peeking mode when the mouse has entered a window preview. + + + 40 + Window peeking mode opacity + All windows except for the peeked one have their opacity set to the same value. + + + true + Middle click preview to close window + Middle click on the window preview to close that window + + + true + Window previews use custom opacity + Window previews background use a different opacity from the panel + + + 80 + Window previews background opacity + Window previews use this custom background opacity. + + + 0 + Tray font size + Set the size of the tray font. (0 for default) + + + 0 + Leftbox font size + Set the size of the leftBox font. (0 for default) + + + 8 + App icon margin + Set the margin for application icons in the embedded dash. + + + 4 + App icon padding + Set the padding for application icons in the embedded dash. + + + -1 + Tray item padding + Set the size of the tray padding. (-1 for default) + + + -1 + Leftbox item padding + Set the size of the leftBox padding. (-1 for default) + + + -1 + Status icon padding + Set the size of the aggregate (status) menu icon padding. (-1 for default) + + + true + Animate running indicator when open/closing/switching applications + + + true + Animate when new window launched + + + false + Animate app icon on hover + + + 'SIMPLE' + App icon hover animation type + + + {'RIPPLE':2,'PLANK':1} + App icon hover animation curve convexity (1 is linear, more is convex, less is concave) + + + {'SIMPLE':160,'RIPPLE':130,'PLANK':100} + App icon hover animation duration in milliseconds + + + {'RIPPLE':4,'PLANK':4} + App icon hover animation extent (maximum number of animated icons) + + + {'SIMPLE':0,'RIPPLE':10,'PLANK':0} + App icon hover animation rotation in degrees + + + {'SIMPLE':0.30,'RIPPLE':0.40,'PLANK':0} + App icon hover animation travel translation in relation to the app icon size + + + {'SIMPLE':1,'RIPPLE':1.25,'PLANK':2} + App icon hover animation zoom scale in relation to the app icon size + + + true + Integrate items from the gnome appmenu into the right click menu + + + false + Display Show Details to open Gnome Software from right click menu + + + "<Super>q" + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + q']]]> + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + 2000 + Timeout to hide the dock, in seconds + Sets the time duration before the dock is hidden again. + + + 750 + Timeout to hide the dock, in seconds + Sets the time duration before the dock is hidden again. + + + 'TEMPORARILY' + Transitivity of the number overlay + You can choose between NEVER, TEMPORARILY and ALWAYS. + + + false + Super Hot-Keys + Launch and switch between dash items using Super+(0-9) + + + 'Super' + Prefix to use for hotkeys + You can choose between Super or SuperAlt as the prefix for hotkeys. + + + false + Show window previews + When multiple instances of the application are available, show their window previews + + + 'BOTH' + Hotkeys number keys + Which number keys are used for the hotkeys + + + 1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + 2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + 3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + 4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + 5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + 6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + 7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + 8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + 9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + 0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + 1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + 2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + 3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + 4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + 5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + 6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + 7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + 8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + 9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + 0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + 1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + 2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + 3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + 4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + 5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + 6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + 7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + 8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + 9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + 0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + KP_1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + KP_2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + KP_3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + KP_4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + KP_5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + KP_6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + KP_7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + KP_8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + KP_9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + KP_0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + KP_1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + KP_4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + KP_5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + KP_6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + KP_7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + KP_8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + KP_9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + KP_0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + KP_1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + KP_4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + KP_5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + KP_6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + KP_7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + KP_8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + KP_9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + KP_0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + true + Show progress bar on app icon + Whether to show progress bar overlay on app icon, for supported applications. + + + true + Show badge count on app icon + Whether to show badge count overlay on app icon, for supported applications. + + + diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css new file mode 100644 index 0000000..6917e24 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css @@ -0,0 +1,151 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +#dashtopanelTaskbar .dash-item-container > StWidget { + margin: 0; + padding: 0; +} + +#dashtopanelScrollview .app-well-app .overview-icon, +.dashtopanelMainPanel .show-apps .overview-icon { + background: none; + border: none; + margin: 0; + padding: 0; +} + +#dashtopanelScrollview .app-well-app .overview-label { + /* must match TITLE_RIGHT_PADDING in apppicons.js */ + padding-right: 8px; +} + +#dashtopanelScrollview .app-well-app:hover .overview-icon, +#dashtopanelScrollview .app-well-app:focus .overview-icon { + background: none; +} + +.dashtopanelMainPanel .show-apps:hover .overview-icon, +#dashtopanelScrollview .app-well-app:hover .dtp-container, +#dashtopanelScrollview .app-well-app:focus .dtp-container { + background-color: rgba(238, 238, 236, 0.1); +} + +#dashtopanelScrollview .app-well-app:hover .dtp-container.animate-appicon-hover { + background: none; +} + +#dashtopanelScrollview .app-well-app:active .dtp-container { + background-color: rgba(238, 238, 236, 0.18); +} + +#dashtopanelScrollview .app-well-app .favorite { + background-color: rgba(80, 150, 255, 0.4); +} + +#dashtopanelScrollview .app-well-app-running-dot { + margin-bottom: 0; +} + +#dashtopanelTaskbar .scrollview-fade { + background-gradient-end: rgba(0, 0, 0, 0); +} + +.dashtopanelSecondaryMenu { + max-width: 400px; +} + +.dashtopanelMainPanel.vertical .panel-button { + text-align: center; +} + +.dashtopanelMainPanel.vertical .panel-button.vertical *, +.dashtopanelMainPanel.vertical .panel-button.clock-display * { + padding: 0; + margin: 0; +} + +.dashtopanelMainPanel.vertical .panel-button > *, +.dashtopanelMainPanel.vertical .panel-button.vertical > *, +.dashtopanelMainPanel.vertical .panel-button.clock-display > * { + padding: 8px 0; +} + +#dashtopanelThumbnailList { + spacing: 0em; + padding: 0 1em; +} + +#dashtopanelThumbnailList .popup-menu-item { + padding: 0; + border-radius: 5px; + spacing: 0; +} + +#dashtopanelThumbnailList .window-box { + padding: 0; + spacing: 0; +} + +#dashtopanelThumbnailList .preview-window-title { + padding-top: 1em; +} + +.popup-menu.panel-menu { + margin-bottom: 0; +} + +#panel #panelLeft, #panel #panelCenter { + spacing: 0px; +} + +.showdesktop-button-dark-hovered { + background-color: rgba(200, 200, 200, .4); +} + +.showdesktop-button-light-hovered { + background-color: rgba(55, 55, 55, .4); +} + +.panel-corner.hidden:active, .panel-corner.hidden:overview, .panel-corner.hidden:focus { + -panel-corner-border-color: rgba(0, 0, 0, .001); +} +#dashtopanelScrollview .badge { + color: rgba(255, 255, 255, 1); + font-weight: bold; + text-align: center; +} + +#dashtopanelScrollview .number-overlay { + background-color: rgba(0,0,0,0.8); +} + +#dashtopanelScrollview .notification-badge { + background-color: rgba(255,0,0,0.8); +} + +#dashtopanelScrollview .progress-bar { + /* Customization of the progress bar style, e.g.: + -progress-bar-background: rgba(0.8, 0.8, 0.8, 1); + -progress-bar-border: rgba(0.9, 0.9, 0.9, 1); + */ +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js new file mode 100644 index 0000000..4f74d1e --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js @@ -0,0 +1,1557 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Signals = imports.signals; +const Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; + +const SearchController = imports.ui.main.overview._overview._controls._searchController; +const AppDisplay = imports.ui.main.overview._overview._controls.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const AppIcons = Me.imports.appIcons; +const Panel = Me.imports.panel; +const PanelManager = Me.imports.panelManager; +const PanelSettings = Me.imports.panelSettings; +const Pos = Me.imports.panelPositions; +const Utils = Me.imports.utils; +const WindowPreview = Me.imports.windowPreview; + +var DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME / (Dash.DASH_ANIMATION_TIME > 1 ? 1000 : 1); +var DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; +var MIN_ICON_SIZE = 4; + +/** + * Extend DashItemContainer + * + * - set label position based on taskbar orientation + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this ugly pattern. + */ + +function extendDashItemContainer(dashItemContainer) { + dashItemContainer.showLabel = AppIcons.ItemShowLabel; +}; + +const iconAnimationSettings = { + _getDictValue: function(key) { + let type = Me.settings.get_string('animate-appicon-hover-animation-type'); + return Me.settings.get_value(key).deep_unpack()[type] || 0; + }, + + get type() { + if (!Me.settings.get_boolean('animate-appicon-hover')) + return ""; + + return Me.settings.get_string('animate-appicon-hover-animation-type'); + }, + + get convexity() { + return Math.max(0, this._getDictValue('animate-appicon-hover-animation-convexity')); + }, + + get duration() { + return this._getDictValue('animate-appicon-hover-animation-duration'); + }, + + get extent() { + return Math.max(1, this._getDictValue('animate-appicon-hover-animation-extent')); + }, + + get rotation() { + return this._getDictValue('animate-appicon-hover-animation-rotation'); + }, + + get travel() { + return Math.max(0, this._getDictValue('animate-appicon-hover-animation-travel')); + }, + + get zoom() { + return Math.max(1, this._getDictValue('animate-appicon-hover-animation-zoom')); + }, +}; + +/* This class is a fork of the upstream DashActor class (ui.dash.js) + * + * Summary of changes: + * - modified chldBox calculations for when 'show-apps-at-top' option is checked + * - handle horizontal dash + */ +var taskbarActor = Utils.defineClass({ + Name: 'DashToPanel-TaskbarActor', + Extends: St.Widget, + + _init: function(delegate) { + this._delegate = delegate; + this._currentBackgroundColor = 0; + this.callParent('_init', { name: 'dashtopanelTaskbar', + layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation[delegate.dtpPanel.getOrientation().toUpperCase()] }), + clip_to_allocation: true }); + }, + + vfunc_allocate: function(box, flags)  { + Utils.setAllocation(this, box, flags); + + let panel = this._delegate.dtpPanel; + let availFixedSize = box[panel.fixedCoord.c2] - box[panel.fixedCoord.c1]; + let availVarSize = box[panel.varCoord.c2] - box[panel.varCoord.c1]; + let [dummy, scrollview, leftFade, rightFade] = this.get_children(); + let [, natSize] = this[panel.sizeFunc](availFixedSize); + let childBox = new Clutter.ActorBox(); + let orientation = panel.getOrientation(); + + Utils.allocate(dummy, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c1]; + childBox[panel.varCoord.c2] = Math.min(availVarSize, natSize); + childBox[panel.fixedCoord.c1] = box[panel.fixedCoord.c1]; + childBox[panel.fixedCoord.c2] = box[panel.fixedCoord.c2]; + + Utils.allocate(scrollview, childBox, flags); + + let [value, , upper, , , pageSize] = scrollview[orientation[0] + 'scroll'].adjustment.get_values(); + upper = Math.floor(upper); + scrollview._dtpFadeSize = upper > pageSize ? this._delegate.iconSize : 0; + + if (this._currentBackgroundColor !== panel.dynamicTransparency.currentBackgroundColor) { + this._currentBackgroundColor = panel.dynamicTransparency.currentBackgroundColor; + let gradientStyle = 'background-gradient-start: ' + this._currentBackgroundColor + + 'background-gradient-direction: ' + orientation; + + leftFade.set_style(gradientStyle); + rightFade.set_style(gradientStyle); + } + + childBox[panel.varCoord.c2] = childBox[panel.varCoord.c1] + (value > 0 ? scrollview._dtpFadeSize : 0); + Utils.allocate(leftFade, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c2] - (value + pageSize < upper ? scrollview._dtpFadeSize : 0); + childBox[panel.varCoord.c2] = box[panel.varCoord.c2]; + Utils.allocate(rightFade, childBox, flags); + }, + + // We want to request the natural size of all our children + // as our natural width, so we chain up to StWidget (which + // then calls BoxLayout) + vfunc_get_preferred_width: function(forHeight) { + let [, natWidth] = St.Widget.prototype.vfunc_get_preferred_width.call(this, forHeight); + + return [0, natWidth]; + }, + + vfunc_get_preferred_height: function(forWidth) { + let [, natHeight] = St.Widget.prototype.vfunc_get_preferred_height.call(this, forWidth); + + return [0, natHeight]; + }, +}); + +/* This class is a fork of the upstream dash class (ui.dash.js) + * + * Summary of changes: + * - disconnect global signals adding a destroy method; + * - play animations even when not in overview mode + * - set a maximum icon size + * - show running and/or favorite applications + * - emit a custom signal when an app icon is added + * - Add scrollview + * Ensure actor is visible on keyfocus inside the scrollview + * - add 128px icon size, might be useful for hidpi display + * - Sync minimization application target position. + */ + +var taskbar = Utils.defineClass({ + Name: 'DashToPanel.Taskbar', + + _init : function(panel) { + this.dtpPanel = panel; + + // start at smallest size due to running indicator drawing area expanding but not shrinking + this.iconSize = 16; + + this._shownInitially = false; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._showLabelTimeoutId = 0; + this._resetHoverTimeoutId = 0; + this._ensureAppIconVisibilityTimeoutId = 0; + this._labelShowing = false; + this.fullScrollView = 0; + + let isVertical = panel.checkIfVertical(); + + this._box = new St.BoxLayout({ vertical: isVertical, + clip_to_allocation: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START }); + + this._container = new taskbarActor(this); + this._scrollView = new St.ScrollView({ name: 'dashtopanelScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: true }); + + this._scrollView.connect('leave-event', Lang.bind(this, this._onLeaveEvent)); + this._scrollView.connect('motion-event', Lang.bind(this, this._onMotionEvent)); + this._scrollView.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); + this._scrollView.add_actor(this._box); + + this._showAppsIconWrapper = panel.showAppsIconWrapper; + this._showAppsIconWrapper.connect('menu-state-changed', Lang.bind(this, function(showAppsIconWrapper, opened) { + this._itemMenuStateChanged(showAppsIconWrapper, opened); + })); + // an instance of the showAppsIcon class is encapsulated in the wrapper + this._showAppsIcon = this._showAppsIconWrapper.realShowAppsIcon; + this.showAppsButton = this._showAppsIcon.toggleButton; + + if (isVertical) { + this.showAppsButton.set_width(panel.geom.w); + } + + this.showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled)); + + this.showAppsButton.checked = (SearchController._showAppsButton) ? SearchController._showAppsButton.checked : false; + + this._showAppsIcon.childScale = 1; + this._showAppsIcon.childOpacity = 255; + this._showAppsIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(this._showAppsIcon, this._showAppsIconWrapper); + + this._container.add_child(new St.Widget({ width: 0, reactive: false })); + this._container.add_actor(this._scrollView); + + let orientation = panel.getOrientation(); + let fadeStyle = 'background-gradient-direction:' + orientation; + let fade1 = new St.Widget({ style_class: 'scrollview-fade', reactive: false }); + let fade2 = new St.Widget({ style_class: 'scrollview-fade', + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: 180 }); + + fade1.set_style(fadeStyle); + fade2.set_style(fadeStyle); + + this._container.add_actor(fade1); + this._container.add_actor(fade2); + + this.previewMenu = new WindowPreview.PreviewMenu(panel); + this.previewMenu.enable(); + + let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; + this.actor = new St.Bin({ child: this._container, + y_align: St.Align.START, x_align:rtl?St.Align.END:St.Align.START + }); + + let adjustment = this._scrollView[orientation[0] + 'scroll'].adjustment; + + this._workId = Main.initializeDeferredWork(this._box, Lang.bind(this, this._redisplay)); + + this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); + + this._appSystem = Shell.AppSystem.get_default(); + + this.iconAnimator = new PanelManager.IconAnimator(this.dtpPanel.panel.actor); + + this._signalsHandler.add( + [ + this.dtpPanel.panel.actor, + 'notify::height', + () => this._queueRedisplay() + ], + [ + this.dtpPanel.panel.actor, + 'notify::width', + () => this._queueRedisplay() + ], + [ + this._appSystem, + 'installed-changed', + Lang.bind(this, function() { + AppFavorites.getAppFavorites().reload(); + this._queueRedisplay(); + }) + ], + [ + this._appSystem, + 'app-state-changed', + Lang.bind(this, this._queueRedisplay) + ], + [ + AppFavorites.getAppFavorites(), + 'changed', + Lang.bind(this, this._queueRedisplay) + ], + [ + global.window_manager, + 'switch-workspace', + () => this._connectWorkspaceSignals() + ], + [ + Utils.DisplayWrapper.getScreen(), + [ + 'window-entered-monitor', + 'window-left-monitor' + ], + () => { + if (Me.settings.get_boolean('isolate-monitors')) { + this._queueRedisplay(); + } + } + ], + [ + Main.overview, + 'item-drag-begin', + Lang.bind(this, this._onDragBegin) + ], + [ + Main.overview, + 'item-drag-end', + Lang.bind(this, this._onDragEnd) + ], + [ + Main.overview, + 'item-drag-cancelled', + Lang.bind(this, this._onDragCancelled) + ], + [ + // Ensure the ShowAppsButton status is kept in sync + SearchController._showAppsButton, + 'notify::checked', + Lang.bind(this, this._syncShowAppsButtonToggled) + ], + [ + Me.settings, + [ + 'changed::dot-size', + 'changed::show-favorites', + 'changed::show-running-apps', + 'changed::show-favorites-all-monitors' + ], + Lang.bind(this, this._redisplay) + ], + [ + Me.settings, + 'changed::group-apps', + Lang.bind(this, function() { + this.isGroupApps = Me.settings.get_boolean('group-apps'); + this._connectWorkspaceSignals(); + }) + ], + [ + Me.settings, + [ + 'changed::group-apps-use-launchers', + 'changed::taskbar-locked' + ], + () => this.resetAppIcons() + ], + [ + adjustment, + [ + 'notify::upper', + 'notify::pageSize' + ], + () => this._onScrollSizeChange(adjustment) + ] + ); + + this.isGroupApps = Me.settings.get_boolean('group-apps'); + + this._onScrollSizeChange(adjustment); + this._connectWorkspaceSignals(); + }, + + destroy: function() { + this.iconAnimator.destroy(); + + this._signalsHandler.destroy(); + this._signalsHandler = 0; + + this._container.destroy(); + + this.previewMenu.disable(); + this.previewMenu.destroy(); + + this._disconnectWorkspaceSignals(); + }, + + _dropIconAnimations: function() { + this._getTaskbarIcons().forEach(item => { + item.raise(0); + item.stretch(0); + }); + }, + + _updateIconAnimations: function(pointerX, pointerY) { + this._iconAnimationTimestamp = Date.now(); + let type = iconAnimationSettings.type; + + if (!pointerX || !pointerY) + [pointerX, pointerY] = global.get_pointer(); + + this._getTaskbarIcons().forEach(item => { + let [x, y] = item.get_transformed_position(); + let [width, height] = item.get_transformed_size(); + let [centerX, centerY] = [x + width / 2, y + height / 2]; + let size = this._box.vertical ? height : width; + let difference = this._box.vertical ? pointerY - centerY : pointerX - centerX; + let distance = Math.abs(difference); + let maxDistance = (iconAnimationSettings.extent / 2) * size; + + if (type == 'PLANK') { + // Make the position stable for items that are far from the pointer. + let translation = distance <= maxDistance ? + distance / (2 + 8 * distance / maxDistance) : + // the previous expression with distance = maxDistance + maxDistance / 10; + + if (difference > 0) + translation *= -1; + + item.stretch(translation); + } + + if (distance <= maxDistance) { + let level = (maxDistance - distance) / maxDistance; + level = Math.pow(level, iconAnimationSettings.convexity); + item.raise(level); + } else { + item.raise(0); + } + }); + }, + + _onLeaveEvent: function(actor) { + let [stageX, stageY] = global.get_pointer(); + let [success, x, y] = actor.transform_stage_point(stageX, stageY); + if (success && !actor.allocation.contains(x, y) && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) + this._dropIconAnimations(); + + return Clutter.EVENT_PROPAGATE; + }, + + _onMotionEvent: function(actor_, event) { + if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { + let timestamp = Date.now(); + if (!this._iconAnimationTimestamp || + (timestamp - this._iconAnimationTimestamp >= iconAnimationSettings.duration / 2)) { + let [pointerX, pointerY] = event.get_coords(); + this._updateIconAnimations(pointerX, pointerY); + } + } + + return Clutter.EVENT_PROPAGATE; + }, + + _onScrollEvent: function(actor, event) { + + let orientation = this.dtpPanel.getOrientation(); + + // reset timeout to avid conflicts with the mousehover event + if (this._ensureAppIconVisibilityTimeoutId>0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + + // Skip to avoid double events mouse + if (event.is_pointer_emulated()) + return Clutter.EVENT_STOP; + + let adjustment, delta; + + adjustment = this._scrollView[orientation[0] + 'scroll'].get_adjustment(); + + let increment = adjustment.step_increment; + + switch ( event.get_scroll_direction() ) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + delta = -increment; + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + delta = +increment; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + delta = dy*increment; + delta += dx*increment; + break; + + } + + adjustment.set_value(adjustment.get_value() + delta); + + return Clutter.EVENT_STOP; + + }, + + _onScrollSizeChange: function(adjustment) { + // Update minimization animation target position on scrollview change. + this._updateAppIcons(); + + // When applications are ungrouped and there is some empty space on the horizontal taskbar, + // force a fixed label width to prevent the icons from "wiggling" when an animation runs + // (adding or removing an icon). When the taskbar is full, revert to a dynamic label width + // to allow them to resize and make room for new icons. + if (!this.dtpPanel.checkIfVertical() && !this.isGroupApps) { + let initial = this.fullScrollView; + + if (!this.fullScrollView && Math.floor(adjustment.upper) > adjustment.page_size) { + this.fullScrollView = adjustment.page_size; + } else if (adjustment.page_size < this.fullScrollView) { + this.fullScrollView = 0; + } + + if (initial != this.fullScrollView) { + this._getAppIcons().forEach(a => a.updateTitleStyle()); + } + } + }, + + _onDragBegin: function() { + this._dragCancelled = false; + this._dragMonitor = { + dragMotion: Lang.bind(this, this._onDragMotion) + }; + DND.addDragMonitor(this._dragMonitor); + + if (this._box.get_n_children() == 0) { + this._emptyDropTarget = new Dash.EmptyDropTargetItem(); + this._box.insert_child_at_index(this._emptyDropTarget, 0); + this._emptyDropTarget.show(true); + } + + this._toggleFavortieHighlight(true); + }, + + _onDragCancelled: function() { + this._dragCancelled = true; + + if (this._dragInfo) { + this._box.set_child_at_index(this._dragInfo[1]._dashItemContainer, this._dragInfo[0]); + } + + this._endDrag(); + }, + + _onDragEnd: function() { + if (this._dragCancelled) + return; + + this._endDrag(); + }, + + _endDrag: function() { + if (this._dragInfo && this._dragInfo[1]._dashItemContainer instanceof DragPlaceholderItem) { + this._box.remove_child(this._dragInfo[1]._dashItemContainer); + this._dragInfo[1]._dashItemContainer.destroy(); + delete this._dragInfo[1]._dashItemContainer; + } + + this._dragInfo = null; + this._clearEmptyDropTarget(); + this._showAppsIcon.setDragApp(null); + DND.removeDragMonitor(this._dragMonitor); + + this._toggleFavortieHighlight(); + }, + + _onDragMotion: function(dragEvent) { + let app = Dash.getAppFromSource(dragEvent.source); + if (app == null) + return DND.DragMotionResult.CONTINUE; + + let showAppsHovered = this._showAppsIcon.contains(dragEvent.targetActor); + + if (showAppsHovered) + this._showAppsIcon.setDragApp(app); + else + this._showAppsIcon.setDragApp(null); + + return DND.DragMotionResult.CONTINUE; + }, + + _toggleFavortieHighlight: function(show) { + let appFavorites = AppFavorites.getAppFavorites(); + let cssFuncName = (show ? 'add' : 'remove') + '_style_class_name'; + + this._getAppIcons().filter(appIcon => appFavorites.isFavorite(appIcon.app.get_id())) + .forEach(fav => fav._container[cssFuncName]('favorite')); + }, + + handleIsolatedWorkspaceSwitch: function() { + this._shownInitially = this.isGroupApps; + this._queueRedisplay(); + }, + + _connectWorkspaceSignals: function() { + this._disconnectWorkspaceSignals(); + + this._lastWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + + this._workspaceWindowAddedId = this._lastWorkspace.connect('window-added', () => this._queueRedisplay()); + this._workspaceWindowRemovedId = this._lastWorkspace.connect('window-removed', () => this._queueRedisplay()); + }, + + _disconnectWorkspaceSignals: function() { + if (this._lastWorkspace) { + this._lastWorkspace.disconnect(this._workspaceWindowAddedId); + this._lastWorkspace.disconnect(this._workspaceWindowRemovedId); + + this._lastWorkspace = null; + } + }, + + _queueRedisplay: function () { + Main.queueDeferredWork(this._workId); + }, + + _hookUpLabel: function(item, syncHandler) { + item.child.connect('notify::hover', Lang.bind(this, function() { + this._syncLabel(item, syncHandler); + })); + + syncHandler.connect('sync-tooltip', Lang.bind(this, function() { + this._syncLabel(item, syncHandler); + })); + }, + + _createAppItem: function(app, window, isLauncher) { + let appIcon = new AppIcons.taskbarAppIcon( + { + app: app, + window: window, + isLauncher: isLauncher + }, + this.dtpPanel, + { + setSizeManually: true, + showLabel: false, + isDraggable: !Me.settings.get_boolean('taskbar-locked'), + }, + this.previewMenu, + this.iconAnimator + ); + + if (appIcon._draggable) { + appIcon._draggable.connect('drag-begin', + Lang.bind(this, function() { + appIcon.actor.opacity = 0; + appIcon.isDragged = 1; + this._dropIconAnimations(); + })); + appIcon._draggable.connect('drag-end', + Lang.bind(this, function() { + appIcon.actor.opacity = 255; + delete appIcon.isDragged; + this._updateAppIcons(); + })); + } + + appIcon.connect('menu-state-changed', + Lang.bind(this, function(appIcon, opened) { + this._itemMenuStateChanged(item, opened); + })); + + let item = new TaskbarItemContainer(); + + item._dtpPanel = this.dtpPanel + extendDashItemContainer(item); + + item.setChild(appIcon.actor); + appIcon._dashItemContainer = item; + + appIcon.actor.connect('notify::hover', Lang.bind(this, function() { + if (appIcon.actor.hover){ + this._ensureAppIconVisibilityTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, function(){ + Utils.ensureActorVisibleInScrollView(this._scrollView, appIcon.actor, this._scrollView._dtpFadeSize); + this._ensureAppIconVisibilityTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + + if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') + appIcon.actor.get_parent().raise(1); + else if (!appIcon.isDragged && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) + this._updateIconAnimations(); + } else { + if (this._ensureAppIconVisibilityTimeoutId>0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + + if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') + appIcon.actor.get_parent().raise(0); + } + })); + + appIcon.actor.connect('clicked', + Lang.bind(this, function(actor) { + Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); + })); + + appIcon.actor.connect('key-focus-in', Lang.bind(this, function(actor) { + let [x_shift, y_shift] = Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); + + // This signal is triggered also by mouse click. The popup menu is opened at the original + // coordinates. Thus correct for the shift which is going to be applied to the scrollview. + if (appIcon._menu) { + appIcon._menu._boxPointer.xOffset = -x_shift; + appIcon._menu._boxPointer.yOffset = -y_shift; + } + })); + + // Override default AppIcon label_actor, now the + // accessible_name is set at DashItemContainer.setLabelText + appIcon.actor.label_actor = null; + item.setLabelText(app.get_name()); + + appIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(item, appIcon); + + return item; + }, + + // Return an array with the "proper" appIcons currently in the taskbar + _getAppIcons: function() { + // Only consider children which are "proper" icons and which are not + // animating out (which means they will be destroyed at the end of + // the animation) + return this._getTaskbarIcons().map(function(actor){ + return actor.child._delegate; + }); + }, + + _getTaskbarIcons: function(includeAnimated) { + return this._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.icon && + (includeAnimated || !actor.animatingOut); + }); + }, + + _updateAppIcons: function() { + let appIcons = this._getAppIcons(); + + appIcons.filter(icon => icon.constructor === AppIcons.taskbarAppIcon).forEach(icon => { + icon.updateIcon(); + }); + }, + + _itemMenuStateChanged: function(item, opened) { + // When the menu closes, it calls sync_hover, which means + // that the notify::hover handler does everything we need to. + if (opened) { + if (this._showLabelTimeoutId > 0) { + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + } + + item.hideLabel(); + } else { + // I want to listen from outside when a menu is closed. I used to + // add a custom signal to the appIcon, since gnome 3.8 the signal + // calling this callback was added upstream. + this.emit('menu-closed'); + + // The icon menu grabs the events and, once it is closed, the pointer is maybe + // no longer over the taskbar and the animations are not dropped. + if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { + this._scrollView.sync_hover(); + if (!this._scrollView.hover) + this._dropIconAnimations(); + } + } + }, + + _syncLabel: function (item, syncHandler) { + let shouldShow = syncHandler ? syncHandler.shouldShowTooltip() : item.child.get_hover(); + + if (shouldShow) { + if (this._showLabelTimeoutId == 0) { + let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; + this._showLabelTimeoutId = Mainloop.timeout_add(timeout, + Lang.bind(this, function() { + this._labelShowing = true; + item.showLabel(); + this._showLabelTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel'); + if (this._resetHoverTimeoutId > 0) { + Mainloop.source_remove(this._resetHoverTimeoutId); + this._resetHoverTimeoutId = 0; + } + } + } else { + if (this._showLabelTimeoutId > 0) + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + item.hideLabel(); + if (this._labelShowing) { + this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT, + Lang.bind(this, function() { + this._labelShowing = false; + this._resetHoverTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing'); + } + } + }, + + _adjustIconSize: function() { + const thisMonitorIndex = this.dtpPanel.monitor.index; + let panelSize = PanelSettings.getPanelSize(Me.settings, thisMonitorIndex); + let availSize = panelSize - Me.settings.get_int('appicon-padding') * 2; + let minIconSize = MIN_ICON_SIZE + panelSize % 2; + + if (availSize == this.iconSize) + return; + + if (availSize < minIconSize) { + availSize = minIconSize; + } + + // For the icon size, we only consider children which are "proper" + // icons and which are not animating out (which means they will be + // destroyed at the end of the animation) + let iconChildren = this._getTaskbarIcons().concat([this._showAppsIcon]); + let scale = this.iconSize / availSize; + + this.iconSize = availSize; + + for (let i = 0; i < iconChildren.length; i++) { + let icon = iconChildren[i].child._delegate.icon; + + // Set the new size immediately, to keep the icons' sizes + // in sync with this.iconSize + icon.setIconSize(this.iconSize); + + // Don't animate the icon size change when the overview + // is transitioning, or when initially filling + // the taskbar + if (Main.overview.animationInProgress || + !this._shownInitially) + continue; + + let [targetWidth, targetHeight] = icon.icon.get_size(); + + // Scale the icon's texture to the previous size and + // tween to the new size + icon.icon.set_size(icon.icon.width * scale, icon.icon.height * scale); + + Utils.animate(icon.icon, + { width: targetWidth, + height: targetHeight, + time: DASH_ANIMATION_TIME, + transition: 'easeOutQuad', + }); + } + }, + + sortAppsCompareFunction: function(appA, appB) { + return getAppStableSequence(appA, this.dtpPanel.monitor) - + getAppStableSequence(appB, this.dtpPanel.monitor); + }, + + getAppInfos: function() { + //get the user's favorite apps + let favoriteApps = this._checkIfShowingFavorites() ? AppFavorites.getAppFavorites().getFavorites() : []; + + //find the apps that should be in the taskbar: the favorites first, then add the running apps + // When using isolation, we filter out apps that have no windows in + // the current workspace (this check is done in AppIcons.getInterestingWindows) + let runningApps = this._checkIfShowingRunningApps() ? this._getRunningApps().sort(this.sortAppsCompareFunction.bind(this)) : []; + + if (!this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers')) { + return this._createAppInfos(favoriteApps, [], true) + .concat(this._createAppInfos(runningApps) + .filter(appInfo => appInfo.windows.length)); + } else { + return this._createAppInfos(favoriteApps.concat(runningApps.filter(app => favoriteApps.indexOf(app) < 0))) + .filter(appInfo => appInfo.windows.length || favoriteApps.indexOf(appInfo.app) >= 0); + } + }, + + _redisplay: function () { + if (!this._signalsHandler) { + return; + } + + //get the currently displayed appIcons + let currentAppIcons = this._getTaskbarIcons(); + let expectedAppInfos = this.getAppInfos(); + + //remove the appIcons which are not in the expected apps list + for (let i = currentAppIcons.length - 1; i > -1; --i) { + let appIcon = currentAppIcons[i].child._delegate; + let appIndex = Utils.findIndex(expectedAppInfos, appInfo => appInfo.app == appIcon.app && + appInfo.isLauncher == appIcon.isLauncher); + + if (appIndex < 0 || + (appIcon.window && (this.isGroupApps || expectedAppInfos[appIndex].windows.indexOf(appIcon.window) < 0)) || + (!appIcon.window && !appIcon.isLauncher && + !this.isGroupApps && expectedAppInfos[appIndex].windows.length)) { + currentAppIcons[i][this._shownInitially ? 'animateOutAndDestroy' : 'destroy'](); + currentAppIcons.splice(i, 1); + } + } + + //if needed, reorder the existing appIcons and create the missing ones + let currentPosition = 0; + for (let i = 0, l = expectedAppInfos.length; i < l; ++i) { + let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? + [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : + expectedAppInfos[i].windows.map(window => ({ app: expectedAppInfos[i].app, window: window, isLauncher: false })); + + for (let j = 0, ll = neededAppIcons.length; j < ll; ++j) { + //check if the icon already exists + let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && + appIcon.child._delegate.window == neededAppIcons[j].window); + + if (matchingAppIconIndex > 0 && matchingAppIconIndex != currentPosition) { + //moved icon, reposition it + this._box.remove_child(currentAppIcons[matchingAppIconIndex]); + this._box.insert_child_at_index(currentAppIcons[matchingAppIconIndex], currentPosition); + } else if (matchingAppIconIndex < 0) { + //the icon doesn't exist yet, create a new one + let newAppIcon = this._createAppItem(neededAppIcons[j].app, neededAppIcons[j].window, neededAppIcons[j].isLauncher); + + this._box.insert_child_at_index(newAppIcon, currentPosition); + currentAppIcons.splice(currentPosition, 0, newAppIcon); + + // Skip animations on first run when adding the initial set + // of items, to avoid all items zooming in at once + newAppIcon.show(this._shownInitially); + } + + ++currentPosition; + } + } + + this._adjustIconSize(); + + // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 + // Without it, StBoxLayout may use a stale size cache + this._box.queue_relayout(); + + // This is required for icon reordering when the scrollview is used. + this._updateAppIcons(); + + // This will update the size, and the corresponding number for each icon on the primary panel + if (this.dtpPanel.isPrimary) { + this._updateNumberOverlay(); + } + + this._shownInitially = true; + }, + + _checkIfShowingRunningApps: function() { + return Me.settings.get_boolean('show-running-apps'); + }, + + _checkIfShowingFavorites: function() { + return Me.settings.get_boolean('show-favorites') && + (this.dtpPanel.isPrimary || Me.settings.get_boolean('show-favorites-all-monitors')); + }, + + _getRunningApps: function() { + let tracker = Shell.WindowTracker.get_default(); + let windows = global.get_window_actors(); + let apps = []; + + for (let i = 0, l = windows.length; i < l; ++i) { + let app = tracker.get_window_app(windows[i].metaWindow); + + if (app && apps.indexOf(app) < 0) { + apps.push(app); + } + } + + return apps; + }, + + _createAppInfos: function(apps, defaultWindows, defaultIsLauncher) { + return apps.map(app => ({ + app: app, + isLauncher: defaultIsLauncher || false, + windows: defaultWindows || AppIcons.getInterestingWindows(app, this.dtpPanel.monitor) + .sort(sortWindowsCompareFunction) + })); + }, + + // Reset the displayed apps icon to mantain the correct order + resetAppIcons : function(geometryChange) { + let children = this._getTaskbarIcons(true); + + for (let i = 0; i < children.length; i++) { + let item = children[i]; + item.destroy(); + } + + // to avoid ugly animations, just suppress them like when taskbar is first loaded. + this._shownInitially = false; + this._redisplay(); + + if (geometryChange && this.dtpPanel.checkIfVertical()) { + this.previewMenu._updateClip(); + } + }, + + _updateNumberOverlay: function() { + let seenApps = {}; + let counter = 0; + + this._getAppIcons().forEach(function(icon) { + if (!seenApps[icon.app]) { + seenApps[icon.app] = 1; + counter++; + } + + if (counter <= 10) { + icon.setNumberOverlay(counter == 10 ? 0 : counter); + } else { + // No overlay after 10 + icon.setNumberOverlay(-1); + } + + icon.updateHotkeyNumberOverlay(); + }); + + if (Me.settings.get_boolean('hot-keys') && + Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.toggleNumberOverlay(true); + }, + + toggleNumberOverlay: function(activate) { + let appIcons = this._getAppIcons(); + appIcons.forEach(function(icon) { + icon.toggleNumberOverlay(activate); + }); + }, + + _clearEmptyDropTarget: function() { + if (this._emptyDropTarget) { + this._emptyDropTarget.animateOutAndDestroy(); + this._emptyDropTarget = null; + } + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) + return DND.DragMotionResult.CONTINUE; + + // Don't allow favoriting of transient apps + if (source.app == null || source.app.is_window_backed()) + return DND.DragMotionResult.NO_DROP; + + if (!this._settings.is_writable('favorite-apps')) + return DND.DragMotionResult.NO_DROP; + + let sourceActor = source instanceof St.Widget ? source : source.actor; + let isVertical = this.dtpPanel.checkIfVertical(); + + if (!this._box.contains(sourceActor) && !source._dashItemContainer) { + //not an appIcon of the taskbar, probably from the applications view + source._dashItemContainer = new DragPlaceholderItem(source, this.iconSize, isVertical); + this._box.insert_child_above(source._dashItemContainer, null); + } + + let sizeProp = isVertical ? 'height' : 'width'; + let posProp = isVertical ? 'y' : 'x'; + let pos = isVertical ? y : x; + + let currentAppIcons = this._getAppIcons(); + let sourceIndex = currentAppIcons.indexOf(source); + let hoveredIndex = Utils.findIndex(currentAppIcons, + appIcon => pos >= appIcon._dashItemContainer[posProp] && + pos <= (appIcon._dashItemContainer[posProp] + appIcon._dashItemContainer[sizeProp])); + + if (!this._dragInfo) { + this._dragInfo = [sourceIndex, source]; + } + + if (hoveredIndex >= 0) { + let isLeft = pos < currentAppIcons[hoveredIndex]._dashItemContainer[posProp] + currentAppIcons[hoveredIndex]._dashItemContainer[sizeProp] * .5; + + // Don't allow positioning before or after self and between icons of same app + if (!(hoveredIndex === sourceIndex || + (isLeft && hoveredIndex - 1 == sourceIndex) || + (isLeft && hoveredIndex - 1 >= 0 && source.app != currentAppIcons[hoveredIndex - 1].app && + currentAppIcons[hoveredIndex - 1].app == currentAppIcons[hoveredIndex].app) || + (!isLeft && hoveredIndex + 1 == sourceIndex) || + (!isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != currentAppIcons[hoveredIndex + 1].app && + currentAppIcons[hoveredIndex + 1].app == currentAppIcons[hoveredIndex].app))) { + this._box.set_child_at_index(source._dashItemContainer, hoveredIndex); + + // Ensure the next and previous icon are visible when moving the icon + // (I assume there's room for both of them) + if (hoveredIndex > 1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex-1], this._scrollView._dtpFadeSize); + if (hoveredIndex < this._box.get_children().length-1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex+1], this._scrollView._dtpFadeSize); + } + } + + return this._dragInfo[0] !== sourceIndex ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.CONTINUE; + }, + + // Draggable target interface + acceptDrop : function(source, actor, x, y, time) { + // Don't allow favoriting of transient apps + if (!source.app || source.app.is_window_backed() || !this._settings.is_writable('favorite-apps')) { + return false; + } + + let appIcons = this._getAppIcons(); + let sourceIndex = appIcons.indexOf(source); + let usingLaunchers = !this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers'); + + // dragging the icon to its original position + if (this._dragInfo[0] === sourceIndex) { + return true; + } + + let appFavorites = AppFavorites.getAppFavorites(); + let sourceAppId = source.app.get_id(); + let appIsFavorite = appFavorites.isFavorite(sourceAppId); + let replacingIndex = sourceIndex + (sourceIndex > this._dragInfo[0] ? -1 : 1); + let favoriteIndex = replacingIndex >= 0 ? appFavorites.getFavorites().indexOf(appIcons[replacingIndex].app) : 0; + let sameApps = appIcons.filter(a => a != source && a.app == source.app); + let showingFavorites = this._checkIfShowingFavorites(); + let favoritesCount = 0; + let position = 0; + let interestingWindows = {}; + let getAppWindows = app => { + if (!interestingWindows[app]) { + interestingWindows[app] = AppIcons.getInterestingWindows(app, this.dtpPanel.monitor); + } + + let appWindows = interestingWindows[app]; //prevents "reference to undefined property Symbol.toPrimitive" warning + return appWindows; + }; + + if (sameApps.length && + ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && + (!appIcons[sourceIndex + 1] || appIcons[sourceIndex + 1].app !== source.app))) { + appIcons.splice(appIcons.indexOf(sameApps[0]), sameApps.length); + Array.prototype.splice.apply(appIcons, [sourceIndex + 1, 0].concat(sameApps)); + } + + for (let i = 0, l = appIcons.length; i < l; ++i) { + let windows = []; + + if (!usingLaunchers || (!source.isLauncher && !appIcons[i].isLauncher)) { + windows = appIcons[i].window ? [appIcons[i].window] : getAppWindows(appIcons[i].app); + } + + windows.forEach(w => w._dtpPosition = position++); + + if (showingFavorites && + ((usingLaunchers && appIcons[i].isLauncher) || + (!usingLaunchers && appFavorites.isFavorite(appIcons[i].app.get_id())))) { + ++favoritesCount; + } + } + + if (sourceIndex < favoritesCount) { + if (appIsFavorite) { + appFavorites.moveFavoriteToPos(sourceAppId, favoriteIndex); + } else { + appFavorites.addFavoriteAtPos(sourceAppId, favoriteIndex); + } + } else if (appIsFavorite && showingFavorites && (!usingLaunchers || source.isLauncher)) { + appFavorites.removeFavorite(sourceAppId); + } + + appFavorites.emit('changed'); + + return true; + }, + + _onShowAppsButtonToggled: function() { + // Sync the status of the default appButtons. Only if the two statuses are + // different, that means the user interacted with the extension provided + // application button, cutomize the behaviour. Otherwise the shell has changed the + // status (due to the _syncShowAppsButtonToggled function below) and it + // has already performed the desired action. + let selector = SearchController; + + if (selector._showAppsButton && + selector._showAppsButton.checked !== this.showAppsButton.checked) { + // find visible view + + if (this.showAppsButton.checked) { + if (Me.settings.get_boolean('show-apps-override-escape')) { + //override escape key to return to the desktop when entering the overview using the showapps button + SearchController._onStageKeyPress = function(actor, event) { + if (Main.modalCount == 1 && event.get_key_symbol() === Clutter.KEY_Escape) { + this._searchActive ? this.reset() : Main.overview.hide(); + + return Clutter.EVENT_STOP; + } + + return this.__proto__._onStageKeyPress.call(this, actor, event); + }; + } + + // force spring animation triggering.By default the animation only + // runs if we are already inside the overview. + if (!Main.overview._shown) { + this.forcedOverview = true; + let grid = AppDisplay._grid; + let onShownCb; + let overviewSignal = Config.PACKAGE_VERSION > '3.38.1' ? 'showing' : 'shown'; + let overviewShowingId = Main.overview.connect(overviewSignal, () => { + Main.overview.disconnect(overviewShowingId); + onShownCb(); + }); + + onShownCb = () => grid.emit('animation-done'); + } + + //temporarily use as primary the monitor on which the showapps btn was clicked, this is + //restored by the panel when exiting the overview + this.dtpPanel.panelManager.setFocusedMonitor(this.dtpPanel.monitor); + + let overviewHiddenId = Main.overview.connect('hidden', () => { + Main.overview.disconnect(overviewHiddenId); + delete SearchController._onStageKeyPress; + }); + + // Finally show the overview + selector._showAppsButton.checked = true; + Main.overview.show(2 /*APP_GRID*/); + } + else { + if (this.forcedOverview) { + // force exiting overview if needed + + Main.overview.hide(); + this.forcedOverview = false; + } + else { + selector._showAppsButton.checked = false; + this.forcedOverview = false; + } + } + } + }, + + _syncShowAppsButtonToggled: function() { + let status = SearchController._showAppsButton.checked; + if (this.showAppsButton.checked !== status) + this.showAppsButton.checked = status; + }, + + showShowAppsButton: function() { + this.showAppsButton.visible = true; + this.showAppsButton.set_width(-1); + this.showAppsButton.set_height(-1); + }, + + popupFocusedAppSecondaryMenu: function() { + let appIcons = this._getAppIcons(); + let tracker = Shell.WindowTracker.get_default(); + + for(let i in appIcons) { + if(appIcons[i].app == tracker.focus_app) { + let appIcon = appIcons[i]; + if(appIcon._menu && appIcon._menu.isOpen) + appIcon._menu.close(); + else + appIcon.popupMenu(); + + appIcon.sync_hover(); + break; + } + } + }, +}); + +Signals.addSignalMethods(taskbar.prototype); + +const CloneContainerConstraint = Utils.defineClass({ + Name: 'DashToPanel-CloneContainerConstraint', + Extends: Clutter.BindConstraint, + + vfunc_update_allocation: function(actor, actorBox) { + if (!this.source) + return; + + let [stageX, stageY] = this.source.get_transformed_position(); + let [width, height] = this.source.get_transformed_size(); + + actorBox.set_origin(stageX, stageY); + actorBox.set_size(width, height); + }, +}); + +var TaskbarItemContainer = Utils.defineClass({ + Name: 'DashToPanel-TaskbarItemContainer', + Extends: Dash.DashItemContainer, + + vfunc_allocate: function(box, flags) { + if (this.child == null) + return; + + Utils.setAllocation(this, box, flags); + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let [minChildWidth, minChildHeight, natChildWidth, natChildHeight] = this.child.get_preferred_size(); + let [childScaleX, childScaleY] = this.child.get_scale(); + + let childWidth = Math.min(natChildWidth * childScaleX, availWidth); + let childHeight = Math.min(natChildHeight * childScaleY, availHeight); + let childBox = new Clutter.ActorBox(); + + childBox.x1 = (availWidth - childWidth) / 2; + childBox.y1 = (availHeight - childHeight) / 2; + childBox.x2 = childBox.x1 + childWidth; + childBox.y2 = childBox.y1 + childHeight; + + Utils.allocate(this.child, childBox, flags); + }, + + // In case appIcon is removed from the taskbar while it is hovered, + // restore opacity before dashItemContainer.animateOutAndDestroy does the destroy animation. + animateOutAndDestroy: function() { + if (this._raisedClone) { + this._raisedClone.source.opacity = 255; + this._raisedClone.destroy(); + } + + this.callParent('animateOutAndDestroy'); + }, + + // For ItemShowLabel + _getIconAnimationOffset: function() { + if (!Me.settings.get_boolean('animate-appicon-hover')) + return 0; + + let travel = iconAnimationSettings.travel; + let zoom = iconAnimationSettings.zoom; + return this._dtpPanel.dtpSize * (travel + (zoom - 1) / 2); + }, + + _updateCloneContainerPosition: function(cloneContainer) { + let [stageX, stageY] = this.get_transformed_position(); + + if (Config.PACKAGE_VERSION >= '3.36') + cloneContainer.set_position(stageX - this.translation_x, stageY - this.translation_y); + else + cloneContainer.set_position(stageX, stageY); + }, + + _createRaisedClone: function() { + let [width, height] = this.get_transformed_size(); + + // "clone" of this child (appIcon actor) + let cloneButton = this.child._delegate.getCloneButton(); + + // "clone" of this (taskbarItemContainer) + let cloneContainer = new St.Bin({ + child: cloneButton, + width: width, height: height, + reactive: false, + }); + + this._updateCloneContainerPosition(cloneContainer); + + // For the stretch animation + if (Config.PACKAGE_VERSION >= '3.36') { + let boundProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; + this.bind_property(boundProperty, cloneContainer, boundProperty, GObject.BindingFlags.SYNC_CREATE); + } else { + let constraint = new CloneContainerConstraint({ source: this }); + cloneContainer.add_constraint(constraint); + } + + // The clone follows its source when the taskbar is scrolled. + let taskbarScrollView = this.get_parent().get_parent(); + let adjustment = this._dtpPanel.checkIfVertical() ? taskbarScrollView.vscroll.get_adjustment() : taskbarScrollView.hscroll.get_adjustment(); + let adjustmentChangedId = adjustment.connect('notify::value', () => this._updateCloneContainerPosition(cloneContainer)); + + // Update clone position when an item is added to / removed from the taskbar. + let taskbarBox = this.get_parent(); + let taskbarBoxAllocationChangedId = taskbarBox.connect('notify::allocation', () => this._updateCloneContainerPosition(cloneContainer)); + + // The clone itself + this._raisedClone = cloneButton.child; + this._raisedClone.connect('destroy', () => { + adjustment.disconnect(adjustmentChangedId); + taskbarBox.disconnect(taskbarBoxAllocationChangedId); + Mainloop.idle_add(() => cloneContainer.destroy()); + delete this._raisedClone; + }); + + this._raisedClone.source.opacity = 0; + Main.uiGroup.add_actor(cloneContainer); + }, + + // Animate the clone. + // AppIcon actors cannot go outside the taskbar so the animation is done with a clone. + // If level is zero, the clone is dropped and destroyed. + raise: function(level) { + if (this._raisedClone) + Utils.stopAnimations(this._raisedClone); + else if (level) + this._createRaisedClone(); + else + return; + + let panelPosition = this._dtpPanel.getPosition(); + let panelElementPositions = this._dtpPanel.panelManager.panelsElementPositions[this._dtpPanel.monitor.index] || Pos.defaults; + let taskbarPosition = panelElementPositions.filter(pos => pos.element == 'taskbar')[0].position; + + let vertical = panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT; + let translationDirection = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT ? 1 : -1; + let rotationDirection; + if (panelPosition == St.Side.LEFT || taskbarPosition == Pos.STACKED_TL) + rotationDirection = -1; + else if (panelPosition == St.Side.RIGHT || taskbarPosition == Pos.STACKED_BR) + rotationDirection = 1; + else { + let items = this.get_parent().get_children(); + let index = items.indexOf(this); + rotationDirection = (index - (items.length - 1) / 2) / ((items.length - 1) / 2); + } + + let duration = iconAnimationSettings.duration / 1000; + let rotation = iconAnimationSettings.rotation; + let travel = iconAnimationSettings.travel; + let zoom = iconAnimationSettings.zoom; + + // level is about 1 for the icon that is hovered, less for others. + // time depends on the translation to do. + let [width, height] = this._raisedClone.source.get_transformed_size(); + let translationMax = (vertical ? width : height) * (travel + (zoom - 1) / 2); + let translationEnd = translationMax * level; + let translationDone = vertical ? this._raisedClone.translation_x : this._raisedClone.translation_y; + let translationTodo = Math.abs(translationEnd - translationDone); + let scale = 1 + (zoom - 1) * level; + let rotationAngleZ = rotationDirection * rotation * level; + let time = duration * translationTodo / translationMax; + + let options = { + scale_x: scale, scale_y: scale, + rotation_angle_z: rotationAngleZ, + time: time, + transition: 'easeOutQuad', + onComplete: () => { + if (!level) { + this._raisedClone.source.opacity = 255; + this._raisedClone.destroy(); + delete this._raisedClone; + } + }, + }; + options[vertical ? 'translation_x' : 'translation_y'] = translationDirection * translationEnd; + + Utils.animate(this._raisedClone, options); + }, + + // Animate this and cloneContainer, since cloneContainer translation is bound to this. + stretch: function(translation) { + let duration = iconAnimationSettings.duration / 1000; + let zoom = iconAnimationSettings.zoom; + let animatedProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; + let isShowing = this.opacity != 255 || this.child.opacity != 255; + + if (isShowing) { + // Do no stop the animation initiated in DashItemContainer.show. + this[animatedProperty] = zoom * translation; + } else { + let options = { + time: duration, + transition: 'easeOutQuad', + }; + options[animatedProperty] = zoom * translation; + + Utils.stopAnimations(this); + Utils.animate(this, options); + } + }, +}); + +var DragPlaceholderItem = Utils.defineClass({ + Name: 'DashToPanel-DragPlaceholderItem', + Extends: St.Widget, + + _init: function(appIcon, iconSize, isVertical) { + this.callParent('_init', { style: AppIcons.getIconContainerStyle(isVertical), layout_manager: new Clutter.BinLayout() }); + + this.child = { _delegate: appIcon }; + + this._clone = new Clutter.Clone({ + source: appIcon.icon._iconBin, + width: iconSize, + height: iconSize + }); + + this.add_actor(this._clone); + }, + + destroy: function() { + this._clone.destroy(); + this.callParent('destroy'); + }, +}); + +function getAppStableSequence(app, monitor) { + let windows = AppIcons.getInterestingWindows(app, monitor); + + return windows.reduce((prevWindow, window) => { + return Math.min(prevWindow, getWindowStableSequence(window)); + }, Infinity); +} + +function sortWindowsCompareFunction(windowA, windowB) { + return getWindowStableSequence(windowA) - getWindowStableSequence(windowB); +} + +function getWindowStableSequence(window) { + return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js new file mode 100644 index 0000000..aa86d7a --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js @@ -0,0 +1,269 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Clutter = imports.gi.Clutter; +const GdkPixbuf = imports.gi.GdkPixbuf; +const Lang = imports.lang; +const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const St = imports.gi.St; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +var DynamicTransparency = Utils.defineClass({ + Name: 'DashToPanel.DynamicTransparency', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this._proximityManager = dtpPanel.panelManager.proximityManager; + this._proximityWatchId = 0; + this._windowOverlap = false; + this.currentBackgroundColor = 0; + + this._initialPanelStyle = dtpPanel.panel.actor.get_style(); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._initialPanelCornerStyle = dtpPanel.panel._leftCorner.actor.get_style(); + } + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._bindSignals(); + + this._updateAnimationDuration(); + this._updateAllAndSet(); + this._updateProximityWatch(); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._proximityManager.removeWatch(this._proximityWatchId); + + this._dtpPanel.panel.actor.set_style(this._initialPanelStyle); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(this._initialPanelCornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(this._initialPanelCornerStyle); + } + }, + + updateExternalStyle: function() { + this._updateComplementaryStyles(); + this._setBackground(); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + Utils.getStageTheme(), + 'changed', + () => this._updateAllAndSet() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._updateAlphaAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-bg', + 'changed::trans-bg-color' + ], + () => this._updateColorAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-opacity', + 'changed::trans-panel-opacity', + 'changed::trans-bg-color', + 'changed::trans-dynamic-anim-target', + 'changed::trans-use-dynamic-opacity' + ], + () => this._updateAlphaAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-gradient', + 'changed::trans-gradient-top-color', + 'changed::trans-gradient-bottom-color', + 'changed::trans-gradient-top-opacity', + 'changed::trans-gradient-bottom-opacity' + ], + () => this._updateGradientAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-dynamic-behavior', + 'changed::trans-use-dynamic-opacity', + 'changed::trans-dynamic-distance' + ], + () => this._updateProximityWatch() + ], + [ + Me.settings, + 'changed::trans-dynamic-anim-time', + () => this._updateAnimationDuration() + ] + ); + }, + + _updateProximityWatch: function() { + this._proximityManager.removeWatch(this._proximityWatchId); + + if (Me.settings.get_boolean('trans-use-dynamic-opacity')) { + let isVertical = this._dtpPanel.checkIfVertical(); + let threshold = Me.settings.get_int('trans-dynamic-distance'); + + this._proximityWatchId = this._proximityManager.createWatch( + this._dtpPanel.panelBox.get_parent(), + Proximity.Mode[Me.settings.get_string('trans-dynamic-behavior')], + isVertical ? threshold : 0, + isVertical ? 0 : threshold, + overlap => { + this._windowOverlap = overlap; + this._updateAlphaAndSet(); + } + ); + } + }, + + _updateAnimationDuration: function() { + this.animationDuration = (Me.settings.get_int('trans-dynamic-anim-time') * 0.001) + 's;'; + }, + + _updateAllAndSet: function() { + let themeBackground = this._getThemeBackground(true); + + this._updateColor(themeBackground); + this._updateAlpha(themeBackground); + this._updateComplementaryStyles(); + this._updateGradient(); + this._setBackground(); + this._setGradient(); + }, + + _updateColorAndSet: function() { + this._updateColor(); + this._setBackground(); + }, + + _updateAlphaAndSet: function() { + this._updateAlpha(); + this._setBackground(); + }, + + _updateGradientAndSet: function() { + this._updateGradient(); + this._setGradient(); + }, + + _updateComplementaryStyles: function() { + let panelThemeNode = this._dtpPanel.panel.actor.get_theme_node(); + + this._complementaryStyles = 'border-radius: ' + panelThemeNode.get_border_radius(0) + 'px;'; + }, + + _updateColor: function(themeBackground) { + this.backgroundColorRgb = Me.settings.get_boolean('trans-use-custom-bg') ? + Me.settings.get_string('trans-bg-color') : + (themeBackground || this._getThemeBackground()); + }, + + _updateAlpha: function(themeBackground) { + if (this._windowOverlap && !Main.overview.visibleTarget && Me.settings.get_boolean('trans-use-dynamic-opacity')) { + this.alpha = Me.settings.get_double('trans-dynamic-anim-target'); + } else { + this.alpha = Me.settings.get_boolean('trans-use-custom-opacity') ? + Me.settings.get_double('trans-panel-opacity') : + (themeBackground || this._getThemeBackground()).alpha * 0.003921569; // 1 / 255 = 0.003921569 + } + }, + + _updateGradient: function() { + this._gradientStyle = ''; + + if (Me.settings.get_boolean('trans-use-custom-gradient')) { + this._gradientStyle += 'background-gradient-direction: ' + (this._dtpPanel.checkIfVertical() ? 'horizontal;' : 'vertical;') + + 'background-gradient-start: ' + Utils.getrgbaColor(Me.settings.get_string('trans-gradient-top-color'), + Me.settings.get_double('trans-gradient-top-opacity')) + + 'background-gradient-end: ' + Utils.getrgbaColor(Me.settings.get_string('trans-gradient-bottom-color'), + Me.settings.get_double('trans-gradient-bottom-opacity')); + } + }, + + _setBackground: function() { + this.currentBackgroundColor = Utils.getrgbaColor(this.backgroundColorRgb, this.alpha); + + let transition = 'transition-duration:' + this.animationDuration; + let cornerStyle = '-panel-corner-background-color: ' + this.currentBackgroundColor + transition; + + this._dtpPanel.set_style('background-color: ' + this.currentBackgroundColor + transition + this._complementaryStyles); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(cornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(cornerStyle); + } + }, + + _setGradient: function() { + this._dtpPanel.panel.actor.set_style( + 'background: none; ' + + 'border-image: none; ' + + 'background-image: none; ' + + this._gradientStyle + + 'transition-duration:' + this.animationDuration + ); + }, + + _getThemeBackground: function(reload) { + if (reload || !this._themeBackground) { + let fakePanel = new St.Bin({ name: 'panel' }); + Main.uiGroup.add_child(fakePanel); + let fakeTheme = fakePanel.get_theme_node() + this._themeBackground = this._getBackgroundImageColor(fakeTheme) || fakeTheme.get_background_color(); + Main.uiGroup.remove_child(fakePanel); + } + + return this._themeBackground; + }, + + _getBackgroundImageColor: function(theme) { + let bg = null; + + try { + let imageFile = theme.get_background_image() || theme.get_border_image().get_file(); + + if (imageFile) { + let imageBuf = GdkPixbuf.Pixbuf.new_from_file(imageFile.get_path()); + let pixels = imageBuf.get_pixels(); + + bg = { red: pixels[0], green: pixels[1], blue: pixels[2], alpha: pixels[3] }; + } + } catch (error) {} + + return bg; + } +}); \ No newline at end of file diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js new file mode 100644 index 0000000..d90d2cc --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js @@ -0,0 +1,1040 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const GdkPixbuf = imports.gi.GdkPixbuf; +const Gi = imports._gi; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const Util = imports.misc.util; + +var TRANSLATION_DOMAIN = imports.misc.extensionUtils.getCurrentExtension().metadata['gettext-domain']; +var SCROLL_TIME = Util.SCROLL_TIME / (Util.SCROLL_TIME > 1 ? 1000 : 1); + +//Clutter implicit animations are available since 3.34 +//prefer those over Tweener if available +if (Config.PACKAGE_VERSION < '3.34') { + var Tweener = imports.ui.tweener; +} + +var defineClass = function (classDef) { + let parentProto = classDef.Extends ? classDef.Extends.prototype : null; + + if (Config.PACKAGE_VERSION < '3.31.9') { + if (parentProto && (classDef.Extends.name || classDef.Extends.toString()).indexOf('DashToPanel.') < 0) { + classDef.callParent = function() { + let args = Array.prototype.slice.call(arguments); + let func = args.shift(); + + classDef.Extends.prototype[func].apply(this, args); + }; + } + + return new imports.lang.Class(classDef); + } + + let isGObject = parentProto instanceof GObject.Object; + let needsSuper = parentProto && !isGObject; + let getParentArgs = function(args) { + let parentArgs = []; + + (classDef.ParentConstrParams || parentArgs).forEach(p => { + if (p.constructor === Array) { + let param = args[p[0]]; + + parentArgs.push(p[1] ? param[p[1]] : param); + } else { + parentArgs.push(p); + } + }); + + return parentArgs; + }; + + let C = eval( + '(class C ' + (needsSuper ? 'extends Object' : '') + ' { ' + + ' constructor(...args) { ' + + (needsSuper ? 'super(...getParentArgs(args));' : '') + + (needsSuper || !parentProto ? 'this._init(...args);' : '') + + ' }' + + ' callParent(...args) { ' + + ' let func = args.shift(); ' + + ' if (!(func === \'_init\' && needsSuper))' + + ' super[func](...args); ' + + ' }' + + '})' + ); + + if (parentProto) { + Object.setPrototypeOf(C.prototype, parentProto); + Object.setPrototypeOf(C, classDef.Extends); + } + + Object.defineProperty(C, 'name', { value: classDef.Name }); + Object.keys(classDef) + .filter(k => classDef.hasOwnProperty(k) && classDef[k] instanceof Function) + .forEach(k => C.prototype[k] = classDef[k]); + + if (isGObject) { + C = GObject.registerClass({ Signals: classDef.Signals || {} }, C); + } + + return C; +}; + +// simplify global signals and function injections handling +// abstract class +var BasicHandler = defineClass({ + Name: 'DashToPanel.BasicHandler', + + _init: function(){ + this._storage = new Object(); + }, + + add: function(/*unlimited 3-long array arguments*/){ + + // convert arguments object to array, concatenate with generic + let args = [].concat('generic', [].slice.call(arguments)); + // call addWithLabel with ags as if they were passed arguments + this.addWithLabel.apply(this, args); + }, + + destroy: function() { + for( let label in this._storage ) + this.removeWithLabel(label); + }, + + addWithLabel: function( label /* plus unlimited 3-long array arguments*/) { + + if(this._storage[label] == undefined) + this._storage[label] = new Array(); + + // skip first element of the arguments + for( let i = 1; i < arguments.length; i++ ) { + let item = this._storage[label]; + let handlers = this._create(arguments[i]); + + for (let j = 0, l = handlers.length; j < l; ++j) { + item.push(handlers[j]); + } + } + + }, + + removeWithLabel: function(label){ + + if(this._storage[label]) { + for( let i = 0; i < this._storage[label].length; i++ ) { + this._remove(this._storage[label][i]); + } + + delete this._storage[label]; + } + }, + + /* Virtual methods to be implemented by subclass */ + // create single element to be stored in the storage structure + _create: function(item){ + throw new Error('no implementation of _create in ' + this); + }, + + // correctly delete single element + _remove: function(item){ + throw new Error('no implementation of _remove in ' + this); + } +}); + +// Manage global signals +var GlobalSignalsHandler = defineClass({ + Name: 'DashToPanel.GlobalSignalsHandler', + Extends: BasicHandler, + + _create: function(item) { + let handlers = []; + + item[1] = [].concat(item[1]); + + for (let i = 0, l = item[1].length; i < l; ++i) { + let object = item[0]; + let event = item[1][i]; + let callback = item[2] + try { + let id = object.connect(event, callback); + + handlers.push([object, id]); + } catch (e) + { + + } + } + + return handlers; + }, + + _remove: function(item){ + item[0].disconnect(item[1]); + } +}); + +/** + * Manage function injection: both instances and prototype can be overridden + * and restored + */ +var InjectionsHandler = defineClass({ + Name: 'DashToPanel.InjectionsHandler', + Extends: BasicHandler, + + _create: function(item) { + let object = item[0]; + let name = item[1]; + let injectedFunction = item[2]; + let original = object[name]; + + object[name] = injectedFunction; + return [[object, name, injectedFunction, original]]; + }, + + _remove: function(item) { + let object = item[0]; + let name = item[1]; + let original = item[3]; + object[name] = original; + } +}); + +/** + * Manage timeouts: the added timeouts have their id reset on completion + */ +var TimeoutsHandler = defineClass({ + Name: 'DashToPanel.TimeoutsHandler', + Extends: BasicHandler, + + _create: function(item) { + let name = item[0]; + let delay = item[1]; + let timeoutHandler = item[2]; + + this._remove(item); + + this[name] = Mainloop.timeout_add(delay, () => { + this[name] = 0; + timeoutHandler(); + }); + + return [[name]]; + }, + + remove: function(name) { + this._remove([name]) + }, + + _remove: function(item) { + let name = item[0]; + + if (this[name]) { + Mainloop.source_remove(this[name]); + this[name] = 0; + } + }, + + getId: function(name) { + return this[name] ? this[name] : 0; + } +}); + +// This is wrapper to maintain compatibility with GNOME-Shell 3.30+ as well as +// previous versions. +var DisplayWrapper = { + getScreen: function() { + return global.screen || global.display; + }, + + getWorkspaceManager: function() { + return global.screen || global.workspace_manager; + }, + + getMonitorManager: function() { + return global.screen || Meta.MonitorManager.get(); + } +}; + +var getCurrentWorkspace = function() { + return DisplayWrapper.getWorkspaceManager().get_active_workspace(); +}; + +var getWorkspaceByIndex = function(index) { + return DisplayWrapper.getWorkspaceManager().get_workspace_by_index(index); +}; + +var getWorkspaceCount = function() { + return DisplayWrapper.getWorkspaceManager().n_workspaces; +}; + +var getStageTheme = function() { + return St.ThemeContext.get_for_stage(global.stage); +}; + +var getScaleFactor = function() { + return getStageTheme().scale_factor || 1; +}; + +var getAppDisplayViews = function() { + //gnome-shell 3.38 only has one view and it is now the appDisplay + return imports.ui.appDisplay._views || [{ view: imports.ui.appDisplay }]; +}; + +var findIndex = function(array, predicate) { + if (Array.prototype.findIndex) { + return array.findIndex(predicate); + } + + for (let i = 0, l = array.length; i < l; ++i) { + if (predicate(array[i])) { + return i; + } + } + + return -1; +}; + +var find = function(array, predicate) { + let index = findIndex(array, predicate); + + if (index > -1) { + return array[index]; + } +}; + +var mergeObjects = function(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +var hookVfunc = function(proto, symbol, func) { + if (Gi.hook_up_vfunc_symbol && func) { + //gjs > 1.53.3 + proto[Gi.hook_up_vfunc_symbol](symbol, func); + } else { + //On older gjs, this is how to hook vfunc. It is buggy and can't be used reliably to replace + //already hooked functions. Since it's our only use for it, disabled for now (and probably forever) + //Gi.hook_up_vfunc(proto, symbol, func); + } +}; + +var wrapActor = function(actor) { + if (actor) { + Object.defineProperty(actor, 'actor', { + value: actor instanceof Clutter.Actor ? actor : actor.actor + }); + } +}; + +var getTransformedAllocation = function(actor) { + if (Config.PACKAGE_VERSION < '3.37') { + return Shell.util_get_transformed_allocation(actor); + } + + let extents = actor.get_transformed_extents(); + let topLeft = extents.get_top_left(); + let bottomRight = extents.get_bottom_right(); + + return { x1: topLeft.x, x2: bottomRight.x, y1: topLeft.y, y2: bottomRight.y }; +}; + +var allocate = function(actor, box, flags, useParent) { + let allocateObj = useParent ? actor.__proto__ : actor; + + allocateObj.allocate.apply(actor, getAllocationParams(box, flags)); +}; + +var setAllocation = function(actor, box, flags) { + actor.set_allocation.apply(actor, getAllocationParams(box, flags)); +}; + +var getAllocationParams = function(box, flags) { + let params = [box]; + + if (Config.PACKAGE_VERSION < '3.37') { + params.push(flags); + } + + return params; +}; + +var setClip = function(actor, x, y, width, height) { + actor.set_clip(0, 0, width, height); + actor.set_position(x, y); + actor.set_size(width, height); +}; + +var addKeybinding = function(key, settings, handler, modes) { + if (!Main.wm._allowedKeybindings[key]) { + Main.wm.addKeybinding( + key, + settings, + Meta.KeyBindingFlags.NONE, + modes || (Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW), + handler + ); + } +}; + +var removeKeybinding = function(key) { + if (Main.wm._allowedKeybindings[key]) { + Main.wm.removeKeybinding(key); + } +}; + +var getrgbColor = function(color) { + color = typeof color === 'string' ? Clutter.color_from_string(color)[1] : color; + + return { red: color.red, green: color.green, blue: color.blue }; +}; + +var getrgbaColor = function(color, alpha, offset) { + if (alpha <= 0) { + return 'transparent; '; + } + + let rgb = getrgbColor(color); + + if (offset) { + ['red', 'green', 'blue'].forEach(k => { + rgb[k] = Math.min(255, Math.max(0, rgb[k] + offset)); + + if (rgb[k] == color[k]) { + rgb[k] = Math.min(255, Math.max(0, rgb[k] - offset)); + } + }); + } + + return 'rgba(' + rgb.red + ',' + rgb.green + ',' + rgb.blue + ',' + (Math.floor(alpha * 100) * 0.01) + '); ' ; +}; + +var checkIfColorIsBright = function(color) { + let rgb = getrgbColor(color); + let brightness = 0.2126 * rgb.red + 0.7152 * rgb.green + 0.0722 * rgb.blue; + + return brightness > 128; +}; + +var getMouseScrollDirection = function(event) { + let direction; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + direction = 'up'; + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + direction = 'down'; + break; + } + + return direction; +}; + +var checkIfWindowHasTransient = function(window) { + let hasTransient; + + window.foreach_transient(t => !(hasTransient = true)); + + return hasTransient; +}; + +var activateSiblingWindow = function(windows, direction, startWindow) { + let windowIndex = windows.indexOf(global.display.focus_window); + let nextWindowIndex = windowIndex < 0 ? + startWindow ? windows.indexOf(startWindow) : 0 : + windowIndex + (direction == 'up' ? 1 : -1); + + if (nextWindowIndex == windows.length) { + nextWindowIndex = 0; + } else if (nextWindowIndex < 0) { + nextWindowIndex = windows.length - 1; + } + + if (windowIndex != nextWindowIndex) { + Main.activateWindow(windows[nextWindowIndex]); + } +}; + +var animateWindowOpacity = function(window, tweenOpts) { + //there currently is a mutter bug with the windowactor opacity, starting with 3.34 + //https://gitlab.gnome.org/GNOME/mutter/issues/836 + + if (Config.PACKAGE_VERSION > '3.35') { + //on 3.36, a workaround is to use the windowactor's child for the fade animation + //this leaves a "shadow" on the desktop, so the windowactor needs to be hidden + //when the animation is complete + let visible = tweenOpts.opacity > 0; + let windowActor = window; + + window = windowActor.get_first_child() || windowActor; + + if (!windowActor.visible && visible) { + window.opacity = 0; + windowActor.visible = visible; + } + + if (!visible) { + let initialOpacity = window.opacity; + + tweenOpts.onComplete = () => { + windowActor.visible = visible; + window.opacity = initialOpacity; + }; + } + } else if (Config.PACKAGE_VERSION > '3.33') { + //the workaround only works on 3.35+, so on 3.34, let's just hide the + //window without animation + return window.visible = (tweenOpts.opacity == 255); + } + + animate(window, tweenOpts); +}; + +var animate = function(actor, options) { + if (Tweener) { + return Tweener.addTween(actor, options); + } + + //to support both Tweener and Clutter animations, we use Tweener "time" + //and "delay" properties defined in seconds, as opposed to Clutter animations + //"duration" and "delay" which are defined in milliseconds + if (options.delay) { + options.delay = options.delay * 1000; + } + + options.duration = options.time * 1000; + delete options.time; + + if (options.transition) { + //map Tweener easing equations to Clutter animation modes + options.mode = { + 'easeInCubic': Clutter.AnimationMode.EASE_IN_CUBIC, + 'easeInOutCubic': Clutter.AnimationMode.EASE_IN_OUT_CUBIC, + 'easeInOutQuad': Clutter.AnimationMode.EASE_IN_OUT_QUAD, + 'easeOutQuad': Clutter.AnimationMode.EASE_OUT_QUAD + }[options.transition] || Clutter.AnimationMode.LINEAR; + + delete options.transition; + } + + let params = [options]; + + if ('value' in options && actor instanceof St.Adjustment) { + params.unshift(options.value); + delete options.value; + } + + actor.ease.apply(actor, params); +} + +var isAnimating = function(actor, prop) { + if (Tweener) { + return Tweener.isTweening(actor); + } + + return !!actor.get_transition(prop); +} + +var stopAnimations = function(actor) { + if (Tweener) { + return Tweener.removeTweens(actor); + } + + actor.remove_all_transitions(); +} + +var getIndicators = function(delegate) { + if (delegate instanceof St.BoxLayout) { + return delegate; + } + + return delegate.indicators; +} + +var getPoint = function(coords) { + if (Config.PACKAGE_VERSION > '3.35.1') { + return new imports.gi.Graphene.Point(coords); + } + + return new Clutter.Point(coords); +} + +var getPanelGhost = function() { + if (!Main.overview._panelGhost) { + return Main.overview._overview.get_first_child(); + } + + return Main.overview._panelGhost; +} + +var notify = function(text, iconName, action, isTransient) { + let source = new MessageTray.SystemNotificationSource(); + let notification = new MessageTray.Notification(source, 'Dash to Panel', text); + let notifyFunc = source.showNotification || source.notify; + + if (iconName) { + source.createIcon = function() { + return new St.Icon({ icon_name: iconName }); + }; + } + + if (action) { + if (!(action instanceof Array)) { + action = [action]; + } + + action.forEach(a => notification.addAction(a.text, a.func)); + } + + Main.messageTray.add(source); + + notification.setTransient(isTransient); + notifyFunc.call(source, notification); +}; + +/* + * This is a copy of the same function in utils.js, but also adjust horizontal scrolling + * and perform few further cheks on the current value to avoid changing the values when + * it would be clamp to the current one in any case. + * Return the amount of shift applied +*/ +var ensureActorVisibleInScrollView = function(scrollView, actor, fadeSize, onComplete) { + let vadjustment = scrollView.vscroll.adjustment; + let hadjustment = scrollView.hscroll.adjustment; + let [vvalue, vlower, vupper, vstepIncrement, vpageIncrement, vpageSize] = vadjustment.get_values(); + let [hvalue, hlower, hupper, hstepIncrement, hpageIncrement, hpageSize] = hadjustment.get_values(); + + let [hvalue0, vvalue0] = [hvalue, vvalue]; + + let voffset = fadeSize; + let hoffset = fadeSize; + + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2, x1 = box.x1, x2 = box.x2; + + let parent = actor.get_parent(); + while (parent != scrollView) { + if (!parent) + throw new Error("actor not in scroll view"); + + let box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + x1 += box.x1; + x2 += box.x1; + parent = parent.get_parent(); + } + + if (y1 < vvalue + voffset) + vvalue = Math.max(0, y1 - voffset); + else if (vvalue < vupper - vpageSize && y2 > vvalue + vpageSize - voffset) + vvalue = Math.min(vupper -vpageSize, y2 + voffset - vpageSize); + + if (x1 < hvalue + hoffset) + hvalue = Math.max(0, x1 - hoffset); + else if (hvalue < hupper - hpageSize && x2 > hvalue + hpageSize - hoffset) + hvalue = Math.min(hupper - hpageSize, x2 + hoffset - hpageSize); + + let tweenOpts = { + time: SCROLL_TIME, + onComplete: onComplete || (() => {}), + transition: 'easeOutQuad' + }; + + if (vvalue !== vvalue0) { + animate(vadjustment, mergeObjects(tweenOpts, { value: vvalue })); + } + + if (hvalue !== hvalue0) { + animate(hadjustment, mergeObjects(tweenOpts, { value: hvalue })); + } + + return [hvalue- hvalue0, vvalue - vvalue0]; +} + +/** + * ColorUtils is adapted from https://github.com/micheleg/dash-to-dock + */ +var ColorUtils = { + colorLuminance: function(r, g, b, dlum) { + // Darken or brighten color by a fraction dlum + // Each rgb value is modified by the same fraction. + // Return "#rrggbb" strin + + let rgbString = '#'; + + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2); + + return rgbString; + }, + + _decimalToHex: function(d, padding) { + // Convert decimal to an hexadecimal string adding the desired padding + + let hex = d.toString(16); + while (hex.length < padding) + hex = '0'+ hex; + return hex; + }, + + HSVtoRGB: function(h, s, v) { + // Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (h,s,v) independently or {h:h, s:s, v:v} object. + // Return {r:r, g:g, b:b} object. + + if (arguments.length === 1) { + s = h.s; + v = h.v; + h = h.h; + } + + let r,g,b; + let c = v*s; + let h1 = h*6; + let x = c*(1 - Math.abs(h1 % 2 - 1)); + let m = v - c; + + if (h1 <=1) + r = c + m, g = x + m, b = m; + else if (h1 <=2) + r = x + m, g = c + m, b = m; + else if (h1 <=3) + r = m, g = c + m, b = x + m; + else if (h1 <=4) + r = m, g = x + m, b = c + m; + else if (h1 <=5) + r = x + m, g = m, b = c + m; + else + r = c + m, g = m, b = x + m; + + return { + r: Math.round(r * 255), + g: Math.round(g * 255), + b: Math.round(b * 255) + }; + }, + + RGBtoHSV: function(r, g, b) { + // Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (r,g,b) independently or {r:r, g:g, b:b} object. + // Return {h:h, s:s, v:v} object. + + if (arguments.length === 1) { + r = r.r; + g = r.g; + b = r.b; + } + + let h,s,v; + + let M = Math.max(r, g, b); + let m = Math.min(r, g, b); + let c = M - m; + + if (c == 0) + h = 0; + else if (M == r) + h = ((g-b)/c) % 6; + else if (M == g) + h = (b-r)/c + 2; + else + h = (r-g)/c + 4; + + h = h/6; + v = M/255; + if (M !== 0) + s = c/M; + else + s = 0; + + return {h: h, s: s, v: v}; + } +}; + +/** + * DominantColorExtractor is adapted from https://github.com/micheleg/dash-to-dock + */ +let themeLoader = null; +let iconCacheMap = new Map(); +const MAX_CACHED_ITEMS = 1000; +const BATCH_SIZE_TO_DELETE = 50; +const DOMINANT_COLOR_ICON_SIZE = 64; + +var DominantColorExtractor = defineClass({ + Name: 'DashToPanel.DominantColorExtractor', + + _init: function(app){ + this._app = app; + }, + + /** + * Try to get the pixel buffer for the current icon, if not fail gracefully + */ + _getIconPixBuf: function() { + let iconTexture = this._app.create_icon_texture(16); + + if (themeLoader === null) { + let ifaceSettings = new Gio.Settings({ schema: "org.gnome.desktop.interface" }); + + themeLoader = new Gtk.IconTheme(), + themeLoader.set_custom_theme(ifaceSettings.get_string('icon-theme')); // Make sure the correct theme is loaded + } + + // Unable to load the icon texture, use fallback + if (iconTexture instanceof St.Icon === false) { + return null; + } + + iconTexture = iconTexture.get_gicon(); + + // Unable to load the icon texture, use fallback + if (iconTexture === null) { + return null; + } + + if (iconTexture instanceof Gio.FileIcon) { + // Use GdkPixBuf to load the pixel buffer from the provided file path + return GdkPixbuf.Pixbuf.new_from_file(iconTexture.get_file().get_path()); + } + + // Get the pixel buffer from the icon theme + let icon_info = themeLoader.lookup_icon(iconTexture.get_names()[0], DOMINANT_COLOR_ICON_SIZE, 0); + if (icon_info !== null) + return icon_info.load_icon(); + else + return null; + }, + + /** + * The backlight color choosing algorithm was mostly ported to javascript from the + * Unity7 C++ source of Canonicals: + * https://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/launcher/LauncherIcon.cpp + * so it more or less works the same way. + */ + _getColorPalette: function() { + if (iconCacheMap.get(this._app.get_id())) { + // We already know the answer + return iconCacheMap.get(this._app.get_id()); + } + + let pixBuf = this._getIconPixBuf(); + if (pixBuf == null) + return null; + + let pixels = pixBuf.get_pixels(), + offset = 0; + + let total = 0, + rTotal = 0, + gTotal = 0, + bTotal = 0; + + let resample_y = 1, + resample_x = 1; + + // Resampling of large icons + // We resample icons larger than twice the desired size, as the resampling + // to a size s + // DOMINANT_COLOR_ICON_SIZE < s < 2*DOMINANT_COLOR_ICON_SIZE, + // most of the case exactly DOMINANT_COLOR_ICON_SIZE as the icon size is tipycally + // a multiple of it. + let width = pixBuf.get_width(); + let height = pixBuf.get_height(); + + // Resample + if (height >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_y = Math.floor(height/DOMINANT_COLOR_ICON_SIZE); + + if (width >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_x = Math.floor(width/DOMINANT_COLOR_ICON_SIZE); + + if (resample_x !==1 || resample_y !== 1) + pixels = this._resamplePixels(pixels, resample_x, resample_y); + + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length; + for (let offset = 0; offset < limit; offset+=4) { + let r = pixels[offset], + g = pixels[offset + 1], + b = pixels[offset + 2], + a = pixels[offset + 3]; + + let saturation = (Math.max(r,g, b) - Math.min(r,g, b)); + let relevance = 0.1 * 255 * 255 + 0.9 * a * saturation; + + rTotal += r * relevance; + gTotal += g * relevance; + bTotal += b * relevance; + + total += relevance; + } + + total = total * 255; + + let r = rTotal / total, + g = gTotal / total, + b = bTotal / total; + + let hsv = ColorUtils.RGBtoHSV(r * 255, g * 255, b * 255); + + if (hsv.s > 0.15) + hsv.s = 0.65; + hsv.v = 0.90; + + let rgb = ColorUtils.HSVtoRGB(hsv.h, hsv.s, hsv.v); + + // Cache the result. + let backgroundColor = { + lighter: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0.2), + original: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0), + darker: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, -0.5) + }; + + if (iconCacheMap.size >= MAX_CACHED_ITEMS) { + //delete oldest cached values (which are in order of insertions) + let ctr=0; + for (let key of iconCacheMap.keys()) { + if (++ctr > BATCH_SIZE_TO_DELETE) + break; + iconCacheMap.delete(key); + } + } + + iconCacheMap.set(this._app.get_id(), backgroundColor); + + return backgroundColor; + }, + + /** + * Downsample large icons before scanning for the backlight color to + * improve performance. + * + * @param pixBuf + * @param pixels + * @param resampleX + * @param resampleY + * + * @return []; + */ + _resamplePixels: function (pixels, resampleX, resampleY) { + let resampledPixels = []; + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length / (resampleX * resampleY) / 4; + for (let i = 0; i < limit; i++) { + let pixel = i * resampleX * resampleY; + + resampledPixels.push(pixels[pixel * 4]); + resampledPixels.push(pixels[pixel * 4 + 1]); + resampledPixels.push(pixels[pixel * 4 + 2]); + resampledPixels.push(pixels[pixel * 4 + 3]); + } + + return resampledPixels; + } + +}); + +var drawRoundedLine = function(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) { + if (height > width) { + y += Math.floor((height - width) / 2.0); + height = width; + } + + height = 2.0 * Math.floor(height / 2.0); + + var leftRadius = isRoundLeft ? height / 2.0 : 0.0; + var rightRadius = isRoundRight ? height / 2.0 : 0.0; + + cr.moveTo(x + width - rightRadius, y); + cr.lineTo(x + leftRadius, y); + if (isRoundLeft) + cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2); + else + cr.lineTo(x, y + height); + cr.lineTo(x + width - rightRadius, y + height); + if (isRoundRight) + cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2); + else + cr.lineTo(x + width, y); + cr.closePath(); + + if (fill != null) { + cr.setSource(fill); + cr.fillPreserve(); + } + if (stroke != null) + cr.setSource(stroke); + cr.stroke(); +} + +/** + * Check if an app exists in the system. + */ +var checkedCommandsMap = new Map(); + +function checkIfCommandExists(app) { + let answer = checkedCommandsMap.get(app); + if (answer === undefined) { + // Command is a shell built in, use shell to call it. + // Quotes around app value are important. They let command operate + // on the whole value, instead of having shell interpret it. + let cmd = "sh -c 'command -v \"" + app + "\"'"; + try { + let out = GLib.spawn_command_line_sync(cmd); + // out contains 1: stdout, 2: stderr, 3: exit code + answer = out[3] == 0; + } catch (ex) { + answer = false; + } + + checkedCommandsMap.set(app, answer); + } + return answer; +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js new file mode 100644 index 0000000..45d08a0 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js @@ -0,0 +1,1145 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const Meta = imports.gi.Meta; +const PopupMenu = imports.ui.popupMenu; +const Signals = imports.signals; +const St = imports.gi.St; +const WindowManager = imports.ui.windowManager; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +//timeout intervals +const ENSURE_VISIBLE_MS = 200; + +//timeout names +const T1 = 'openMenuTimeout'; +const T2 = 'closeMenuTimeout'; +const T3 = 'peekTimeout'; +const T4 = 'ensureVisibleTimeout'; + +const MAX_TRANSLATION = 40; +const HEADER_HEIGHT = 38; +const MAX_CLOSE_BUTTON_SIZE = 30; +const MIN_DIMENSION = 100; +const FOCUSED_COLOR_OFFSET = 24; +const HEADER_COLOR_OFFSET = -12; +const FADE_SIZE = 36; +const PEEK_INDEX_PROP = '_dtpPeekInitialIndex'; + +let headerHeight = 0; +let alphaBg = 0; +let isLeftButtons = false; +let isTopHeader = true; +let isManualStyling = false; +let scaleFactor = 1; +let animationTime = 0; +let aspectRatio = {}; + +var PreviewMenu = Utils.defineClass({ + Name: 'DashToPanel-PreviewMenu', + Extends: St.Widget, + Signals: { 'open-state-changed': {} }, + + _init: function(panel) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); + + let geom = panel.geom; + this.panel = panel; + this.currentAppIcon = null; + this._focusedPreview = null; + this._peekedWindow = null; + this.peekInitialWorkspaceIndex = -1; + this.opened = false; + this.isVertical = geom.position == St.Side.LEFT || geom.position == St.Side.RIGHT; + this._translationProp = 'translation_' + (this.isVertical ? 'x' : 'y'); + this._translationDirection = (geom.position == St.Side.TOP || geom.position == St.Side.LEFT ? -1 : 1); + this._translationOffset = Math.min(panel.dtpSize, MAX_TRANSLATION) * this._translationDirection; + + this.menu = new St.Widget({ + name: 'preview-menu', + layout_manager: new Clutter.BinLayout(), + reactive: true, + track_hover: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign[geom.position != St.Side.RIGHT ? 'START' : 'END'], + y_align: Clutter.ActorAlign[geom.position != St.Side.BOTTOM ? 'START' : 'END'] + }); + this._box = new St.BoxLayout({ vertical: this.isVertical }); + this._scrollView = new St.ScrollView({ + name: 'dashtopanelPreviewScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: true, + y_expand: !this.isVertical + }); + + this._scrollView.add_actor(this._box); + this.menu.add_child(this._scrollView); + this.add_child(this.menu); + }, + + enable: function() { + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + Main.layoutManager.addChrome(this, { affectsInputRegion: false }); + Main.layoutManager.trackChrome(this.menu, { affectsInputRegion: true }); + + this._resetHiddenState(); + this._refreshGlobals(); + this._updateClip(); + this.menu.set_position(1, 1); + + this._signalsHandler.add( + [ + this.menu, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._scrollView, + 'scroll-event', + this._onScrollEvent.bind(this) + ], + [ + this.panel.panelBox, + 'style-changed', + () => this._updateClip() + ], + [ + Utils.DisplayWrapper.getScreen(), + 'in-fullscreen-changed', + () => { + if (global.display.focus_window && global.display.focus_window.is_fullscreen()) { + this.close(true); + } + } + ], + [ + Me.settings, + [ + 'changed::panel-sizes', + 'changed::window-preview-size', + 'changed::window-preview-padding', + 'changed::window-preview-show-title' + ], + () => { + this._refreshGlobals(); + this._updateClip(); + } + ] + ); + }, + + disable: function() { + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + + this.close(true); + + Main.layoutManager.untrackChrome(this.menu); + Main.layoutManager.removeChrome(this); + }, + + requestOpen: function(appIcon) { + let timeout = Me.settings.get_int('show-window-previews-timeout'); + + if (this.opened) { + timeout = Math.min(100, timeout); + } + + this._endOpenCloseTimeouts(); + this._timeoutsHandler.add([T1, timeout, () => this.open(appIcon)]); + }, + + requestClose: function() { + this._endOpenCloseTimeouts(); + this._addCloseTimeout(); + }, + + open: function(appIcon) { + if (this.currentAppIcon != appIcon) { + this.currentAppIcon = appIcon; + + if (!this.opened) { + this._refreshGlobals(); + + this.set_height(this.clipHeight); + this.menu.show(); + + setStyle(this.menu, 'background: ' + Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, alphaBg)); + } + + this._mergeWindows(appIcon); + this._updatePosition(); + this._animateOpenOrClose(true); + + this._setReactive(true); + this._setOpenedState(true); + } + }, + + close: function(immediate) { + this._endOpenCloseTimeouts(); + this._removeFocus(); + this._endPeek(); + + if (immediate) { + Utils.stopAnimations(this.menu); + this._resetHiddenState(); + } else { + this._animateOpenOrClose(false, () => this._resetHiddenState()); + } + + this._setReactive(false); + this.currentAppIcon = null; + }, + + update: function(appIcon, windows) { + if (this.currentAppIcon == appIcon) { + if (windows && !windows.length) { + this.close(); + } else { + this._addAndRemoveWindows(windows); + this._updatePosition(); + } + } + }, + + updatePosition: function() { + this._updatePosition(); + }, + + focusNext: function() { + let previews = this._box.get_children(); + let currentIndex = this._focusedPreview ? previews.indexOf(this._focusedPreview) : -1; + let nextIndex = currentIndex + 1; + + nextIndex = previews[nextIndex] ? nextIndex : 0; + + if (previews[nextIndex]) { + this._removeFocus(); + previews[nextIndex].setFocus(true); + this._focusedPreview = previews[nextIndex]; + } + + return nextIndex; + }, + + activateFocused: function() { + if (this.opened && this._focusedPreview) { + this._focusedPreview.activate(); + } + }, + + requestPeek: function(window) { + this._timeoutsHandler.remove(T3); + + if (Me.settings.get_boolean('peek-mode')) { + if (this.peekInitialWorkspaceIndex < 0) { + this._timeoutsHandler.add([T3, Me.settings.get_int('enter-peek-mode-timeout'), () => this._peek(window)]); + } else { + this._peek(window); + } + } + }, + + endPeekHere: function() { + this._endPeek(true); + }, + + ensureVisible: function(preview) { + let [ , upper, pageSize] = this._getScrollAdjustmentValues(); + + if (upper > pageSize) { + this._timeoutsHandler.add([ + T4, + ENSURE_VISIBLE_MS, + () => Utils.ensureActorVisibleInScrollView(this._scrollView, preview, MIN_DIMENSION, () => this._updateScrollFade()) + ]); + } + }, + + getCurrentAppIcon: function() { + return this.currentAppIcon; + }, + + _setReactive: function(reactive) {  + this._box.get_children().forEach(c => c.reactive = reactive); + this.menu.reactive = reactive; + }, + + _setOpenedState: function(opened) { + this.opened = opened; + this.emit('open-state-changed'); + }, + + _resetHiddenState: function() { + this.menu.hide(); + this.set_height(0); + this._setOpenedState(false); + this.menu.opacity = 0; + this.menu[this._translationProp] = this._translationOffset; + this._box.get_children().forEach(c => c.destroy()); + }, + + _removeFocus: function() { + if (this._focusedPreview) { + this._focusedPreview.setFocus(false); + this._focusedPreview = null; + } + }, + + _mergeWindows: function(appIcon, windows) { + windows = windows || (appIcon.window ? [appIcon.window] : appIcon.getAppIconInterestingWindows()); + windows.sort(Taskbar.sortWindowsCompareFunction); + + let currentPreviews = this._box.get_children(); + let l = Math.max(windows.length, currentPreviews.length); + + for (let i = 0; i < l; ++i) { + if (currentPreviews[i] && windows[i]) { + currentPreviews[i].assignWindow(windows[i], this.opened); + } else if (!currentPreviews[i]) { + this._addNewPreview(windows[i]); + } else if (!windows[i]) { + currentPreviews[i][!this.opened ? 'destroy' : 'animateOut'](); + } + } + }, + + _addAndRemoveWindows: function(windows) { + let currentPreviews = this._box.get_children(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + + for (let i = 0, l = windows.length; i < l; ++i) { + let currentIndex = Utils.findIndex(currentPreviews, c => c.window == windows[i]); + + if (currentIndex < 0) { + this._addNewPreview(windows[i]); + } else { + currentPreviews[currentIndex].assignWindow(windows[i]); + currentPreviews.splice(currentIndex, 1); + + if (this._peekedWindow && this._peekedWindow == windows[i]) { + this.requestPeek(windows[i]); + } + } + } + + currentPreviews.forEach(c => c.animateOut()); + }, + + _addNewPreview: function(window) { + let preview = new Preview(this); + + this._box.add_child(preview); + preview.adjustOnStage(); + preview.assignWindow(window, this.opened); + }, + + _addCloseTimeout: function() { + this._timeoutsHandler.add([T2, Me.settings.get_int('leave-timeout'), () => this.close()]); + }, + + _onHoverChanged: function() { + this._endOpenCloseTimeouts(); + + if (this.currentAppIcon && !this.menu.hover) { + this._addCloseTimeout(); + this._endPeek(); + } + }, + + _onScrollEvent: function(actor, event) { + if (!event.is_pointer_emulated()) { + let vOrh = this.isVertical ? 'v' : 'h'; + let adjustment = this._scrollView['get_' + vOrh + 'scroll_bar']().get_adjustment(); + let increment = adjustment.step_increment; + let delta = increment; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + delta = -increment; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + delta = dy * increment; + delta += dx * increment; + break; + } + + adjustment.set_value(adjustment.get_value() + delta); + this._updateScrollFade(); + } + + return Clutter.EVENT_STOP; + }, + + _endOpenCloseTimeouts: function() { + this._timeoutsHandler.remove(T1); + this._timeoutsHandler.remove(T2); + this._timeoutsHandler.remove(T4); + }, + + _refreshGlobals: function() { + isLeftButtons = Meta.prefs_get_button_layout().left_buttons.indexOf(Meta.ButtonFunction.CLOSE) >= 0; + isTopHeader = Me.settings.get_string('window-preview-title-position') == 'TOP'; + isManualStyling = Me.settings.get_boolean('window-preview-manual-styling'); + scaleFactor = Utils.getScaleFactor(); + headerHeight = Me.settings.get_boolean('window-preview-show-title') ? HEADER_HEIGHT * scaleFactor : 0; + animationTime = Me.settings.get_int('window-preview-animation-time') * .001; + aspectRatio.x = { + size: Me.settings.get_int('window-preview-aspect-ratio-x'), + fixed: Me.settings.get_boolean('window-preview-fixed-x') + }; + aspectRatio.y = { + size: Me.settings.get_int('window-preview-aspect-ratio-y'), + fixed: Me.settings.get_boolean('window-preview-fixed-y') + }; + + alphaBg = Me.settings.get_boolean('preview-use-custom-opacity') ? + Me.settings.get_int('preview-custom-opacity') * .01 : + this.panel.dynamicTransparency.alpha; + }, + + _updateClip: function() { + let x, y, w; + let geom = this.panel.getGeometry(); + let panelBoxTheme = this.panel.panelBox.get_theme_node(); + let previewSize = (Me.settings.get_int('window-preview-size') + + Me.settings.get_int('window-preview-padding') * 2) * scaleFactor; + + if (this.isVertical) { + w = previewSize; + this.clipHeight = this.panel.monitor.height; + y = this.panel.monitor.y; + } else { + w = this.panel.monitor.width; + this.clipHeight = (previewSize + headerHeight); + x = this.panel.monitor.x; + } + + if (geom.position == St.Side.LEFT) { + x = this.panel.monitor.x + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.LEFT); + } else if (geom.position == St.Side.RIGHT) { + x = this.panel.monitor.x + this.panel.monitor.width - (this.panel.dtpSize + previewSize) - panelBoxTheme.get_padding(St.Side.RIGHT); + } else if (geom.position == St.Side.TOP) { + y = this.panel.monitor.y + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.TOP); + } else { //St.Side.BOTTOM + y = this.panel.monitor.y + this.panel.monitor.height - (this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.BOTTOM) + previewSize + headerHeight); + } + + Utils.setClip(this, x, y, w, this.clipHeight); + }, + + _updatePosition: function() { + let sourceNode = this.currentAppIcon.actor.get_theme_node(); + let sourceContentBox = sourceNode.get_content_box(this.currentAppIcon.actor.get_allocation_box()); + let sourceAllocation = Utils.getTransformedAllocation(this.currentAppIcon.actor); + let [previewsWidth, previewsHeight] = this._getPreviewsSize(); + let appIconMargin = Me.settings.get_int('appicon-margin') / scaleFactor; + let x = 0, y = 0; + + previewsWidth = Math.min(previewsWidth, this.panel.monitor.width); + previewsHeight = Math.min(previewsHeight, this.panel.monitor.height); + this._updateScrollFade(previewsWidth < this.panel.monitor.width && previewsHeight < this.panel.monitor.height); + + if (this.isVertical) { + y = sourceAllocation.y1 + appIconMargin - this.panel.monitor.y + (sourceContentBox.y2 - sourceContentBox.y1 - previewsHeight) * .5; + y = Math.max(y, 0); + y = Math.min(y, this.panel.monitor.height - previewsHeight); + } else { + x = sourceAllocation.x1 + appIconMargin - this.panel.monitor.x + (sourceContentBox.x2 - sourceContentBox.x1 - previewsWidth) * .5; + x = Math.max(x, 0); + x = Math.min(x, this.panel.monitor.width - previewsWidth); + } + + if (!this.opened) { + this.menu.set_position(x, y); + this.menu.set_size(previewsWidth, previewsHeight); + } else { + Utils.animate(this.menu, getTweenOpts({ x: x, y: y, width: previewsWidth, height: previewsHeight })); + } + }, + + _updateScrollFade: function(remove) { + let [value, upper, pageSize] = this._getScrollAdjustmentValues(); + let needsFade = Math.round(upper) > Math.round(pageSize); + let fadeWidgets = this.menu.get_children().filter(c => c != this._scrollView); + + if (!remove && needsFade) { + if (!fadeWidgets.length) { + fadeWidgets.push(this._getFadeWidget()); + fadeWidgets.push(this._getFadeWidget(true)); + + this.menu.add_child(fadeWidgets[0]); + this.menu.add_child(fadeWidgets[1]); + } + + fadeWidgets[0].visible = value > 0; + fadeWidgets[1].visible = value + pageSize < upper; + } else if (remove || (!needsFade && fadeWidgets.length)) { + fadeWidgets.forEach(fw => fw.destroy()); + } + }, + + _getScrollAdjustmentValues: function() { + let [value , , upper, , , pageSize] = this._scrollView[(this.isVertical ? 'v' : 'h') + 'scroll'].adjustment.get_values(); + + return [value, upper, pageSize]; + }, + + _getFadeWidget: function(end) { + let x = 0, y = 0; + let startBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, Math.min(alphaBg + .1, 1)); + let endBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, 0) + let fadeStyle = 'background-gradient-start:' + startBg + + 'background-gradient-end:' + endBg + + 'background-gradient-direction:' + this.panel.getOrientation(); + + if (this.isVertical) { + y = end ? this.panel.monitor.height - FADE_SIZE : 0; + } else { + x = end ? this.panel.monitor.width - FADE_SIZE : 0; + } + + let fadeWidget = new St.Widget({ + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: end ? 180 : 0, + style: fadeStyle, + x: x, y: y, + width: this.isVertical ? this.width : FADE_SIZE, + height: this.isVertical ? FADE_SIZE : this.height + }); + + return fadeWidget; + }, + + _getPreviewsSize: function() { + let previewsWidth = 0; + let previewsHeight = 0; + + this._box.get_children().forEach(c => { + if (!c.animatingOut) { + let [width, height] = c.getSize(); + + if (this.isVertical) { + previewsWidth = Math.max(width, previewsWidth); + previewsHeight += height; + } else { + previewsWidth += width; + previewsHeight = Math.max(height, previewsHeight); + } + } + }); + + return [previewsWidth, previewsHeight]; + }, + + _animateOpenOrClose: function(show, onComplete) { + let isTranslationAnimation = this.menu[this._translationProp] != 0; + let tweenOpts = { + opacity: show ? 255 : 0, + transition: show ? 'easeInOutQuad' : 'easeInCubic', + onComplete: () => { + if (isTranslationAnimation) { + Main.layoutManager._queueUpdateRegions(); + } + + (onComplete || (() => {}))(); + } + }; + + tweenOpts[this._translationProp] = show ? this._translationDirection : this._translationOffset; + + Utils.animate(this.menu, getTweenOpts(tweenOpts)); + }, + + _peek: function(window) { + let currentWorkspace = Utils.getCurrentWorkspace(); + let windowWorkspace = window.get_workspace(); + let focusWindow = () => this._focusMetaWindow(Me.settings.get_int('peek-mode-opacity'), window); + + this._restorePeekedWindowStack(); + this._peekedWindow = window; + + if (currentWorkspace != windowWorkspace) { + this._switchToWorkspaceImmediate(windowWorkspace.index()); + this._timeoutsHandler.add([T3, 100, focusWindow]); + } else { + focusWindow(); + } + + if (this.peekInitialWorkspaceIndex < 0) { + this.peekInitialWorkspaceIndex = currentWorkspace.index(); + } + }, + + _endPeek: function(stayHere) { + this._timeoutsHandler.remove(T3); + + if (this._peekedWindow) { + let immediate = !stayHere && this.peekInitialWorkspaceIndex != Utils.getCurrentWorkspace().index(); + + this._restorePeekedWindowStack(); + this._focusMetaWindow(255, this._peekedWindow, immediate, true); + this._peekedWindow = null; + + if (!stayHere) { + this._switchToWorkspaceImmediate(this.peekInitialWorkspaceIndex); + } + + this.peekInitialWorkspaceIndex = -1; + } + }, + + _switchToWorkspaceImmediate: function(workspaceIndex) { + let workspace = Utils.getWorkspaceByIndex(workspaceIndex); + let shouldAnimate = Main.wm._shouldAnimate; + + if (!workspace || (!workspace.list_windows().length && + workspaceIndex < Utils.getWorkspaceCount() - 1)) { + workspace = Utils.getCurrentWorkspace(); + } + + Main.wm._shouldAnimate = () => false; + workspace.activate(global.display.get_current_time_roundtrip()); + Main.wm._shouldAnimate = shouldAnimate; + }, + + _focusMetaWindow: function(dimOpacity, window, immediate, ignoreFocus) { + window.get_workspace().list_windows().forEach(mw => { + let wa = mw.get_compositor_private(); + let isFocused = !ignoreFocus && mw == window; + + if (wa) { + if (isFocused) { + mw[PEEK_INDEX_PROP] = wa.get_parent().get_children().indexOf(wa); + wa.get_parent().set_child_above_sibling(wa, null); + } + + if (isFocused && mw.minimized) { + wa.show(); + } + + if (!mw.minimized) { + let tweenOpts = getTweenOpts({ opacity: isFocused ? 255 : dimOpacity }); + + if (immediate && !mw.is_on_all_workspaces()) { + tweenOpts.time = 0; + } + + Utils.animateWindowOpacity(wa, tweenOpts); + } + } + }); + }, + + _restorePeekedWindowStack: function() { + let windowActor = this._peekedWindow ? this._peekedWindow.get_compositor_private() : null; + + if (windowActor) { + if (this._peekedWindow.hasOwnProperty(PEEK_INDEX_PROP)) { + windowActor.get_parent().set_child_at_index(windowActor, this._peekedWindow[PEEK_INDEX_PROP]); + delete this._peekedWindow[PEEK_INDEX_PROP]; + } + + if (this._peekedWindow.minimized) { + windowActor.hide(); + } + } + }, +}); + +var Preview = Utils.defineClass({ + Name: 'DashToPanel-Preview', + Extends: St.Widget, + + _init: function(previewMenu) { + this.callParent('_init', { + style_class: 'preview-container', + reactive: true, + track_hover: true, + layout_manager: new Clutter.BinLayout() + }); + + this.window = null; + this._waitWindowId = 0; + this._needsCloseButton = true; + this.cloneWidth = this.cloneHeight = 0; + this._previewMenu = previewMenu; + this._padding = Me.settings.get_int('window-preview-padding') * scaleFactor; + this._previewDimensions = this._getPreviewDimensions(); + this.animatingOut = false; + + let box = new St.Widget({ layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL }), y_expand: true }); + let [previewBinWidth, previewBinHeight] = this._getBinSize(); + let closeButton = new St.Button({ style_class: 'window-close', accessible_name: 'Close window' }); + + if (Config.PACKAGE_VERSION >= '3.31.9') { + closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); + } + + this._closeButtonBin = new St.Widget({ + style_class: 'preview-close-btn-container', + layout_manager: new Clutter.BinLayout(), + opacity: 0, + x_expand: true, y_expand: true, + x_align: Clutter.ActorAlign[isLeftButtons ? 'START' : 'END'], + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + + this._closeButtonBin.add_child(closeButton); + + this._previewBin = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + style: 'padding: ' + this._padding / scaleFactor + 'px;' + }); + + this._previewBin.set_size(previewBinWidth, previewBinHeight); + + box.add_child(this._previewBin); + + if (headerHeight) { + let headerBox = new St.Widget({ + style_class: 'preview-header-box', + layout_manager: new Clutter.BoxLayout(), + x_expand: true, + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + + setStyle(headerBox, this._getBackgroundColor(HEADER_COLOR_OFFSET, 1)); + this._workspaceIndicator = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); + this._windowTitle = new St.Label({ y_align: Clutter.ActorAlign.CENTER, x_expand: true }); + + this._iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._iconBin.set_size(headerHeight, headerHeight); + + headerBox.add_child(this._iconBin); + headerBox.insert_child_at_index(this._workspaceIndicator, isLeftButtons ? 0 : 1); + headerBox.insert_child_at_index(this._windowTitle, isLeftButtons ? 1 : 2); + + box.insert_child_at_index(headerBox, isTopHeader ? 0 : 1); + } + + this.add_child(box); + this.add_child(this._closeButtonBin); + + closeButton.connect('clicked', () => this._onCloseBtnClick()); + this.connect('notify::hover', () => this._onHoverChanged()); + this.connect('button-release-event', (actor, e) => this._onButtonReleaseEvent(e)); + this.connect('destroy', () => this._onDestroy()); + }, + + adjustOnStage: function() { + let closeButton = this._closeButtonBin.get_first_child(); + let closeButtonHeight = closeButton.height; + let maxCloseButtonSize = MAX_CLOSE_BUTTON_SIZE * scaleFactor; + let closeButtonBorderRadius = ''; + + if (closeButtonHeight > maxCloseButtonSize) { + closeButtonHeight = maxCloseButtonSize; + closeButton.set_size(closeButtonHeight, closeButtonHeight); + } + + if (!headerHeight) { + closeButtonBorderRadius = 'border-radius: '; + + if (isTopHeader) { + closeButtonBorderRadius += (isLeftButtons ? '0 0 4px 0;' : '0 0 0 4px;'); + } else { + closeButtonBorderRadius += (isLeftButtons ? '0 4px 0 0;' : '4px 0 0 0;'); + } + } + + setStyle( + this._closeButtonBin, + 'padding: ' + (headerHeight ? Math.round((headerHeight - closeButtonHeight) * .5 / scaleFactor) : 4) + 'px;' + + this._getBackgroundColor(HEADER_COLOR_OFFSET, headerHeight ? 1 : .6) + + closeButtonBorderRadius + ); + }, + + assignWindow: function(window, animateSize) { + if (this.window != window) { + let _assignWindowClone = () => { + if (window.get_compositor_private()) { + let cloneBin = this._getWindowCloneBin(window); + + this._resizeClone(cloneBin, window); + this._addClone(cloneBin, animateSize); + this._previewMenu.updatePosition(); + } else if (!this._waitWindowId) { + this._waitWindowId = Mainloop.idle_add(() => { + this._waitWindowId = 0; + + if (this._previewMenu.opened) { + _assignWindowClone(); + } + }); + } + }; + + _assignWindowClone(); + } + + this._cancelAnimateOut(); + this._removeWindowSignals(); + this.window = window; + this._needsCloseButton = window.can_close() && !Utils.checkIfWindowHasTransient(window); + this._updateHeader(); + }, + + animateOut: function() { + if (!this.animatingOut) { + let tweenOpts = getTweenOpts({ opacity: 0, width: 0, height: 0, onComplete: () => this.destroy() }); + + this.animatingOut = true; + + Utils.stopAnimations(this); + Utils.animate(this, tweenOpts); + } + }, + + getSize: function() { + let [binWidth, binHeight] = this._getBinSize(); + + binWidth = Math.max(binWidth, this.cloneWidth + this._padding * 2); + binHeight = Math.max(binHeight, this.cloneHeight + this._padding * 2) + headerHeight; + + return [binWidth, binHeight]; + }, + + setFocus: function(focused) { + this._hideOrShowCloseButton(!focused); + setStyle(this, this._getBackgroundColor(FOCUSED_COLOR_OFFSET, focused ? '-' : 0)); + + if (focused) { + this._previewMenu.ensureVisible(this); + this._previewMenu.requestPeek(this.window); + } + }, + + activate: function() { + this._previewMenu.endPeekHere(); + this._previewMenu.close(); + Main.activateWindow(this.window); + }, + + _onDestroy: function() { + if (this._waitWindowId) { + GLib.source_remove(this._waitWindowId); + this._waitWindowId = 0; + } + + this._removeWindowSignals(); + }, + + _onHoverChanged: function() { + this.setFocus(this.hover); + }, + + _onCloseBtnClick: function() { + this._hideOrShowCloseButton(true); + this.reactive = false; + + if (!Me.settings.get_boolean('group-apps')) { + this._previewMenu.close(); + } else { + this._previewMenu.endPeekHere(); + } + + this.window.delete(global.get_current_time()); + }, + + _onButtonReleaseEvent: function(e) { + switch (e.get_button()) { + case 1: // Left click + this.activate(); + break; + case 2: // Middle click + if (Me.settings.get_boolean('preview-middle-click-close')) { + this._onCloseBtnClick(); + } + break; + case 3: // Right click + this._showContextMenu(e); + break; + } + + return Clutter.EVENT_STOP; + }, + + _cancelAnimateOut: function() { + if (this.animatingOut) { + this.animatingOut = false; + + Utils.stopAnimations(this); + Utils.animate(this, getTweenOpts({ opacity: 255, width: this.cloneWidth, height: this.cloneHeight })); + } + }, + + _showContextMenu: function(e) { + let coords = e.get_coords(); + let currentWorkspace = this._previewMenu.peekInitialWorkspaceIndex < 0 ? + Utils.getCurrentWorkspace() : + Utils.getWorkspaceByIndex(this._previewMenu.peekInitialWorkspaceIndex); + + Main.wm._showWindowMenu(null, this.window, Meta.WindowMenuType.WM, { + x: coords[0], + y: coords[1], + width: 0, + height: 0 + }); + + let ctxMenuData = Main.wm._windowMenuManager._manager._menus[0]; + + ctxMenuData.menu.connect('open-state-changed', () => this._previewMenu.menu.sync_hover()); + + if (this.window.get_workspace() != currentWorkspace) { + let menuItem = new PopupMenu.PopupMenuItem(_('Move to current Workspace') + ' [' + (currentWorkspace.index() + 1) + ']'); + let menuItems = ctxMenuData.menu.box.get_children(); + let insertIndex = Utils.findIndex(menuItems, c => c._delegate instanceof PopupMenu.PopupSeparatorMenuItem); + + insertIndex = insertIndex >= 0 ? insertIndex : menuItems.length - 1; + ctxMenuData.menu.addMenuItem(menuItem, insertIndex); + menuItem.connect('activate', () => this.window.change_workspace(currentWorkspace)); + } + }, + + _removeWindowSignals: function() { + if (this._titleWindowChangeId) { + this.window.disconnect(this._titleWindowChangeId); + this._titleWindowChangeId = 0; + } + }, + + _updateHeader: function() { + if (headerHeight) { + let iconTextureSize = Me.settings.get_boolean('window-preview-use-custom-icon-size') ? + Me.settings.get_int('window-preview-custom-icon-size') : + headerHeight / scaleFactor * .6; + let icon = this._previewMenu.getCurrentAppIcon().app.create_icon_texture(iconTextureSize); + let workspaceIndex = ''; + let workspaceStyle = null; + let fontScale = Me.desktopSettings.get_double('text-scaling-factor'); + let commonTitleStyles = 'color: ' + Me.settings.get_string('window-preview-title-font-color') + ';' + + 'font-size: ' + Me.settings.get_int('window-preview-title-font-size') * fontScale + 'px;' + + 'font-weight: ' + Me.settings.get_string('window-preview-title-font-weight') + ';'; + + this._iconBin.destroy_all_children(); + this._iconBin.add_child(icon); + + if (!Me.settings.get_boolean('isolate-workspaces')) { + workspaceIndex = (this.window.get_workspace().index() + 1).toString(); + workspaceStyle = 'margin: 0 4px 0 ' + (isLeftButtons ? Math.round((headerHeight - icon.width) * .5) + 'px' : '0') + '; padding: 0 4px;' + + 'border: 2px solid ' + this._getRgbaColor(FOCUSED_COLOR_OFFSET, .8) + 'border-radius: 2px;' + commonTitleStyles; + } + + this._workspaceIndicator.text = workspaceIndex; + setStyle(this._workspaceIndicator, workspaceStyle); + + this._titleWindowChangeId = this.window.connect('notify::title', () => this._updateWindowTitle()); + setStyle(this._windowTitle, 'max-width: 0px; padding-right: 4px;' + commonTitleStyles); + this._updateWindowTitle(); + } + }, + + _updateWindowTitle: function() { + this._windowTitle.text = this.window.title; + }, + + _hideOrShowCloseButton: function(hide) { + if (this._needsCloseButton) { + Utils.animate(this._closeButtonBin, getTweenOpts({ opacity: hide ? 0 : 255 })); + } + }, + + _getBackgroundColor: function(offset, alpha) { + return 'background-color: ' + this._getRgbaColor(offset, alpha) + + 'transition-duration:' + this._previewMenu.panel.dynamicTransparency.animationDuration; + }, + + _getRgbaColor: function(offset, alpha) { + alpha = Math.abs(alpha); + + if (isNaN(alpha)) { + alpha = alphaBg; + } + + return Utils.getrgbaColor(this._previewMenu.panel.dynamicTransparency.backgroundColorRgb, alpha, offset); + }, + + _addClone: function(newCloneBin, animateSize) { + let currentClones = this._previewBin.get_children(); + let newCloneOpts = getTweenOpts({ opacity: 255 }); + + this._previewBin.add_child(newCloneBin); + + if (currentClones.length) { + let currentCloneBin = currentClones.pop(); + let currentCloneOpts = getTweenOpts({ opacity: 0, onComplete: () => currentCloneBin.destroy() }); + + if (newCloneBin.width > currentCloneBin.width) { + newCloneOpts.width = newCloneBin.width; + newCloneBin.width = currentCloneBin.width; + } else { + currentCloneOpts.width = newCloneBin.width; + } + + if (newCloneBin.height > currentCloneBin.height) { + newCloneOpts.height = newCloneBin.height; + newCloneBin.height = currentCloneBin.height; + } else { + currentCloneOpts.height = newCloneBin.height; + } + + currentClones.forEach(c => c.destroy()); + Utils.animate(currentCloneBin, currentCloneOpts); + } else if (animateSize) { + newCloneBin.width = 0; + newCloneBin.height = 0; + newCloneOpts.width = this.cloneWidth; + newCloneOpts.height = this.cloneHeight; + } + + Utils.animate(newCloneBin, newCloneOpts); + }, + + _getWindowCloneBin: function(window) { + let frameRect = window.get_frame_rect(); + let bufferRect = window.get_buffer_rect(); + let clone = new Clutter.Clone({ source: window.get_compositor_private() }); + let cloneBin = new St.Widget({ + opacity: 0, + layout_manager: frameRect.width != bufferRect.width || + frameRect.height != bufferRect.height ? + new WindowCloneLayout(frameRect, bufferRect) : + new Clutter.BinLayout() + }); + + cloneBin.add_child(clone); + + return cloneBin; + }, + + _getBinSize: function() { + let [fixedWidth, fixedHeight] = this._previewDimensions; + + return [ + aspectRatio.x.fixed ? fixedWidth + this._padding * 2 : -1, + aspectRatio.y.fixed ? fixedHeight + this._padding * 2 : -1 + ]; + }, + + _resizeClone: function(cloneBin, window) { + let frameRect = cloneBin.layout_manager.frameRect || window.get_frame_rect(); + let [fixedWidth, fixedHeight] = this._previewDimensions; + let ratio = Math.min(fixedWidth / frameRect.width, fixedHeight / frameRect.height, 1); + let cloneWidth = frameRect.width * ratio; + let cloneHeight = frameRect.height * ratio; + + let clonePaddingTB = cloneHeight < MIN_DIMENSION ? MIN_DIMENSION - cloneHeight : 0; + let clonePaddingLR = cloneWidth < MIN_DIMENSION ? MIN_DIMENSION - cloneWidth : 0; + let clonePaddingTop = clonePaddingTB * .5; + let clonePaddingLeft = clonePaddingLR * .5; + + this.cloneWidth = cloneWidth + clonePaddingLR * scaleFactor; + this.cloneHeight = cloneHeight + clonePaddingTB * scaleFactor; + + cloneBin.set_style('padding: ' + clonePaddingTop + 'px ' + clonePaddingLeft + 'px;'); + cloneBin.layout_manager.ratio = ratio; + cloneBin.layout_manager.padding = [clonePaddingLeft * scaleFactor, clonePaddingTop * scaleFactor]; + + cloneBin.get_first_child().set_size(cloneWidth, cloneHeight); + }, + + _getPreviewDimensions: function() { + let size = Me.settings.get_int('window-preview-size') * scaleFactor; + let w, h; + + if (this._previewMenu.isVertical) { + w = size; + h = w * aspectRatio.y.size / aspectRatio.x.size; + } else { + h = size; + w = h * aspectRatio.x.size / aspectRatio.y.size; + } + + return [w, h]; + } +}); + +var WindowCloneLayout = Utils.defineClass({ + Name: 'DashToPanel-WindowCloneLayout', + Extends: Clutter.BinLayout, + + _init: function(frameRect, bufferRect) { + this.callParent('_init'); + + //the buffer_rect contains the transparent padding that must be removed + this.frameRect = frameRect; + this.bufferRect = bufferRect; + }, + + vfunc_allocate: function(actor, box, flags) { + let [width, height] = box.get_size(); + + box.set_origin( + (this.bufferRect.x - this.frameRect.x) * this.ratio + this.padding[0], + (this.bufferRect.y - this.frameRect.y) * this.ratio + this.padding[1] + ); + + box.set_size( + width + (this.bufferRect.width - this.frameRect.width) * this.ratio, + height + (this.bufferRect.height - this.frameRect.height) * this.ratio + ); + + Utils.allocate(actor.get_first_child(), box, flags); + } +}); + +function setStyle(actor, style) { + if (!isManualStyling) { + actor.set_style(style); + } +} + +function getTweenOpts(opts) { + let defaults = { + time: animationTime, + transition: 'easeInOutQuad' + }; + + return Utils.mergeObjects(opts || {}, defaults); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js new file mode 100644 index 0000000..904c7de --- /dev/null +++ b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js @@ -0,0 +1,52 @@ +/* exported init */ + +const Self = imports.misc.extensionUtils.getCurrentExtension() +const extensionUtils = imports.misc.extensionUtils + +class Extension { + constructor() { + this.available_mods = Self.imports.src.modsList.get() + } + + _refresh_mod(name) { + if (!this.available_mods[name]) return + + if (this.settings.get_boolean(name)) { // enable + if (this.mods[name]) return + + const mod = new this.available_mods[name]() + mod.enable() + this.mods[name] = mod + } else if (this.mods[name]) { //disable + this.mods[name].disable() + delete this.mods[name] + } + } + + enable() { + this.mods = {} + + this.settings = extensionUtils.getSettings() + + Object.keys(this.available_mods).forEach(name => { + this.settings.connect('changed::' + name, () => { + this._refresh_mod(name) + }); + this._refresh_mod(name) + }) + } + + disable() { + for (const key in this.mods) { + if (!this.mods.hasOwnProperty(key)) continue; + this.mods[key].disable() + } + + delete this.mods + delete this.settings + } +} + +function init() { + return new Extension(); +} diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..a042c9cd295117a7e68c37bb593807fd28372dae GIT binary patch literal 873 zcmZ`$O=}ZD7#_7+SUnXH5ry&QWnzn$lHy6*60jH~iWd))-AOWcI-hE~l(|YiQXPP6c zV9$ioG77WQ%RgpML_<1{J>*6p^oVQ23W|ri%F!W-gylLf3sw+(`;4EZTzOl$t@TsE zmCUmDAPS8Lp|M+oo)J6dZmr5?xJLa7SD5Vn)4~Q@J*{)SN7S)`hJCtjlyoI*;5O{olXM+8xYCQ;c95!1 ms6B!Vh8&}=g?Z<%@K<9Vm_G}yLgxdNCMb89Kb)It1o1!3ZEUOn literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..5791425ab7644103241c6b4235ed81d625a36eae GIT binary patch literal 519 zcmZvYK}rKL6o#W#H|~m97Yf0J1u=&xxUk@&*b}5Pug;@sGUTP5R=kEQFW@cQ3f{q$ zd)My#ryXep17E&`N%HYn*A$$0^Y$9_ylL*8?-@ZN2wls z3D@@>d=4+*EBG0{fZyN_`~}yeu3L{iu)kU1v_hP0Y z7vorx8ltqWLYzoxGm@^}#LzS+ud4!6Dkzd>(ZRbVCfZz4HwdeT>#+SMtj1gh5MCgFbaW8{3L0@r~QxCFcfqI?9d0H1(( z{{^@Pd<8B8KY#@wIm6gIcoDn+bbuGoU!9%VKY#`F&)~=4pWwUT-Z{puf)BxXGOYu| z=70ezK4MDemZYOU?82!x#7slB zQM4yYWvMj#Vywo@lJmy?<($d<_0XE23+BjsrH4+`rf{NC&a;6vJCu9TE5viMP8r?i z$>6Ejrbb0gJd~br^+Y-^QY*EqBr>%5ebPI!R+{%Wwz^v>UoEJ)SCf|7i|oYKD(yO6 z>S2&W5-G`g8fm7td1;e=ufK7cc)7KdJTTf5Vx$LSx}xTwBz9oiE?$BrnAy(qw0C z4Ga~^^E<7j)^fs96Lw6nj?1!C`G_p9$ni!EH71Eu0b~LHC+y$k_2jrFz8j=2xT?7R ze)#@?OI+X(GO^m$)m?30%UjYRLsQH~-1 Vr-VKRkNHTCg>igroKpzy*e}k37>@t| literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..0c2d2593dd146241df5a7d9cdba5902a61550203 GIT binary patch literal 918 zcma))QA<=o6vwBsg4>%|^iXggdzsCp7u(ecN<&auWQ$(Mz2okzcW0KFS#^7xdn1Ar zC5=cjOg9vzRdIuiK13fNdKtF0haP+H+`Ed21ReO@|2b#o%sB_{_s))&2<$v?1;_#y zfN3DIPrxN$4~X(#fy=-*pbPj7Tm_s{2z7#91MLFRz!1cl(+FJzT>`xcx(n)o{sQd< z9XW&0InY^9D2e9)K^;Jpj|`4tgOb?JMqlDjlB&Y0ASSUcR7#_qFkhhp^C(u7$Xo$2 zo|BX)`qw#D>@h`Rg31X-C-E4QbWBX)GAkoVl@{{Y#zLg>ARh zSa5qqm6V7_iWPoaRJ1R|c%oRo1!X*6A$f|kl$7FU+HuM)5@&dDxc{hYGSTha5nNLa zjjCm6s_B%zUiJy&X*X9O62|X)kR8B1NB5$E#;C;oJSRL@E#>x%GVNsiiX=WB5VE9F zE-%NS>Px2Gw%ga8b{^q-lvCN>CL^fFw0k4bok%*!hFdoLVuLLk?AdTJ_V=urPFhp5 z=9M+it=X{VNprc;oO@=?nhgRQe6-=R4QFgnv*D%`byInf~z9S`QUH zSfnR+L7~(t6^2@|1^X9x@edIHfSKvhyKi=dS|5Don>YC;FE9BuJhVzMP9hhO2675{ ziIlN}oJDq#^8XLy9P$%6gZxG=BF+&)hEXq}o=2*sVm@`0kkhD-QOo=(YU%6!%~RBJ zpYN!+q<;<+GK8Ec2N=f&LeSEWq}vwYq#(^j+0wv)IixrhvDivXAbuKhL<($~NZ z{4>vtcmhPtfSwUB%UVK1OU<#4=nxIYDt*Y@y==z3t-d>V9vN zUJp3LNp$VX%`nDZD!z(upkIaw4}mp+$Nlw#+@;gXnXFHaAJiVLj5xQHv>>sgj zmYx^s9xawPvfTx8*tEEr?WD9=?`7!%nHW3|_39qY(r&i>pF2;}Y-^9^pT87uUXkM2 T8r~$$KW^l&yC@&>cRlh4E6w&^ literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..f6570305c7504e2462b202bfd727cd44f7cfac07 GIT binary patch literal 827 zcmY+By>1gh5XTn?Aeo8?AtXTBKtU)r5JC~z81a!9ED>RW2?&W|d^h$jzS}+R?Ab}4 zftHFVNI?&EDmoqj@fNg*|Ji|r(f#hfAG13%J3ki}J}TH*a0T?iIq(70_61x7UqQY8 z9b5uGzypHV3iZHFcx++`Qn4t!HL~B4gscRX`=)k9G78BSJYGwB(#*QS`z7!M@Ye!xP$ydh2;S zp|M7@1{_B0)HXYb9FARwJv0aljf~IL?ccMAsvhDu fyTPS@vzo2wqY&y5OOn~~fC6hGSCRYCbQ;>%Nwf%^flffLq1J3&Yh9oxIT58U!qddM@%8dWZ^yVM z=NH{Dx4FJt@O0i#PG^;Clow=jqzjoqc}D&4yGHLS^0!p5rB%^g(Scg=x7`iBL4h)% zAN&el_A+a$fxlVEl2Ku(3#-Om_p`>$YZDS*NQvwGz>gd`{K_%6IO2v>xW=o z%RXXS+?F#rvDf%(!-eaJs~qF9DMyZ!;EA~nYQ(qPl6|Rs=ZFzfLJs((EN4kD-lLwB ziSJMjIT2%1*|JIQ20z>4fA?_ye-AfFL)9eLQ#wz&u5shc&(1rx0e-Qw*X+5<4UB_n wiGRLrq)jCem?Vk*V=r9)zo$zSz@ns##lB$Abq7Pn*nd+FxoOug$IvEy0VugsQvd(} literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/Packages/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..74449f3cd24bb26e692580033a32f720c358e6d9 GIT binary patch literal 867 zcmZ{i&2AGh6om~Gkiv?pLP&t*?%IV5Et@K75QzRziHZn?iVcf9GoFbXj~)3s(}q1e zw(tZIj}VphyZ{e?Snv+)Ig?UK7hLI^W8blJjwk-HxbR7!Zi4%u4{m{vps7=E2Ydxh z{~NdqzJn$33p@a=D?%(nSD?$F172YM?y3;Cp>saKU0S~u<@=fTfJB6wXRGvQ`;0ZS}%#C>IZUc31Qmu zz=wjIeCDEe%-+eZa^6{^^Ul+v#KG56Up~QhSB$C9s;{ZU&mHU^>|7YGuRUr#_bzG& zkI4vrQJ=(zBTL40WICXLLw4Wvch%;_x+Y7mgW7Sa&+q}-ax*dUuTxuc)q1P;wA0}% zanI|_MEMwI;?OWj3W<(9!Eqe1ER8c1Cm}I5(?QnLN;~Q5X^@$YGNC{+H_ov{`+O&f z?RsX9B-gWHUQcb*QPiJ@BzZ{IA(W&F<6x@9hm0>

      + + + + +----- + +### Bugs + +Bugs should be reported [here](https://gitlab.com/arcmenu/ArcMenu/issues) on the GitLab issues page. + +When reporting a bug, please provide as much information as you can about the issue and make sure to include your Linux distribution, GNOME Shell version, and ArcMenu version. + +----- + +### Credits: + +**@[AndrewZaech](https://gitlab.com/AndrewZaech) - Current Project Maintainer and Developer** + +**@[AndyC](https://gitlab.com/LinxGem33) - Founder of ArcMenu and former project maintainer** + +**@[lexruee](https://github.com/lexruee) - Former UI/UX Designer | @[Thomas Ingvarsson](https://gitlab.com/tingvarsson) - Former Developer** + +Additional credits: +* The 'ArcMenu' layout design is insipired by the Zorin OS menu extension. +* ArcMenu utilizes various code from GNOME Shell and the GNOME Shell extensions package. +* Borrowed code from Dash-to-Dock's extension 'location.js' file to implement a trash shortcut in ArcMenu. + +----- + +### Contributors: + +#### Thanks to the following people for contributing via pull requests: + +**@[fishears](https://github.com/fishears/Arc-Menu)** | **@[JasonLG1979](https://github.com/JasonLG1979)** | **@[itmitica](https://github.com/itmitica)** | **@[vikaig](https://gitlab.com/vikaig)** | **@[MagneFire](https://gitlab.com/MagneFire)** + +**@[tognee](https://gitlab.com/tognee)** | **@[hlechner](https://gitlab.com/hlechner)** | **@[vanillajonathan](https://gitlab.com/vanillajonathan)** | **@[epskampie](https://gitlab.com/epskampie)** | **@[GnomeBook](https://gitlab.com/GnomeBook)** + +**@[charlesg99](https://github.com/charlesg99)** | **@[harshadgavali](https://gitlab.com/harshadgavali)** | **@[O. Giesmann ](https://gitlab.com/Etamuk)** | **@[aleayr ](https://gitlab.com/aleayr)** + + +#### Bug Fixes: + +**@[JasonLG1979](https://github.com/JasonLG1979)** | **@[lexruee](https://github.com/lexruee/Arc-Menu)** | **@[aleayr ](https://gitlab.com/aleayr)** + + +#### Translators: + +**@[Nilvus](https://gitlab.com/Nilvus) - French** | **@[Etamuk](https://gitlab.com/Etamuk) - German** | **@[alex4401](https://gitlab.com/alex4401) - Polish** | **@[frnogueira](https://gitlab.com/frnogueira), @[Z Bed](https://gitlab.com/zbed) - Brazilian Portuguese** | **@[sigbjokj](https://gitlab.com/sigbjokj), @[sssandum](https://gitlab.com/sssandum) - Norwegian** + + **@[Ivan](https://gitlab.com/vantu5z), @[Ser82-png](https://gitlab.com/Ser82-png) - Russian** | **@[gkkulik](https://gitlab.com/gkkulik) - Silesian** | **@[vikaig](https://gitlab.com/vikaig) - Ukrainian** | **@[jordim](https://gitlab.com/jordim) - Catalan** | **@[aylinux](https://gitlab.com/aylinux) - Turkish** + + +**@[MorganAntonsson](https://gitlab.com/MorganAntonsson) - Swedish** | **@[jiri.doubravsky](https://gitlab.com/jiri.doubravsky), @[panmourovaty ](https://gitlab.com/panmourovaty) - Czech** | **@[juanlucer](https://gitlab.com/juanlucer) - Spanish** | **@[plesry](https://gitlab.com/plesry) - Chinese (Taiwan)** | **@[Vombato](https://gitlab.com/Vombato), @[matguidi](https://gitlab.com/matguidi) - Italian** + +**@[skygmin](https://gitlab.com/skygmin) - Simplified Chinese** | **@[Vistaus](https://gitlab.com/Vistaus), @[vinno97](https://gitlab.com/vinno97) - Dutch** | **@[artnay](https://gitlab.com/artnay) - Finnish** | **@[rimasx](https://gitlab.com/rimasx) - Estonian** | **@[stevendobay](https://gitlab.com/stevendobay) - Hungarian** + +**@[omeritzics](https://gitlab.com/omeritzics) - Hebrew** | **@[prescott66](https://gitlab.com/prescott66) - Slovak** | **@[Mejans](https://gitlab.com/Mejans) - Occitan** | **@[KuroeHanako](https://gitlab.com/KuroeHanako) - Korean** | **@[sayuri](https://gitlab.com/sayuri-) - Sinhalese** + +**@[Latgardi](https://gitlab.com/Latgardi) - Belarusian** + +----- + +### License & Terms + +ArcMenu is available under the terms of the GPL-2.0 license See [`COPYING`](https://gitlab.com/arcmenu/ArcMenu/blob/master/COPYING) for details. + +Most of ArcMenu's image assets including, but not limited to, custom menu button icons, wire frame svgs, and custom settings icons, are created by [LinxGem33](https://gitlab.com/LinxGem33) and licensed under; [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) + +**Legal disclaimer for brand icons and trademarks:** + +*" All brand icons are trademarks of their respective owners. The use of these trademarks does not indicate endorsement of the trademark holder by ArcMenu project, nor vice versa. Please do not use brand logos for any purpose except to represent the company, product, or service to which they refer. "* + +

      +Read More... + +

      + +* **UBUNTU ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Ubuntu name and Ubuntu logo is a trademark of Canonical ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Ltd. + +* **FEDORA ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Fedora and the Infinity design logo are trademarks of Red Hat, Inc. + +* **DEBIAN ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - is a registered trademark owned by Software in the Public Interest, Inc. Debian trademark is a registered United States trademark of Software in the Public Interest, Inc., managed by the Debian project. + +* **MANJARO ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - (logo) and name is a trademark of Manjaro GmbH & Co. KG + +* **POP_OS! ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Name and (logo) is a trademark of system 76 ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Inc. + +* **ARCH LINUX ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - The stylized Arch Linux logo are recognised trademarks of Arch Linux, copyright 2002-2017 Judd Vinet and Aaron Griffin + +* **SOLUS** - name and logo is Copyright ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) 2014-2018 by Solus Project + +* **KALI LINUX** - logo and name is part of ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) OffSec Services Limited 2020 + +* **PUREOS** - name and logo is developed by members of the Purism community + +* **RASPBERRY PI** ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) - Logo and name is part of Raspberry Pi Foundation +UK Registered Charity 1129409 + +* **Gentoo Authors![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** 2001–2020 +Gentoo is a trademark of the Gentoo Foundation, Inc. + +* **Voyager ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Linux** +(name) and (logo) + +* **MXLinux![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** 2020 - +Linux - is the registered trademark of Linus Torvalds in the U.S. and other countries. + +* **Red Hat, Inc.![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** Copyright 2020 +(name) and (logo) + +* **ZORIN OS** - The "Z" logomark is a registered trademark of Zorin Technology Group Ltd. Copyright © 2019 - 2021 Zorin Technology Group Ltd + +

      +
      + +----- diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/constants.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/constants.js new file mode 100644 index 0000000..082cb4b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/constants.js @@ -0,0 +1,460 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +var SearchbarLocation = { + BOTTOM: 0, + TOP: 1 +} + +var MenuItemLocation = { + BOTTOM: 0, + TOP: 1 +} + +var DisplayType = { + LIST: 0, + GRID: 1, + BUTTON: 2, + SIMPLE_CATEGORY: 3, + SUBMENU_CATEGORY: 4, +} + +var CategoryType = { + FAVORITES: 0, + FREQUENT_APPS: 1, + ALL_PROGRAMS: 2, + PINNED_APPS: 3, + RECENT_FILES: 4, + HOME_SCREEN: 5, + SEARCH_RESULTS: 6, + CATEGORIES_LIST: 7, +}; + +var DefaultMenuView = { + PINNED_APPS: 0, + CATEGORIES_LIST: 1, + FREQUENT_APPS: 2, + ALL_PROGRAMS: 3 +} + +var PrefsVisiblePage = { + MAIN: 0, + MENU_LAYOUT: 1, + BUTTON_APPEARANCE: 2, + LAYOUT_TWEAKS: 3, + ABOUT: 4, + CUSTOMIZE_MENU: 5, + RUNNER_TWEAKS: 6 +} + +var DefaultMenuViewTognee = { + CATEGORIES_LIST: 0, + ALL_PROGRAMS: 1 +} + +var SoftwareManagerIDs = ['org.manjaro.pamac.manager.desktop', 'pamac-manager.desktop', 'io.elementary.appcenter.desktop', + 'snap-store_ubuntu-software.desktop', 'snap-store_snap-store.desktop', 'org.gnome.Software.desktop']; + +var Categories = [ + {CATEGORY: CategoryType.FAVORITES, NAME: _("Favorites"), ICON: 'emblem-favorite-symbolic', FULL_COLOR_ICON: 'emblem-favorite'}, + {CATEGORY: CategoryType.FREQUENT_APPS, NAME: _("Frequent Apps"), ICON: 'user-bookmarks-symbolic', FULL_COLOR_ICON: 'user-bookmarks'}, + {CATEGORY: CategoryType.ALL_PROGRAMS, NAME: _("All Apps"), ICON: 'view-grid-symbolic', FULL_COLOR_ICON: 'view-grid-symbolic'}, + {CATEGORY: CategoryType.PINNED_APPS, NAME: _("Pinned Apps"), ICON: 'view-pin-symbolic', FULL_COLOR_ICON: 'view-pin-symbolic'}, + {CATEGORY: CategoryType.RECENT_FILES, NAME: _("Recent Files"), ICON: 'document-open-recent-symbolic', FULL_COLOR_ICON: 'document-open-recent'} +] + +var ArcMenuPlacement = { + PANEL: 0, + DTP: 1, + DASH: 2 +}; + +var TooltipLocation = { + TOP_CENTERED: 0, + BOTTOM_CENTERED: 1, + BOTTOM: 2, +}; + +var SeparatorAlignment = { + VERTICAL: 0, + HORIZONTAL: 1 +}; + +var SeparatorStyle = { + SHORT: 0, + MEDIUM: 1, + LONG: 2, + MAX: 3, + HEADER_LABEL: 4, + NORMAL: 5, + ALWAYS_SHOW: 6, +}; + +var CaretPosition = { + END: -1, + START: 0, + MIDDLE: 2, +}; + +var CategoryIconType = { + FULL_COLOR: 0, + SYMBOLIC: 1, +} + +var ForcedMenuLocation = { + OFF: 0, + TOP_CENTERED: 1, + BOTTOM_CENTERED: 2, +} + +var IconSize = { + DEFAULT: 0, + EXTRA_SMALL: 1, + SMALL: 2, + MEDIUM: 3, + LARGE: 4, + EXTRA_LARGE: 5, +} + +var GridIconSize = { + DEFAULT: 0, + SMALL: 1, + MEDIUM: 2, + LARGE: 3, + SMALL_RECT: 4, + MEDIUM_RECT: 5, + LARGE_RECT: 6, +}; + +var GridIconInfo = [ + { NAME: 'SmallIconGrid', SIZE: 90, ICON_SIZE: 36, ENUM: GridIconSize.SMALL }, + { NAME: 'MediumIconGrid', SIZE: 97, ICON_SIZE: 42, ENUM: GridIconSize.MEDIUM }, + { NAME: "LargeIconGrid", SIZE: 105, ICON_SIZE: 52, ENUM: GridIconSize.LARGE }, + { NAME: 'SmallRectIconGrid', SIZE: 95, ICON_SIZE: 28, ENUM: GridIconSize.SMALL_RECT }, + { NAME: 'MediumRectIconGrid', SIZE: 102, ICON_SIZE: 34, ENUM: GridIconSize.MEDIUM_RECT }, + { NAME: 'LargeRectIconGrid', SIZE: 105, ICON_SIZE: 42, ENUM: GridIconSize.LARGE_RECT }, +] + +var EXTRA_SMALL_ICON_SIZE = 16; +var SMALL_ICON_SIZE = 20; +var MEDIUM_ICON_SIZE = 25; +var LARGE_ICON_SIZE = 30; +var EXTRA_LARGE_ICON_SIZE = 35; +var MISC_ICON_SIZE = 24; + +var SUPER_L = 'Super_L'; +var SUPER_R = 'Super_R'; +var EMPTY_STRING = ''; + +var HotKey = { + UNDEFINED: 0, + SUPER_L: 1, + CUSTOM: 2, + // Inverse mapping + 0: EMPTY_STRING, + 1: SUPER_L, +}; + +var RunnerHotKey = { + SUPER_L: 0, + CUSTOM: 1, + 0: SUPER_L, +}; + +var HotCornerAction = { + DEFAULT: 0, + DISABLED: 1, + TOGGLE_ARCMENU: 2, + CUSTOM: 3 +} + +var SECTIONS = [ + 'devices', + 'network', + 'bookmarks', +]; + +var MenuPosition = { + LEFT: 0, + CENTER: 1, + RIGHT: 2 +}; + +var RavenPosition = { + LEFT: 0, + RIGHT: 1 +}; + +var DiaglogType = { + DEFAULT: 0, + OTHER: 1, + APPLICATIONS: 2, + DIRECTORIES: 3 +}; + +var MenuButtonAppearance = { + ICON: 0, + TEXT: 1, + ICON_TEXT: 2, + TEXT_ICON: 3, + NONE: 4 +}; + +var MenuIcon = { + ARC_MENU: 0, + DISTRO_ICON: 1, + CUSTOM: 2 +}; + +var PowerType = { + LOGOUT: 0, + LOCK: 1, + RESTART: 2, + POWER_OFF: 3, + SUSPEND: 4, + HYBRID_SLEEP: 5, + HIBERNATE: 6, +}; + +var SleepIcon = { + PATH: '/media/icons/menu_icons/sleep-symbolic.svg' +}; + +var PowerOptions = [ + { TYPE: PowerType.LOGOUT, IMAGE: 'application-exit-symbolic', TITLE: _("Log Out") }, + { TYPE: PowerType.LOCK, IMAGE: 'changes-prevent-symbolic', TITLE: _("Lock") }, + { TYPE: PowerType.RESTART, IMAGE: 'system-reboot-symbolic', TITLE: _("Restart") }, + { TYPE: PowerType.POWER_OFF, IMAGE: 'system-shutdown-symbolic', TITLE: _("Power Off") }, + { TYPE: PowerType.SUSPEND, IMAGE: 'media-playback-pause-symbolic', TITLE: _("Suspend") }, + { TYPE: PowerType.HYBRID_SLEEP, IMAGE: Me.path + SleepIcon.PATH, TITLE: _("Hybrid Sleep") }, + { TYPE: PowerType.HIBERNATE, IMAGE: 'document-save-symbolic', TITLE: _("Hibernate") }, +]; + +var MenuIcons = [ + { PATH: '/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/curved-a-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/focus-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/whirl-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/sums-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arrow-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/lins-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/search-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/transform-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/3d-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/alien-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/cloud-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dragon-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/fly-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pacman-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/peaks-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pie-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pointer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/toxic-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/tree-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/zegon-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/apps-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/bug-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/cita-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/eclipse-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/football-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/heddy-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/helmet-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/palette-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/peeks-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/record-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/saucer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/step-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/vancer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/vibe-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/start-box-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dolphin-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dota-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/football2-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/loveheart-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/rewind-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/snap-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/time-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/3D-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/a-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/bat-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dra-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/equal-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/gnacs-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/groove-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/kaaet-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/launcher-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pac-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/robots-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/sheild-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/somnia-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/utool-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/swirl-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/round-symbolic.svg'}, +] + +var DistroIcons = [ + { PATH: 'start-here-symbolic'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg'}, +] + +var MenuLayout = { + ARCMENU: 0, + BRISK: 1, + WHISKER: 2, + GNOME_MENU: 3, + MINT: 4, + ELEMENTARY: 5, + GNOME_OVERVIEW: 6, + SIMPLE: 7, + SIMPLE_2: 8, + REDMOND: 9, + UNITY: 10, + BUDGIE: 11, + INSIDER: 12, + RUNNER: 13, + CHROMEBOOK: 14, + RAVEN: 15, + TOGNEE: 16, + PLASMA: 17, + WINDOWS: 18, + LAUNCHER: 19, + ELEVEN: 20, + AZ: 21, +}; + +var TraditionalMenus = [ + { IMAGE: 'arcmenu-layout-symbolic', TITLE: _('ArcMenu'), LAYOUT: MenuLayout.ARCMENU}, + { IMAGE: 'brisk-layout-symbolic', TITLE: _('Brisk'), LAYOUT: MenuLayout.BRISK}, + { IMAGE: 'whisker-layout-symbolic', TITLE: _('Whisker'), LAYOUT: MenuLayout.WHISKER}, + { IMAGE: 'gnomemenu-layout-symbolic', TITLE: _('GNOME Menu'), LAYOUT: MenuLayout.GNOME_MENU}, + { IMAGE: 'mint-layout-symbolic', TITLE: _('Mint'), LAYOUT: MenuLayout.MINT}, + { IMAGE: 'budgie-layout-symbolic', TITLE: _('Budgie'), LAYOUT: MenuLayout.BUDGIE}]; + +var ModernMenus = [ + { IMAGE: 'unity-layout-symbolic', TITLE: _('Unity'), LAYOUT: MenuLayout.UNITY}, + { IMAGE: 'plasma-layout-symbolic', TITLE: _('Plasma'), LAYOUT: MenuLayout.PLASMA}, + { IMAGE: 'tognee-layout-symbolic', TITLE: _('tognee'), LAYOUT: MenuLayout.TOGNEE}, + { IMAGE: 'insider-layout-symbolic', TITLE: _('Insider'), LAYOUT: MenuLayout.INSIDER}, + { IMAGE: 'redmond-layout-symbolic', TITLE: _('Redmond'), LAYOUT: MenuLayout.REDMOND}, + { IMAGE: 'windows-layout-symbolic', TITLE: _('Windows'), LAYOUT: MenuLayout.WINDOWS}, + { IMAGE: 'eleven-layout-symbolic', TITLE: _('11'), LAYOUT: MenuLayout.ELEVEN}, + { IMAGE: 'az-layout-symbolic', TITLE: _('a.z.'), LAYOUT: MenuLayout.AZ}]; + +var TouchMenus = [ + { IMAGE: 'elementary-layout-symbolic', TITLE: _('Elementary'), LAYOUT: MenuLayout.ELEMENTARY}, + { IMAGE: 'chromebook-layout-symbolic', TITLE: _('Chromebook'), LAYOUT: MenuLayout.CHROMEBOOK}]; + +var LauncherMenus = [ + { IMAGE: 'launcher-layout-symbolic', TITLE: _('Launcher'), LAYOUT: MenuLayout.LAUNCHER}, + { IMAGE: 'runner-layout-symbolic', TITLE: _('Runner'), LAYOUT: MenuLayout.RUNNER}, + { IMAGE: 'gnomeoverview-layout-symbolic', TITLE: _('GNOME Overview'), LAYOUT: MenuLayout.GNOME_OVERVIEW}]; + +var SimpleMenus = [ + { IMAGE: 'simple-layout-symbolic', TITLE: _('Simple'), LAYOUT: MenuLayout.SIMPLE}, + { IMAGE: 'simple2-layout-symbolic', TITLE: _('Simple 2'), LAYOUT: MenuLayout.SIMPLE_2}]; + +var AlternativeMenus = [ + { IMAGE: 'raven-layout-symbolic', TITLE: _('Raven'), LAYOUT: MenuLayout.RAVEN}]; + +var MenuStyles = { + STYLES: [ + { IMAGE: 'traditional-category-symbolic', TITLE: _("Traditional"), MENU_TYPE: TraditionalMenus }, + { IMAGE: 'modern-category-symbolic', TITLE: _("Modern"), MENU_TYPE: ModernMenus }, + { IMAGE: 'touch-category-symbolic', TITLE: _("Touch"), MENU_TYPE: TouchMenus }, + { IMAGE: 'simple-category-symbolic', TITLE: _("Simple"), MENU_TYPE: SimpleMenus }, + { IMAGE: 'launcher-category-symbolic', TITLE: _("Launcher"), MENU_TYPE: LauncherMenus }, + { IMAGE: 'alternative-category-symbolic', TITLE: _("Alternative"), MENU_TYPE: AlternativeMenus } + ] +}; + +var ArcMenuSettingsCommand = 'gnome-extensions prefs arcmenu@arcmenu.com'; + +var HamburgerIcon = { + PATH: '/media/icons/menu_icons/hamburger-symbolic.svg' +}; + +var DistroIconsDisclaimer = '"All brand icons are trademarks of their respective owners. The use of these trademarks does not indicate endorsement of the trademark holder by ArcMenu project, nor vice versa. Please do not use brand logos for any purpose except to represent the company, product, or service to which they refer."'+ + '\n\n• Ubuntu® - Ubuntu name and Ubuntu logo are trademarks of Canonical© Ltd.'+ + '\n\n• Fedora® - Fedora and the Infinity design logo are trademarks of Red Hat, Inc.'+ + '\n\n• Debian® - is a registered trademark owned by Software in the Public Interest, Inc. Debian trademark is a registered United States trademark of Software in the Public Interest, Inc., managed by the Debian project.'+ + '\n\n• Manjaro® - logo and name are trademarks of Manjaro GmbH & Co. KG'+ + '\n\n• Pop_OS!® - logo and name are trademarks of system 76© Inc.'+ + '\n\n• Arch Linux™ - The stylized Arch Linux logo is a recognized trademark of Arch Linux, copyright 2002–2017 Judd Vinet and Aaron Griffin.'+ + '\n\n• openSUSE® - logo and name 2001–2020 SUSE LLC, © 2005–2020 openSUSE Contributors & others.'+ + '\n\n• Raspberry Pi® - logo and name are part of Raspberry Pi Foundation UK Registered Charity 1129409'+ + '\n\n• Kali Linux™ - logo and name are part of © OffSec Services Limited 2020'+ + '\n\n• PureOS - logo and name are developed by members of the Purism community'+ + '\n\n• Solus - logo and name are copyright © 2014–2018 by Solus Project'+ + '\n\n• Gentoo Authors© - 2001–2020 Gentoo is a trademark of the Gentoo Foundation, Inc.'+ + '\n\n• Voyager© Linux - name and logo'+ + '\n\n• MX Linux© - 2020 - Linux - is the registered trademark of Linus Torvalds in the U.S. and other countries.'+ + '\n\n• Red Hat, Inc.© - Copyright 2020 name and logo' + + '\n\n• ZORIN OS - The "Z" logomark is a registered trademark of Zorin Technology Group Ltd. Copyright © 2019 - 2021 Zorin Technology Group Ltd'; + +var DEVELOPERS = 'Andrew Zaech @AndrewZaech\nLead Project Developer and Maintainer\t' + + '\n\nLinxGem33 aka Andy C @LinxGem33 - (Inactive)\nArcMenu Founder - Former Maintainer - Former Digital Art Designer'; +var TRANSLATORS = 'Thank you to all translators!\n\n' + + 'For a list of all translators please visit ArcMenu on GitLab'; +var CONTRIBUTORS = 'Thank you to all who contributed to, and/or helped, the developement of ArcMenu!' + +'\n\nFor a list of all contributors please visit ArcMenu on GitLab'; +var ARTWORK = 'LinxGem33 aka Andy C\nWiki Screens, Icons, Wire-Frames, ArcMenu Assets' + + '\n\nAndrew Zaech\nIcons, Wire-Frames'; + +var GNU_SOFTWARE = '' + + 'This program comes with absolutely no warranty.\n' + + 'See the ' + + 'GNU General Public License, version 2 or later for details.' + + ''; diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/controller.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/controller.js new file mode 100644 index 0000000..7c35a80 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/controller.js @@ -0,0 +1,749 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Gio, GLib, Gtk, St} = imports.gi; +const Constants = Me.imports.constants; +const Helper = Me.imports.helper; +const Main = imports.ui.main; +const MenuButton = Me.imports.menuButton; +const {StandaloneRunner} = Me.imports.standaloneRunner; +const Utils = Me.imports.utils; + +var MenuSettingsController = class { + constructor(settings, settingsControllers, panel, panelIndex, arcMenuPlacement) { + this._settings = settings; + if(this._settings.get_boolean('reload-theme')) + this._settings.reset('reload-theme'); + this.panel = panel; + this.arcMenuPlacement = arcMenuPlacement; + + global.toggleArcMenu = () => this.toggleMenus(); + + this.currentMonitorIndex = 0; + this._activitiesButton = Main.panel.statusArea.activities; + this.isPrimary = panelIndex === 0 ? true : false; + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL) { + this._menuButton = new MenuButton.MenuButton(settings, this.arcMenuPlacement, panel); + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) { + this._menuButton = new MenuButton.MenuButton(settings, this.arcMenuPlacement, panel, panelIndex); + this.menuButtonAdjustedActor = this._menuButton.container; + } + + this._settingsControllers = settingsControllers + + if(this.isPrimary){ + this._menuHotKeybinder = new Helper.MenuHotKeybinder(); + this._keybindingManager = new Helper.KeybindingManager(this._settings); + this._hotCornerManager = new Helper.HotCornerManager(this._settings,() => this.toggleMenus()); + } + this._applySettings(); + } + + // Load and apply the settings from the arc-menu settings + _applySettings() { + if(this.isPrimary){ + this._updateHotCornerManager(); + this._updateHotKeyBinder(); + } + + this._setButtonAppearance(); + this._setButtonText(); + this._setButtonIcon(); + this._setButtonIconSize(); + this._setButtonIconPadding(); + this._configureActivitiesButton(); + } + // Bind the callbacks for handling the settings changes to the event signals + bindSettingsChanges() { + this.settingsChangeIds = [ + this._settings.connect('changed::hot-corners', this._updateHotCornerManager.bind(this)), + this._settings.connect('changed::menu-hotkey', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::runner-menu-hotkey', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::enable-standlone-runner-menu', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::position-in-panel', this._setButtonPosition.bind(this)), + this._settings.connect('changed::menu-button-position-offset', this._setButtonPosition.bind(this)), + this._settings.connect('changed::menu-position-alignment', this._setMenuPositionAlignment.bind(this)), + this._settings.connect('changed::menu-button-appearance', this._setButtonAppearance.bind(this)), + this._settings.connect('changed::custom-menu-button-text', this._setButtonText.bind(this)), + this._settings.connect('changed::menu-button-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::distro-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::arc-menu-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::custom-menu-button-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::custom-menu-button-icon-size', this._setButtonIconSize.bind(this)), + this._settings.connect('changed::button-padding', this._setButtonIconPadding.bind(this)), + this._settings.connect('changed::enable-menu-button-arrow', this._setMenuButtonArrow.bind(this)), + this._settings.connect('changed::enable-custom-arc-menu', this._updateStyle.bind(this)), + this._settings.connect('changed::remove-menu-arrow', this._updateStyle.bind(this)), + this._settings.connect('changed::disable-searchbox-border', this._updateStyle.bind(this)), + this._settings.connect('changed::indicator-color', this._updateStyle.bind(this)), + this._settings.connect('changed::indicator-text-color', this._updateStyle.bind(this)), + this._settings.connect('changed::directory-shortcuts-list', this._reload.bind(this)), + this._settings.connect('changed::application-shortcuts-list', this._reload.bind(this)), + this._settings.connect('changed::disable-recently-installed-apps', this._initiateRecentlyInstalledApps.bind(this)), + this._settings.connect('changed::extra-categories', this._reload.bind(this)), + this._settings.connect('changed::power-options', this._reload.bind(this)), + this._settings.connect('changed::show-external-devices', this._reload.bind(this)), + this._settings.connect('changed::show-bookmarks', this._reload.bind(this)), + this._settings.connect('changed::disable-user-avatar', this._reload.bind(this)), + this._settings.connect('changed::enable-activities-shortcut', this._reload.bind(this)), + this._settings.connect('changed::enable-horizontal-flip', this._reload.bind(this)), + this._settings.connect('changed::searchbar-default-bottom-location', this._reload.bind(this)), + this._settings.connect('changed::searchbar-default-top-location', this._plasmaMenuReloadTheme.bind(this)), + this._settings.connect('changed::searchbar-default-top-location', this._reload.bind(this)), + this._settings.connect('changed::multi-lined-labels', this._reload.bind(this)), + this._settings.connect('changed::apps-show-extra-details', this._reload.bind(this)), + this._settings.connect('changed::show-search-result-details', this._reload.bind(this)), + this._settings.connect('changed::search-provider-open-windows', this._reload.bind(this)), + this._settings.connect('changed::search-provider-recent-files', this._reload.bind(this)), + this._settings.connect('changed::disable-scrollview-fade-effect', this._reload.bind(this)), + this._settings.connect('changed::menu-height', this._updateMenuHeight.bind(this)), + this._settings.connect('changed::menu-width-adjustment', this._updateMenuHeight.bind(this)), + this._settings.connect('changed::reload-theme', this._reloadTheme.bind(this)), + this._settings.connect('changed::pinned-app-list',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-weather-widget-unity',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-clock-widget-unity',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-weather-widget-raven',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-clock-widget-raven',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::brisk-shortcuts-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::mint-pinned-app-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::mint-separator-index',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::unity-pinned-app-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::unity-separator-index',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::windows-disable-frequent-apps', this._reload.bind(this)), + this._settings.connect('changed::windows-disable-pinned-apps', this._reload.bind(this)), + this._settings.connect('changed::default-menu-view', this._reload.bind(this)), + this._settings.connect('changed::default-menu-view-tognee',this._reload.bind(this)), + this._settings.connect('changed::alphabetize-all-programs',this._reload.bind(this)), + this._settings.connect('changed::enable-unity-homescreen',this._setDefaultMenuView.bind(this)), + this._settings.connect('changed::menu-layout', this._updateMenuLayout.bind(this)), + this._settings.connect('changed::menu-item-grid-icon-size', this._reload.bind(this)), + this._settings.connect('changed::menu-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::button-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::quicklinks-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::misc-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::runner-position', this.updateLocation.bind(this)), + this._settings.connect('changed::runner-show-frequent-apps', this._reload.bind(this)), + this._settings.connect('changed::enable-sub-menus', this._reload.bind(this)), + this._settings.connect('changed::show-activities-button', this._configureActivitiesButton.bind(this)), + this._settings.connect('changed::force-menu-location', this._forceMenuLocation.bind(this)), + this._settings.connect('changed::category-icon-type', this._reload.bind(this)), + this._settings.connect('changed::shortcut-icon-type', this._reload.bind(this)), + this._settings.connect('changed::arcmenu-extra-categories-links', this._reload.bind(this)), + this._settings.connect('changed::arcmenu-extra-categories-links-location', this._reload.bind(this)), + ]; + } + + _reload(){ + this._menuButton.reload(); + if(this.runnerMenu) + this.runnerMenu.reload(); + } + + _forceMenuLocation(){ + this._menuButton.forceMenuLocation(); + } + + _initiateRecentlyInstalledApps(){ + this._menuButton.initiateRecentlyInstalledApps(); + this._menuButton.reload(); + if(this.runnerMenu){ + this.runnerMenu.initiateRecentlyInstalledApps(); + this.runnerMenu.reload(); + } + } + + _plasmaMenuReloadTheme(){ + if(this._settings.get_enum('menu-layout') === Constants.MenuLayout.PLASMA){ + if(this._settings.get_boolean('reload-theme')) + this._settings.reset('reload-theme'); + this._settings.set_boolean('reload-theme', true); + } + } + + updateLocation(){ + this._menuButton.updateLocation(); + if(this.runnerMenu) + this.runnerMenu.updateLocation(); + } + + _updateMenuLayout(){ + this._menuButton.updateMenuLayout(); + } + + _setDefaultMenuView(){ + this._menuButton.setDefaultMenuView(); + } + + toggleStandaloneRunner(){ + this._closeAllArcMenus(); + if(this.runnerMenu) + this.runnerMenu.toggleMenu(); + } + + toggleMenus(){ + if(this.runnerMenu && this.runnerMenu.arcMenu.isOpen) + this.runnerMenu.toggleMenu(); + if(global.dashToPanel || this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + const MultipleArcMenus = this._settingsControllers.length > 1; + const ShowArcMenuOnPrimaryMonitor = this._settings.get_boolean('hotkey-open-primary-monitor'); + if(MultipleArcMenus && ShowArcMenuOnPrimaryMonitor) + this._toggleMenuOnMonitor(Main.layoutManager.primaryMonitor); + else if(MultipleArcMenus && !ShowArcMenuOnPrimaryMonitor) + this._toggleMenuOnMonitor(Main.layoutManager.currentMonitor); + else + this._menuButton.toggleMenu(); + } + else + this._menuButton.toggleMenu(); + } + + _toggleMenuOnMonitor(monitor){ + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + let monitorIndex = this._settingsControllers[i].monitorIndex; + if(monitor.index === monitorIndex) + this.currentMonitorIndex = i; + else{ + if(menuButton.arcMenu.isOpen) + menuButton.toggleMenu(); + if(menuButton.arcMenuContextMenu.isOpen) + menuButton.toggleArcMenuContextMenu(); + } + } + //open the current monitors menu + this._settingsControllers[this.currentMonitorIndex]._menuButton.toggleMenu(); + } + + _closeAllArcMenus(){ + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + if(menuButton.arcMenu.isOpen) + menuButton.toggleMenu(); + if(menuButton.arcMenuContextMenu.isOpen) + menuButton.toggleArcMenuContextMenu(); + } + } + + _reloadTheme(){ + if(this.isPrimary && this._settings.get_boolean('reload-theme')) { + this._settings.reset('reload-theme'); + + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + Utils.createStylesheet(this._settings); + let stylesheet = Utils.getStylesheet(); + if(Me.stylesheet) + theme.unload_stylesheet(Me.stylesheet); + Me.stylesheet = stylesheet; + theme.load_stylesheet(Me.stylesheet); + + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + menuButton.updateStyle(); + } + if(this.runnerMenu) + this.runnerMenu.updateStyle(); + } + } + + _updateStyle() { + this._menuButton.updateStyle(); + if(this.runnerMenu) + this.runnerMenu.updateStyle(); + } + + _updateMenuHeight(){ + this._menuButton.updateHeight(); + } + + _updatePinnedApps(){ + if(this._menuButton.shouldLoadPinnedApps()) + this._menuButton.loadPinnedApps(); + + //If the active category is Pinned Apps, redisplay the new Pinned Apps + const activeCategory = this._menuButton.MenuLayout?.activeCategoryType; + if(!activeCategory) + return; + if(activeCategory === Constants.CategoryType.PINNED_APPS || activeCategory === Constants.CategoryType.HOME_SCREEN) + this._menuButton.displayPinnedApps(); + } + + _updateExtraPinnedApps(){ + let layout = this._settings.get_enum('menu-layout'); + if(layout == Constants.MenuLayout.UNITY || layout == Constants.MenuLayout.MINT || layout == Constants.MenuLayout.BRISK){ + if(this._menuButton.shouldLoadPinnedApps()) + this._menuButton.loadExtraPinnedApps(); + } + } + + _updateHotCornerManager() { + if (this.isPrimary) { + let hotCornerAction = this._settings.get_enum('hot-corners'); + if (hotCornerAction === Constants.HotCornerAction.DEFAULT) { + this._hotCornerManager.restoreDefaultHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.DISABLED) { + this._hotCornerManager.disableHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.TOGGLE_ARCMENU) { + this._hotCornerManager.modifyHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.CUSTOM) { + this._hotCornerManager.modifyHotCorners(); + } + } + } + + _updateHotKeyBinder() { + if (this.isPrimary) { + const RunnerHotKey = this._settings.get_enum('runner-menu-hotkey'); + const HotKey = this._settings.get_enum('menu-hotkey'); + const EnableStandaloneRunnerMenu = this._settings.get_boolean('enable-standlone-runner-menu'); + + this._keybindingManager.unbind('ToggleArcMenu'); + this._keybindingManager.unbind('ToggleRunnerMenu'); + this._menuHotKeybinder.disableHotKey(); + this._menuKeyBindingKey = null; + this._runnerKeyBindingKey = null; + + if(EnableStandaloneRunnerMenu){ + if(!this.runnerMenu){ + this.runnerMenu = new StandaloneRunner(this._settings); + this.runnerMenu.initiate(); + } + + if(RunnerHotKey === Constants.RunnerHotKey.CUSTOM){ + this._keybindingManager.bind('ToggleRunnerMenu', 'toggle-runner-menu', () => this._onHotkey(() => this.toggleStandaloneRunner())); + this._runnerKeyBindingKey = this._settings.get_strv('toggle-runner-menu').toString(); + } + else if(RunnerHotKey === Constants.RunnerHotKey.SUPER_L){ + this._menuHotKeybinder.enableHotKey(() => this.toggleStandaloneRunner()); + } + } + else if(this.runnerMenu){ + this.runnerMenu.destroy(); + this.runnerMenu = null; + } + + if(HotKey === Constants.HotKey.CUSTOM){ + this._keybindingManager.bind('ToggleArcMenu', 'toggle-arcmenu', () => this._onHotkey(() => this.toggleMenus())); + this._menuKeyBindingKey = this._settings.get_strv('toggle-arcmenu').toString(); + } + else if(HotKey === Constants.HotKey.SUPER_L){ + this._menuHotKeybinder.disableHotKey(); + this._menuHotKeybinder.enableHotKey(() => this.toggleMenus()); + } + + if(this._menuKeyBindingKey){ + this._menuKeyBindingKey = Gtk.accelerator_parse(this._menuKeyBindingKey)[0]; + } + if(this._runnerKeyBindingKey){ + this._runnerKeyBindingKey = Gtk.accelerator_parse(this._runnerKeyBindingKey)[0]; + } + } + } + + _onHotkey(callback) { + if(this._settings.get_boolean('disable-hotkey-onkeyrelease')) + callback(); + else + this._onHotkeyRelease(callback); + } + + _onHotkeyRelease(callback) { + let activeMenu = this._settingsControllers[this.currentMonitorIndex]._menuButton.getActiveMenu() || ((this.runnerMenu && this.runnerMenu.arcMenu.isOpen) ? this.runnerMenu.arcMenu : null); + let focusPanel; + + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL) + focusPanel = this.panel; + else + focusPanel = this.panel._allDocks[0].dash; + + let focusTarget = activeMenu ? + (activeMenu.actor || activeMenu) : focusPanel; + + this.disconnectKeyRelease(); + + this.keyInfo = { + pressId: focusTarget.connect('key-press-event', () => this.disconnectKeyRelease()), + releaseId: focusTarget.connect('key-release-event', (actor, event) => { + this.disconnectKeyRelease(); + + if (this._menuKeyBindingKey === event.get_key_symbol()) { + callback(); + } + + if (this._runnerKeyBindingKey === event.get_key_symbol()) { + callback(); + } + }), + target: focusTarget + }; + + focusTarget.grab_key_focus(); + } + + disconnectKeyRelease() { + if (this.keyInfo && this.keyInfo.target) { + this.keyInfo.target.disconnect(this.keyInfo.pressId); + this.keyInfo.target.disconnect(this.keyInfo.releaseId); + this.keyInfo = 0; + } + } + + // Place the menu button to main panel as specified in the settings + _setButtonPosition() { + if (this._isButtonEnabled()) { + this._removeMenuButtonFromMainPanel(); + this._addMenuButtonToMainPanel(); + this._setMenuPositionAlignment(); + } + } + + _setMenuPositionAlignment(){ + this._menuButton.setMenuPositionAlignment(); + } + + // Change the menu button appearance as specified in the settings + _setButtonAppearance() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + this._menuButton.container.set_width(-1); + this._menuButton.container.set_height(-1); + menuButtonWidget.actor.show(); + switch (this._settings.get_enum('menu-button-appearance')) { + case Constants.MenuButtonAppearance.TEXT: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.showPanelText(); + break; + case Constants.MenuButtonAppearance.ICON_TEXT: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelIcon(); + menuButtonWidget.showPanelText(); + menuButtonWidget.setPanelTextStyle('padding-left: 5px;'); + break; + case Constants.MenuButtonAppearance.TEXT_ICON: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelText(); + menuButtonWidget.setPanelTextStyle('padding-right: 5px;'); + menuButtonWidget.showPanelIcon(); + break; + case Constants.MenuButtonAppearance.NONE: + menuButtonWidget.actor.hide(); + this._menuButton.container.set_width(0); + this._menuButton.container.set_height(0); + break; + case Constants.MenuButtonAppearance.ICON: /* falls through */ + default: + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelIcon(); + } + this._setMenuButtonArrow(); + } + } + _setMenuButtonArrow() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + if (this._settings.get_boolean('enable-menu-button-arrow')) { + menuButtonWidget.hideArrowIcon(); + menuButtonWidget.showArrowIcon(); + } else { + menuButtonWidget.hideArrowIcon(); + } + } + } + + // Update the text of the menu button as specified in the settings + _setButtonText() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + // Update the text of the menu button + let menuButtonWidget = this._menuButton.menuButtonWidget; + let label = menuButtonWidget.getPanelLabel(); + + let customTextLabel = this._settings.get_string('custom-menu-button-text'); + label.set_text(customTextLabel); + } + } + + // Update the icon of the menu button as specified in the settings + _setButtonIcon() { + let path = this._settings.get_string('custom-menu-button-icon'); + let menuButtonWidget = this._menuButton.menuButtonWidget; + let stIcon = menuButtonWidget.getPanelIcon(); + + let iconString = Utils.getMenuButtonIcon(this._settings, path); + stIcon.set_gicon(Gio.icon_new_for_string(iconString)); + } + + // Update the icon of the menu button as specified in the settings + _setButtonIconSize() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + let stIcon = menuButtonWidget.getPanelIcon(); + let iconSize = this._settings.get_double('custom-menu-button-icon-size'); + let size = iconSize; + stIcon.icon_size = size; + } + } + + _setButtonIconPadding() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let padding = this._settings.get_int('button-padding'); + if(padding > -1) + this._menuButton.style = "-natural-hpadding: " + (padding * 2 ) + "px; -minimum-hpadding: " + padding + "px;"; + else + this._menuButton.style = null; + + let parent = this._menuButton.get_parent(); + if(!parent) + return; + let children = parent.get_children(); + let actorIndex = 0; + + if (children.length > 1) { + actorIndex = children.indexOf(this._menuButton); + } + + parent.remove_child(this._menuButton); + parent.insert_child_at_index(this._menuButton, actorIndex); + } + } + + // Get the current position of the menu button and its associated position order + _getMenuPosition() { + let offset = this._settings.get_int('menu-button-position-offset'); + switch (this._settings.get_enum('position-in-panel')) { + case Constants.MenuPosition.CENTER: + return [offset, 'center']; + case Constants.MenuPosition.RIGHT: + // get number of childrens in rightBox (without arcmenu) + let n_children = Main.panel._rightBox.get_n_children(); + n_children -= Main.panel.statusArea.ArcMenu !== undefined; + // position where icon should go, + // offset = 0, icon should be last + // offset = 1, icon should be second last + const order = Math.clamp(n_children - offset, 0, n_children); + return [order, 'right']; + case Constants.MenuPosition.LEFT: + default: + return [offset, 'left']; + } + } + + _configureActivitiesButton(){ + let isActivitiesButtonPresent = Main.panel.statusArea.activities && Main.panel.statusArea.activities.container && Main.panel._leftBox.contains(Main.panel.statusArea.activities.container); + let showActivities = this._settings.get_boolean('show-activities-button'); + + let container = Main.panel.statusArea.activities.container; + let parent = container.get_parent(); + let index = 0; + if(this._settings.get_enum('position-in-panel') === Constants.MenuPosition.LEFT && + this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL && + this._settings.get_int('menu-button-position-offset') == 0) + index = 1; + + if(showActivities && !isActivitiesButtonPresent){ + parent ? parent.remove_child(container) : null; + Main.panel._leftBox.insert_child_at_index(this._activitiesButton.container, index); + } + else if(!showActivities && isActivitiesButtonPresent) + Main.panel._leftBox.remove_child(Main.panel.statusArea.activities.container); + } + + // Check if the activities button is present on the main panel + _isActivitiesButtonPresent() { + return (this._activitiesButton && + this._activitiesButton.container && + Main.panel._leftBox.contains(this._activitiesButton.container)); + } + + // Add or restore the activities button on the main panel + _addActivitiesButtonToMainPanel() { + if (!this._isActivitiesButtonPresent()) { + // Retsore the activities button at the default position + let parent = this._activitiesButton.container.get_parent(); + if(!parent) + Main.panel._leftBox.insert_child_at_index(this._activitiesButton.container, 0); + } + } + + // Add the menu button to the main panel + _addMenuButtonToMainPanel() { + let [position, box] = this._getMenuPosition(); + this.panel.addToStatusArea('ArcMenu', this._menuButton, position, box); + } + + // Remove the menu button from the main panel + _removeMenuButtonFromMainPanel() { + this.panel.menuManager.removeMenu(this._menuButton.arcMenu); + this.panel.menuManager.removeMenu(this._menuButton.arcMenuContextMenu); + this.panel.statusArea['ArcMenu'] = null; + } + + // Enable the menu button + enableButton(index) { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.DASH){ + this.dashIndex = index; + this.reEstablishDash(); + } + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + this._addMenuButtonToMainPanel(); + } + + this._menuButton.initiate(); + } + + reEstablishDash(){ + const DashToDock = this.panel._allDocks[this.dashIndex].dash; + if(!DashToDock){ + global.log("ArcMenu Error - Failed to place ArcMenu in Dash-to-Dock"); + return; + } + + const DashContainer = DashToDock._dashContainer; + + DashToDock.arcMenuEnabled = true; + this.oldShowAppsIcon = DashToDock._showAppsIcon; + + DashContainer.remove_child(DashToDock._showAppsIcon); + DashToDock._showAppsIcon = this.menuButtonAdjustedActor; + DashContainer.add_child(DashToDock._showAppsIcon); + + this._setButtonIcon(); + const IconSize = DashToDock.iconSize; + this._menuButton.menuButtonWidget.icon.setIconSize(IconSize); + + DashToDock.updateShowAppsButton(); + + this.hoverID = this.menuButtonAdjustedActor.child.connect('notify::hover', () => { + DashToDock._syncLabel(this.menuButtonAdjustedActor, null); + }); + + this.hidingID = Main.overview.connect('hiding', () => { + DashToDock._labelShowing = false; + this.menuButtonAdjustedActor.hideLabel(); + }); + + if(this.isPrimary){ + this.oldDashOnDestroy = this.panel._deleteDocks; + this.panel._deleteDocks = () => { + if(this.hoverID){ + this.menuButtonAdjustedActor.child.disconnect(this.hoverID); + this.hoverID = null; + } + + if(this.hidingID){ + Main.overview.disconnect(this.hidingID); + this.hidingID = null; + } + + const AllDocks = this.panel._allDocks; + + if(!AllDocks.length) + return; + + AllDocks.forEach(dock => { + let dash = dock.dash; + if(dash._dashContainer.contains(dash._showAppsIcon)) + dash._dashContainer.remove_child(dash._showAppsIcon); + dash._showAppsIcon = this.oldShowAppsIcon; + dash._dashContainer.add_child(dash._showAppsIcon); + dash.arcMenuEnabled = false; + }); + + this.oldDashOnDestroy.call(this.panel, ...arguments); + this.panel._deleteDocks = this.oldDashOnDestroy; + }; + } + } + + _disableButton() { + this._removeMenuButtonFromMainPanel(); + this._addActivitiesButtonToMainPanel(); + this._menuButton.destroy(); + } + + _isButtonEnabled() { + return this.panel.statusArea['ArcMenu'] !== null; + } + + destroy() { + if(this.runnerMenu){ + this.runnerMenu.destroy(); + } + this.settingsChangeIds.forEach(id => this._settings.disconnect(id)); + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(this.panel === null || this.panel._allDocks.length === 0){ + this._menuButton.destroy(); + } + else{ + const DashToDock = this.panel._allDocks[this.dashIndex].dash; + const DashContainer = DashToDock._dashContainer; + if(this.panel._allDocks[this.dashIndex] && DashToDock && DashToDock.arcMenuEnabled){ + if(this.hoverID){ + this.menuButtonAdjustedActor.child.disconnect(this.hoverID); + this.hoverID = null; + } + + if(this.hidingID){ + Main.overview.disconnect(this.hidingID); + this.hidingID = null; + } + + if(this.panel._allDocks[this.dashIndex]){ + DashToDock.arcMenuEnabled = false; + if(DashContainer.contains(DashToDock._showAppsIcon)) + DashContainer.remove_child(DashToDock._showAppsIcon); + DashToDock._showAppsIcon = this.oldShowAppsIcon; + DashContainer.add_child(DashToDock._showAppsIcon); + this.panel._deleteDocks = this.oldDashOnDestroy; + DashToDock.updateShowAppsButton(); + } + } + this._addActivitiesButtonToMainPanel(); + this._menuButton.destroy(); + } + } + else if(this.panel == undefined) + this._menuButton.destroy(); + else if (this._isButtonEnabled()) { + this._disableButton(); + } + + if(this.isPrimary){ + this.disconnectKeyRelease(); + this._menuHotKeybinder.destroy(); + this._keybindingManager.destroy(); + this._hotCornerManager.destroy(); + } + this._settings = null; + this._activitiesButton = null; + this._menuButton = null; + delete global.toggleArcMenu; + } +}; diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/extension.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/extension.js new file mode 100644 index 0000000..d101a31 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/extension.js @@ -0,0 +1,307 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {GLib, Gio, St} = imports.gi; +const Constants = Me.imports.constants; +const Controller = Me.imports.controller; +const Config = imports.misc.config; +const ShellVersion = parseFloat(Config.PACKAGE_VERSION); + +const Main = imports.ui.main; +const Util = imports.misc.util; +const Utils = Me.imports.utils; + +// Initialize panel button variables +let settings; +let settingsControllers; +let extensionChangedId; +let dockToggleID; +let dockExtension; +let enableTimeoutID; + +// Initialize menu language translations +function init() { + ExtensionUtils.initTranslations(Me.metadata['gettext-domain']); +} + +// Enable the extension +function enable() { + if (ShellVersion < 3.39 && ShellVersion >= 3.36) + throw new Error(`ArcMenu v${Me.metadata.version} does not work on GNOME Shell version ${ShellVersion}. Please visit https://extensions.gnome.org/extension/3628/arcmenu/ and download ArcMenu v17`); + else if (ShellVersion < 3.36) + throw new Error(`GNOME Shell version ${ShellVersion} is not supported. Please visit https://extensions.gnome.org/extension/1228/arc-menu/ which supports GNOME Shell versions 3.14 - 3.34`); + + enableTimeoutID = GLib.timeout_add(0, 300, () => { + if(imports.gi.Meta.is_wayland_compositor()) + Me.metadata.isWayland = true; + else + Me.metadata.isWayland = false; + + settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + settings.connect('changed::multi-monitor', () => _multiMonitorChanged()); + settings.connect('changed::arc-menu-placement', () => _placementChanged()); + settingsControllers = []; + + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + Utils.createStylesheet(settings); + let stylesheet = Utils.getStylesheet(); + if(Me.stylesheet) + theme.unload_stylesheet(Me.stylesheet); + Me.stylesheet = stylesheet; + theme.load_stylesheet(Me.stylesheet); + + let avaliablePlacementArray = settings.get_default_value('available-placement').deep_unpack(); + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); + + _enableButtons(); + + // dash to panel might get enabled after Arc-Menu + extensionChangedId = Main.extensionManager.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === 'dash-to-panel@jderose9.github.com') { + _disconnectDtpSignals(); + + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + let isEnabled = extension.state === 1 ? true : false; + + setAvaliablePlacement(Constants.ArcMenuPlacement.DTP, isEnabled); + + if(isEnabled && (arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || arcMenuPlacement === Constants.ArcMenuPlacement.DTP)){ + _connectDtpSignals(); + _enableButtons(); + } + } + + if ((extension.uuid === "dash-to-dock@micxgx.gmail.com" || extension.uuid === "ubuntu-dock@ubuntu.com")) { + _disconnectDtdSignals(); + + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + let isEnabled = extension.state === 1 ? true : false; + + if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!_getDockExtensions() || !isEnabled) + setAvaliablePlacement(Constants.ArcMenuPlacement.DASH, false); + else{ + _connectDtdSignals(); + setAvaliablePlacement(Constants.ArcMenuPlacement.DASH, true); + } + _disableButtons(); + _enableButtons(); + } + } + }); + + // listen to dash to panel / dash to dock if they are compatible and already enabled + _connectDtdSignals(); + _connectDtpSignals(); + enableTimeoutID = null; + return GLib.SOURCE_REMOVE; + }); +} + +function disable() { + if(enableTimeoutID){ + GLib.source_remove(enableTimeoutID); + enableTimeoutID = null; + } + if(extensionChangedId){ + Main.extensionManager.disconnect(extensionChangedId); + extensionChangedId = null; + } + + _disconnectDtpSignals(); + _disconnectDtdSignals(); + + _disableButtons(); + settingsControllers = null; + + settings.run_dispose(); + settings = null; +} + +function setAvaliablePlacement(placement, state){ + let avaliablePlacementArray = settings.get_value('available-placement').deep_unpack(); + if(avaliablePlacementArray[placement] !== state){ + avaliablePlacementArray[placement] = state; + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); + } +} + +function _connectDtpSignals() { + if(global.dashToPanel) + global.dashToPanel._amPanelsCreatedId = global.dashToPanel.connect('panels-created', () => _enableButtons()); +} + +function _disconnectDtpSignals() { + if(global.dashToPanel?._amPanelsCreatedId){ + global.dashToPanel.disconnect(global.dashToPanel._amPanelsCreatedId); + delete global.dashToPanel._amPanelsCreatedId; + } +} + +function _connectDtdSignals(){ + dockExtension = _getDockExtensions(); + if(dockExtension){ + let dock = dockExtension.stateObj.dockManager; + dockToggleID = dock.connect("toggled",() => { + _disableButtons(); + _enableButtons(); + }); + } +} + +function _disconnectDtdSignals() { + if(dockExtension){ + let dock = dockExtension.stateObj.dockManager; + if(dock && dockToggleID){ + dock.disconnect(dockToggleID); + dockToggleID = null; + } + } +} + +function _placementChanged() { + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + + _disconnectDtdSignals(); + _disconnectDtpSignals(); + + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + _connectDtpSignals(); + else if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + _connectDtdSignals(); + + _disableButtons(); + _enableButtons(); +} + +function _multiMonitorChanged() { + _disableButtons(); + _enableButtons(); +} + +function _getDockExtensions(){ + let dashToDock = Main.extensionManager.lookup("dash-to-dock@micxgx.gmail.com"); + let ubuntuDash = Main.extensionManager.lookup("ubuntu-dock@ubuntu.com"); + let dock; + if(dashToDock?.stateObj?.dockManager) + dock = dashToDock; + if(ubuntuDash?.stateObj?.dockManager) + dock = ubuntuDash; + return dock; +} + +function _enableButtons() { + let avaliablePlacementArray = settings.get_value('available-placement').deep_unpack(); + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = false; + + let multiMonitor = settings.get_boolean('multi-monitor'); + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + + dockExtension = _getDockExtensions(); + + if(arcMenuPlacement == Constants.ArcMenuPlacement.DASH && dockExtension){ + avaliablePlacementArray[Constants.ArcMenuPlacement.DASH] = true; + + let dock = dockExtension.stateObj.dockManager; + if(dock?._allDocks.length){ + let docksLength = multiMonitor ? dock._allDocks.length : 1; + for(var index = 0; index < docksLength; index++){ + if(!dock._allDocks[index].dash.arcMenuEnabled){ + let settingsController = new Controller.MenuSettingsController(settings, settingsControllers, dock, + index, Constants.ArcMenuPlacement.DASH); + settingsController.monitorIndex = dock._allDocks[index].dash._monitorIndex; + settingsController.enableButton(index); + settingsController.bindSettingsChanges(); + settingsControllers.push(settingsController); + } + } + } + } + else{ + let isDtPLoaded = false; + let panelArray = [Main.panel]; + if(global.dashToPanel && global.dashToPanel.panels){ + panelArray = global.dashToPanel.panels.map(pw => pw); + isDtPLoaded = true; + } + + let panelLength = multiMonitor ? panelArray.length : 1; + for(var index = 0; index < panelLength; index++){ + let panel = isDtPLoaded ? panelArray[index].panel : panelArray[index]; + let panelParent = panelArray[index]; + + let isPrimaryStandAlone = isDtPLoaded ? ('isPrimary' in panelParent && panelParent.isPrimary) && panelParent.isStandalone : false; + + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL && isPrimaryStandAlone){ + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = true; + panel = Main.panel; + } + + if(isDtPLoaded) + avaliablePlacementArray[Constants.ArcMenuPlacement.DTP] = true; + else + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = true; + + if (panel.statusArea['ArcMenu']) + continue; + else if (settingsControllers[index]) + _disableButton(settingsControllers[index], 1); + + let settingsController = new Controller.MenuSettingsController(settings, settingsControllers, panel, + index, Constants.ArcMenuPlacement.PANEL); + + settingsController.monitorIndex = panelParent.monitor?.index; + + if(isDtPLoaded) + panel._amDestroyId = panel.connect('destroy', () => extensionChangedId ? _disableButton(settingsController, 1) : null); + + settingsController.enableButton(); + settingsController.bindSettingsChanges(); + settingsControllers.push(settingsController); + } + } + + if(!Utils.getArraysEqual(settings.get_value('available-placement').deep_unpack(), avaliablePlacementArray)) + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); +} + +function _disableButtons(){ + for (let i = settingsControllers.length - 1; i >= 0; --i) { + let sc = settingsControllers[i]; + _disableButton(sc, 1); + } +} + +function _disableButton(controller, remove) { + if(controller.panel._amDestroyId){ + controller.panel.disconnect(controller.panel._amDestroyId); + delete controller.panel._amDestroyId; + } + + controller.destroy(); + + if(remove) + settingsControllers.splice(settingsControllers.indexOf(controller), 1); +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/helper.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/helper.js new file mode 100644 index 0000000..9dbc4d2 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/helper.js @@ -0,0 +1,227 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Gio, GObject, Gtk, Meta, Shell} = imports.gi; +const Constants = Me.imports.constants; +const Main = imports.ui.main; +const Util = imports.misc.util; + +const MUTTER_SCHEMA = 'org.gnome.mutter'; + +var MenuHotKeybinder = class { + constructor() { + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + + this.hotKeyEnabled = false; + this._ignoreHotKeyChangedEvent = false; + + this._mutterSettings = new Gio.Settings({ 'schema': MUTTER_SCHEMA }); + + this._oldOverlayKey = this._mutterSettings.get_value('overlay-key'); + + this._overlayKeyChangedID = this._mutterSettings.connect('changed::overlay-key', () => { + if(!this._ignoreHotKeyChangedEvent) + this._oldOverlayKey = this._mutterSettings.get_value('overlay-key'); + }); + + this._mainStartUpComplete = Main.layoutManager.connect('startup-complete', () => this._setHotKey()); + } + + enableHotKey(menuToggler){ + this._menuToggler = menuToggler; + + this._ignoreHotKeyChangedEvent = true; + + this._mutterSettings.set_string('overlay-key', Constants.SUPER_L); + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP); + + this.hotKeyEnabled = true; + if(!Main.layoutManager._startingUp) + this._setHotKey(); + this._ignoreHotKeyChangedEvent = false; + } + + disableHotKey(){ + this._ignoreHotKeyChangedEvent = true; + this._mutterSettings.set_value('overlay-key', this._oldOverlayKey); + if(this.overlayKeyID){ + global.display.disconnect(this.overlayKeyID); + this.overlayKeyID = null; + } + if(this.defaultOverlayKeyID){ + GObject.signal_handler_unblock(global.display, this.defaultOverlayKeyID); + this.defaultOverlayKeyID = null; + } + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW); + + this.hotKeyEnabled = false; + this._ignoreHotKeyChangedEvent = false; + } + + _setHotKey(){ + if(this.hotKeyEnabled){ + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP); + + //Find signal ID in Main.js that connects 'overlay-key' to global.display and toggles Main.overview + let [bool,signal_id, detail] = GObject.signal_parse_name('overlay-key', global.display, true); + this.defaultOverlayKeyID = GObject.signal_handler_find(global.display, GObject.SignalMatchType.ID, signal_id, detail, null, null, null); + + //If signal ID found, block it and connect new 'overlay-key' to toggle ArcMenu. + if(this.defaultOverlayKeyID){ + GObject.signal_handler_block(global.display, this.defaultOverlayKeyID); + this.overlayKeyID = global.display.connect('overlay-key', () => { + this._menuToggler(); + }); + } + else + global.log("ArcMenu Error - Failed to set Super_L hotkey"); + } + } + + destroy() { + if(this._overlayKeyChangedID){ + this._mutterSettings.disconnect(this._overlayKeyChangedID); + this._overlayKeyChangedID = null; + } + this.disableHotKey(); + if (this._mainStartUpComplete) { + Main.layoutManager.disconnect(this._mainStartUpComplete); + this._mainStartUpComplete = null; + } + } +}; + +var KeybindingManager = class { + constructor(settings) { + this._settings = settings; + this._keybindings = new Map(); + } + + bind(keybindingNameKey, keybindingValueKey, keybindingHandler) { + if (!this._keybindings.has(keybindingNameKey)) { + this._keybindings.set(keybindingNameKey, keybindingValueKey); + + Main.wm.addKeybinding(keybindingValueKey, ExtensionUtils.getSettings(), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP, + keybindingHandler); + } + } + + unbind(keybindingNameKey) { + if (this._keybindings.has(keybindingNameKey)) { + let keybindingValueKey = this._keybindings.get(keybindingNameKey); + Main.wm.removeKeybinding(keybindingValueKey); + this._keybindings.delete(keybindingNameKey); + } + } + + unbindAll() { + this._keybindings.forEach((value, key) => { + Main.wm.removeKeybinding(value); + this._keybindings.delete(key); + }); + } + + destroy() { + this.unbindAll(); + } +}; + +var HotCornerManager = class { + constructor(settings, menuToggler) { + this._settings = settings; + this._menuToggler = menuToggler; + this._hotCornersChangedId = Main.layoutManager.connect('hot-corners-changed', () => this._setCustomHotCorners()); + } + + _setCustomHotCorners() { + let hotCornerAction = this._settings.get_enum('hot-corners'); + + if(hotCornerAction === Constants.HotCornerAction.DISABLED) + this.disableHotCorners(); + else if(hotCornerAction === Constants.HotCornerAction.TOGGLE_ARCMENU || hotCornerAction === Constants.HotCornerAction.CUSTOM) + this.modifyHotCorners(); + } + + _getHotCorners() { + return Main.layoutManager.hotCorners; + } + + restoreDefaultHotCorners() { + Main.layoutManager._updateHotCorners(); + } + + disableHotCorners() { + let hotCorners = this._getHotCorners(); + hotCorners.forEach((corner) => { + if(corner){ + corner._toggleOverview = () => { }; + corner._pressureBarrier._trigger = () => { }; + } + }); + } + + modifyHotCorners() { + let hotCorners = this._getHotCorners(); + let hotCornerAction = this._settings.get_enum('hot-corners'); + + hotCorners.forEach((corner) => { + if (corner) { + corner._toggleOverview = () => { }; + corner._pressureBarrier._trigger = () => { + corner._pressureBarrier._isTriggered = true; + if(corner._ripples) + corner._ripples.playAnimation(corner._x, corner._y); + else + corner._rippleAnimation(); + if(hotCornerAction == Constants.HotCornerAction.TOGGLE_ARCMENU) + this._menuToggler(); + else if(hotCornerAction == Constants.HotCornerAction.CUSTOM){ + let cmd = this._settings.get_string('custom-hot-corner-cmd'); + if(cmd == "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else if(cmd == "ArcMenu_RunCommand") + Main.openRunDialog(); + else + Util.spawnCommandLine(this._settings.get_string('custom-hot-corner-cmd')); + } + corner._pressureBarrier._reset(); + }; + } + }); + } + + destroy() { + if (this._hotCornersChangedId>0) { + Main.layoutManager.disconnect(this._hotCornersChangedId); + this._hotCornersChangedId = 0; + } + + this.restoreDefaultHotCorners(); + } +}; diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..f06173f8a34144617298f671be8f917e5feaaca6 GIT binary patch literal 3183 zcmai!TWl0n7{`x_s09)5#zp0L2ihqrQOQyZ+Y3->Y13_un3y=bdv-grJG0E3Z7GQ{ zy;3(ZQ6fI*g8@={u?4oJEk)leBb~3 zW`Ewi<{U%YgZ>oy7xyq$53aut540_77`q?b3O)+%04u<~;CiqYd>A|mJ_sHM@ndm3 z9s<+gCh#P<790TAfrXG?f*j)u;M3p_A%6j@F#a1PJ5_K3uk4MG`$4+*AV}-S!ufZ> z4H&;4jx*o`7@q{60DHmh;AbG6n*#A;^LRW0eh=;de*&Ke{|M(d!g-31huj5{-PgdE z!3aok#Y5U4`Fk29KR*VyfS-b--zAXlFNWjq!tsybHss(Ih#&hMmyo}Ifu#2aI6?7k z2Ok4>gXGr%Jjm`5koLtu%I60l+4%^392^8GA76nK-xT-)cndrV-UbhVQ8>2|>;uW( z*>L;~NOrG+Pl7i=9AUqO<3B<2V=W#uzX{w0ZUgs%4d7PrRJeW?Bs*V&RD-i1>G>;I z39f^vo543hOtH5?^1l-_z%)qq&Vf`vS3uf#6C^(s_&RtSr2JMQ81idBNc$T=iZ6}_ zWY;+bmKx=(IvkOHtJ{m1Apa>Bt;#MOcU`B4TkxI7g=ZxNr`hm2 z?a3jt+i@)^Ja)v%3Z}!P2RH2`?;v0G$b+w}S)`uuUR#={BD^NnWu;_o z6|bq6ZiX1m=%Eh07W+IY!n}s>T1_n&J+ypUOg*}jR~Y6XyXdya zg3(|~5#h%hqwPjZtI-hUM_MB-O_lGp9&4;;Objg_XiO37%s%oX*EUn(bZ-97^I!05Lsyj!(#ZyL3tsqZ{W?~0J=)R(w!WHL9(B)*RIhZPjvaN7QjZ#oJ z*%#QFL4Nv15qsgl=VDAm2&nmR8G3 zVfi(vl5&$;SuKRV^(yj-Jci#?P^)*;aS|n4@CUe}7yOZot1DE*L88h^Z-tAc%Vtp) G6YL+~Zh#>G literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..11c483bc8d12d3edd1091dc897c3e76735401a3c GIT binary patch literal 33098 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 bg38J<;1*dio7I~*U4ZTQ-yMhl355Rv7oLyQ literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9cb7eafac41391303fb34b969920f40ec8d065ff GIT binary patch literal 3558 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 PchBtbRycn~jcfiFBWlMC literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..178df95ec02b68b8df26bfe0f766e7b3ba728a46 GIT binary patch literal 22694 zcmb7~37lO;o$n7jgeC0AriVZXi`^t)5gGz?RzlM0Cfx}bTsVF2>Aoj-IhT9x?QmNM zkYT`?F%LHsjErVbG``7$=fYE8!i;v>l~Hh9Mn`ePbzE>jW=34!_gBlgw>#na-u-;4 zzo(W{r|Mt-`q#gz`l(|Nyf@%?^L{~a8hqd3LGUY{Uw)EOgW%UM4T8Dw1$Z<(>}587 z3Ot_pdGH{36+8y6fO_?McmzzL>V3WA{qQ*AkHQ1s7hL>HF8^tGBb(f+{k8BF@FsXEybr3rC!yN;HFzle5mY;W303aEGi*Hcja{uw+3J_}EQFTm5`@$+my7DKh?YA88e2PMxM)O)wW6X9J@ z@_PUt2p@)r!H+_H?=dL3d=aXh--HLlA41jlbEtm)4yybybnYnlQuq?s16AKjsP7Cx z^>Y-e9j}M#@10QXzXz(`olx@L4UdISLe=*J7yms}JB~(3lJ`kahX=xoq59hg)!x-m{d+Z3 zeOsW~`9`Sr-vcGj4?@ZFQKx;@851;XP3GyaOWA;6qULKLPdr^HA+M>O7~nQ2p(3yb`Ki zgHYvebn!A&{ac{wxfQD3`=I2%3myi)3J-!$x%dyD`tyv7A9B8x=P^)vaSEIR&w*;k zg)V)$i?4^0V*yHUZgKf{JKhTqC;dUF{Dq4t%+7@8MAK z6QJhfX;6CJ2M>o=LCxbeP~-n<7q3Ho?+z%t@)oG_AB0E1k3!Y+DJVI921-6(hwAsg zLdoeFsP8`yHEzF!YWG|QU+;x5f(xPA_g1Li72M|1KLl0&V^DJaq)Y!alpg*gJPLjvN{P|Gw>WAv@4N&7-aq%}m$@^ZY@*jZe-)^XKpLg-6p!)SwC^`HZsvr9= zwCy+&_7M-E>bViBA2&m_Z^H4z^;_^z_zcwe{1;Te4_<7)dn8o+WTJO-W%_5S5h{T+mo%PZkrI1bhSEiU~w zsD5mPYWMw6@_q;&3wJ@4|1y-__y&|bo`sUz{ukQ!4~1&y@lfA86G|S7pyYOm%kPJ3 z_mGQU4^`h7?15XLOJ4F51vYVHB>uesBul< z3Ggl`J$biF|0GmDo`m||x1rkcZ}0^8J19GF>?QVlmq4}S3Ml!lfG5JWQ0*x|wLgI> zcQaJENvQFC162FALR{2f2UNMwLCOC~sQx|;HEz#CjpGYY{XFCqR-aFVYVRpf-(3Jz ze-D&?T;}4#F8{Sq?TF#=u;TazsQ$jgHE)dr)c;97KKA(lh5q}D*|Ib17_b7~u*0q;8UJBLE>!8;6o1oU6+o9h7 zTd4Lu3Z*}f!3FSNpz1r|a$Dc=@Fe0rFoY}Msc;M~gm*wpUGNd8{(T=x?muz-4Lp_j z5m#8h;2fy@DqIY2gR(0hhLXdhPwd<56cAU?5ya=ivOW-MR1w0Gh z1XbT(K#j}WU7Rvq?`u%{`5mZozk(W{gRiuDe+1OLI??fLDEVCi)xK+?ku%i$ zH$k;CgR1vVcrtt!RC_)O)&Eb!m%^_?&6{6A&9gs1l|S?<`<;1E^!99y3zR->gD1idLdoIpq4e|z@J9Fo)I8a6wQcun;C$j$sD8f~Uw@ZH9XF&xev%KUBZQ z;F<6acrJVhYTTZHYWLGn`twI9eK=&fmE);U?dXRpzY(gPB^Pf%_2W*c?>qq2o=?ED z;OC*_^$gUw{1K{s^H`#$?3;X^4Wit{oV;s@$;eDcO{g5t%K6z8=>Tyz=L25sz0xT>c=~w#(5W%9(@ZQ z0)GhApI^ZF@PKP<{pUjEUk26xeyIA_L&@i6?d@;L@24B^@EFt`dT{W_?5Fa{;R+g$v9C_VZxlpMe0(w~8P z?~rvi|1_xgFNLN)D7_hjYTp)kB)l8Wf%ihm@4b*I8$1g2{%@eh{kTEfpHrdweHK*y zLa27EhLTSL=fc$SHmL91iw_7+W%Xq z@+WMxc3>fte%=7353hl0-#C=MXDZ?GFe-rBcyP&@JW+;8$1|^T(Q1v|S@}Gn!68|<-JAMTv z|D$iP{W}w?f9FEUeX)z*;21&4Yco{4CZVw#Q0==H?gzh1IFN@iLRkr2zsq?3IN^1K zM+g@aP9o@+5z2&55dM?kf3n#VF7jbmr_M!$lL==LUQ3umP+#Be%AG`9zn8+_+Q;Ct z@a4om1|CbjTLYVy3?v~O(S?- z=V1fy{oW_Ql=wk}f981s{2%ZdsNeT2f>%0voXW$=gtrs=2#*r<`vqYqp^x{!qXd3G zw+P-0=aIe@R$ba+;>Yv+-w0>&{1p5QVGm&;asB?9a1r4GMfg=nUtk}DH9RjPXimSM za30TBLfH!amJru(e|Q!wz>5gOgeQr=66$w~;|R~1r~2(C{1u_Di2JRCpC|MZ{+CPp z8^)U=YJ$z=hB2*x}J}v%)b+VBjEs^f8_G| z;rraPa1?p5=+Y`MB<%pWfp9kA1mY_QpXT{WI0%mx>SPtb2AX_pZ$;rS|fG_1iC zt|crdJWlvE;ds)oCamN6LV|v8A$*c>KH)aP+2nr^E{E@hLxhWYzJM@7@W0pad_7^9 zgg^6%@Fk>;x%eyKRqnY4?x z%72sipA#-2eiuBH@HN6J!hHn)yU>+?mrroq=(x${D|$4~lkipW2*MEIm&9*YrhfB_ zVKr^U9cJO$sGYW&;mDRaDrdp`EF6eyEti@F3+87F!n77%pEk-_Ju1ZE{9@2Q${Rs{ zp_xoX%~;vjq!V$&ro`dWs8Aknq^(*pT$WbSJbgxFbu+HMXi1Z~l7{YGP0~!_EF9!> z6G^-!=r7WoA|GmH&9oX0m(oVFpvIB5JRXZ$m1ejhiyPtcq!AaIX@j>-<^Z*a{q?$y zMfg7stCQe`@MRa(N#*MW2QhB*P}*62g1ZwcgDoG*Ii*&3~aZS{N`|fbuY$mmFm+KNUml$qIC^{O4jhLj6?y7A?C&!7X(u!#$ zMTQ#bcq6K+mU=0of5~JVF6ho#5H3SE#?wZdGK@#188>P)Y$6V5WVpIkR6FU;T3)Ys zMXA?gdRZ%&LcS+fBUjwgjBA-BGR9l0)(sApVW%!mT(xk!V`Q%CpR8m!@b~ zmC{1EEUqyEaWPohNV2m1Vn<|48|juTHs7QY8yPZ6kVhr;e440nu3T?#Z?M!VGlKWS z=Te4qtsQdu?8;_=QxDC@&SQ9XRIOhwt@YzNBX@0*HGS!J=nRlV>UGUZZKRFRI!U>z zS&8Kt!>v&x2R>nh*6g70@pKH+i;{5SL1M9R7D19wces$9%^IBcng!azJ=*B3C%`=4N2ABv_V?v zbZA*4mQ`OKXXR#E@0iqO%?1rqkosgD3ll7lvXX4sa?Ep>+rJs9ac*2{G@^lw zu#sovZw|@G?)|DwezAA0)eQV9q(2#e%j1c-lGdeAJSGJuieJRq z`KTx@Gd5&pBfhz%p|Kxwsb*mMv2c9OCFK$tX<%2-1)tGT=}xV~g+^MbsJSeKMU3Ux z82aCpk7gE1qv98&2?P0KDGo3^O!eWC3 zD}4I)ch6^Ce;^#gV8_M2U`4gwY=_7%D+McRM*PMY&2&!kLGopm$w6RgD2~U?Jk2)D zjFXuxK4XS{%J?=*NfwSVH#Ln>XRRTb_=>LQ10{^X%vMHW z*2HK5ldTK!OYcoYG6&Hj!_R2Ep7}veq=@;ZmHw8 zIXL^}Ooq*ptz2DIAz8s(Tk^TQSE-ITaaH8Ypa$k6T{X>qn^M*@awQS*N`{*kjq6fj zhT2(3LW7mix;I+CY{FXg(mi`k@_EBmblB!)!Ahe=8p2A{sufDPes$$kai5#vL|Q?e zjl<)0u&WHVq1OGb_f*wtzQQ2%jI?TTu(FcWy_oxD#jqCmxmhV~`h<2SKYzeZUY9uH7CIO8Zjr6f>7UCR zkD0u|Dtu_`QfqDpt72BGsN&hN%d1kfP0D8^#)igda#CYDRECH2vI|(Z!{Smp1=!H+ zy&W>!DmMV#UTI*~K>g7;d7sO~jq7Kgw6z#vaWaMb0y}>kW==9UwT!=FRNf`zGs4DY z5Pec;3Xh>_VHNw`h%w`A4*S=x4YO#1+3ySX&KZ&2N@|5ltH{nxw%nGe+f5W^0TZyg zhS9-J50_#JIIkhCx9TB-PcC~8x#WI(w}KTE%`VlwHC`Ljv0!aH)-->@;TCIi$oEaO$5>t- z$FZtKzFLWrD)}n#`_Ek)FO9*T-;xvk%A2l7oocfsLin>p(WA}XUvRZVnLYUS)>0F!Fx zk1e6o0{lJA2BZC^fIZf*1%|z4H#wa$cD*%;PUGBKVUjQ&O!K-;3L_R>mT#jaZU;WE z^X5GC-MXv;2{zT8sd#lo)+j{427xW7kc_n*x}4sw6uH(qpx}?T2+PXd2kTO2 z`k0>U(pnFtF~+#%D7fulCNH5`Qf|y29292UE92%F!Qj|fFsS9pId(R(GOcLiiXvNU zY)ZJzfGxog4mA?Cx$V%e89M60YICe)x4mwck|&!%=v3)Tcg7|dN(%CsG9K7vrFomI z`=`|WFlR_sjDmi%>K}CIVrN^PLQ{Pchte%{OMP}v&Na1@&+q4`)~T1sOs};=4fJ&_ zMmJ>S*xIj;3v%J@3cfzBYH+Pt&d;INo1+<-(Oj)b;>4iI+iZ}~Q@`c#1+JQ%!-ve` zXZ||N#m118#_UaHqwGG>tHrQPpZ-|WY#*b{nU}y?7KhL;YR=wpRy4u*v5j#FGKv2W zrmw3sM|Tp7mK$HoC_CbO)NN6;Pc63*SxmcGHydaF*yV$EW~a;C*Y3(?8S{`yd8~8j ztL~(`<<*sE*YA|Ps~u6z7%BHItBtdYds$aoNmqgH1E1VucYZ-9?p2cyWagmBF*N5P zD1+Yxxw-DugYwq%4ZBpaFBmQ*EOlN==0HJ-_JEby&@6RD_tgqllo2bjnsjZDY`|oFx~-wGpr!(Ygb28`pAPEVh3Y|{d3FiBT=!E zKbl0Bt^eGWXU`@xolW)zxhL%({0z=>d_o^7xPtm)&YZPc26oZ&qaTcowf(HDX4BBj=7Bbvy{Q@g`+ z6lwPsCeID8DC+TQ^OuAxdA~N^!oTYoiKA*?xT?mEq<7h5Tqq?`p4k@`vN;2*2Uc|2 zzo>WNoMr6#u%?TG?6bq#6-zE6 zX%R__&%J!k4Lx=<$FkKI4yD@dg%|cN>|HcRS5%xgOmCmsx$j3bbAA?1eX@?c*np&y zm2~>CxTfM+xV{rL<7Mx$Y7q-oR7fW%MI+Pc?dCdb5W8Mw-WAh&W%`ZfR?uJOo+9NK zKCDmQpXg7#Ic`$((x@>Jg^{wUqLha9bTTTEVct-!EK3uSE9Wxv@|0E^%k4a0HS_vD zN(_-x;;bp$vlaIw&GdEBl48{K3@0jRkv^K$)7JF%=ALbPwstb7b{9(NB)P5W$ILxl z1+Cfka))|Y*wN@Tc>t%!mRW2D)X&3*r0KyJVH$h zw4+$uv#r7y?b#ZK6JcEkw5|NbxEyR`aLu1W2|p`ulalwD5`{I>Bx#UuNU$-U-p&cB z#MYeJJ`ru6+F2lb?~>stn_JRLjc78irQw8^ezkWWjhMbqo^)8oKyX2pB;mZgS#^7{ z)}BX4i)^krLo39^*>`BPv703lhUDp*`RrZN~v?KGgCW@ zDqavDYlo@82 z(6;3%V?`sgre<`o$xNMgXz$vjz**14q`8$dFUGV&wuphoVyddCoy>vhhr?PtDhn_B zxtVwJ@z6LN4`(S(NjPCFo@|0$_qBL+aywR%qcUTo zy}qECT^7jPy^N%8%fB4IptfgQIh=7NgLdrMCX0B+|Hqr=3_*(JU)|^ziXeaTO=9`- znc-xLGPAPK%)uh}T@mWvdCJFhQbSrOq32V(C(_MR+v&X#P#srR15};bQB1IW&ORAu zK#OI&&NOP$up$F5we+f*XH9QU>Z~&pb_V(v*oPF|BD}XieW88%20kwyi_16x+}vtu z;(UQ)b$8*Ie>!DVttDo@P^7ITO^Y!rG5W&QV~Z0lDuaqFmwZhO@2{Oop?-(+Ge zf=x!MXpLXWYKUgBr=iCEX)q?7Gf=&CNQ^V_7Jh>&P~JE{wu~iG`U&v{?^pH1uHD9GX4xS{V~Jbs)qCCXY-hJ z?K&&gWKkxwjMIxTVX-0NO+ndAT*x>9V7xUY1+TmEj|Y+Syoo9?Dw{p$eR zKb@7B3-@TW9X7c!3ddSC&2=!&I8~xvTUS?kJ3Ic=3pAWVzNTz?MM~4P(&VjkZLVWA zql|&@J=Rjp^+S~&M!3#0I9*mW#%vn3xxlN>1P&joeyxnP*uh#*$JuJjbaFM%9u1}F zvV_JU`I$4dbN0O^wI;l7-nyrjFNG1cZv*v_zPJo2Kh(oU&v zlNFnb(H6Ip+R~aSR75OBO|ADo%X+LZ_n&@E_g9`qB0Jpur`4>si*atkl4M?Es?N~Z ztj_&6BPvauoo6P1(dTRe<5%8iq0}rf_@y>?u(Lm5T{07GC@nY8gM>CPh26ZBRgBC0 zdj;R_9zxEn%>AfzYtOch%U7S;nN_1;&ztZS=!>HtY<5qm;&!+Dvlp3bqDq;oQoO{- zUvzqN?&8B}Z@FN_oKUSuTQ6c3X?R zI_+B2%ucHv46>s@^F6y%EVx!;bT_El61Za)d6nqCtKC|;s@x>Amu0D8lN7m&RH;ue z%+7Nn!k-E@O-$`(;gaQ%*EF@W)-m9wgP2GTx!IX+cRN%0@71a8+GcsVM0lS2a1uH; zc((h{aa6q@gJWn_GHrF)?v8h%nQRKM7+U|;Z{DSZ#yobP0L)6XSF>igw7H=U2`TbU zy7k}l-Ghyq66|hu{$h*IzM|zLFK#dFqbM@rx8>3m0kE!MC~$0@qUJJGi9rM9TH9)&YC->o-?ro6Jri(!b&k zvDTUcripe%p0ROkv@mlDQgl8;6z=;<*t^S8$F$7#nN}Jj;e0YMHMnrYtT0#24AO3J zQ&cU>fx{&%q4NCaFy26LO(il7vF(}>lMC9eP<@5tm)aRf375lYQ%CE#LcS%b;zclr z<>$%!^Ujx@yTfLuhQxvmOzjMDOM3aHF4uVDJ8Idq2M=zB(KkQI@|?Z4wcg=$x5@d2 zw~S!isn3j$=Y!IfuM6fs`C{G#JN;`>(YLPJY4{p%PdX~={9%7Ipvmpqyngl}WY_c@ z(3wCkAQKxgj+A*E>P-EvNZrO+O40r7_iDSfQ=5^IThrXw(nI-A!5U5#bT+s%thUhw zv-TQu>f>qFGW(Ar|L=sa=3>|*jHVZk-6;%F4CGaKfy;{s3tjL}Og*Thl z&gnDnFdykGdXp5~Re0{C_`@o@GuC=*4`f?zuWVLej=Q>|nkU?ePi=4Tv8vyN7|$%O zXB=@%&N`=(_Lz)Z86Ye-0&ey}vDyUrDxtr-RILhW1 zn~N*t&fGf%ufox?xoD)#4K^BU%SsWE=9Ue=PBE`d2W8gxWo~9{S2k#Na}wZam)AT- zRaQbRmV#I}2OSaHO|+44%9h6TLkCB*O}u?Ev|hIH1l(b)Uzg~Ly-;DvGKUXlfpV{P z&J(<>yBCUlHE~;cu1BO-spRQKO#J6U7i4*1|((EU5&GXklvyLxlJqn7^*t=lY(d~>W z)V0Iq+F2_$-PO@+=AP}sBG1iV-t5a5cb1=7bAkm9W!4GkPJiuh?W%K{+x(}#)V&k! z9>(t0A_m0b^ZT# z@?ig8U<3d5$NtIvw*W?2{{Vnr;AxhoTt+UF)yR49_CE*I&R+jUCsXEt3oK*axv=5i zCTOxb0KuCpbH&!#Tw?W&5i*-LbJT5?o7rhI{;9wn$99y=`X#}}2D7%@gU?#x0J{5@ zWO>?bn}ZemZv|#C?JTh`y1>#ncJ2}O%$#(u(TP^adG9{iaQ}Kx)IUy+$U$xJYy?tJuYkdr7D zC@3fbvbe5-2#U&zE-tH}xF~`;-auSjmDOceWDybYx~!~=yTbqdopY+XdM5Gl`S+7E zZ=Fk>I+yQ!=R03jp4@Ne_j~-VdyVHE4x6v@ydz%gd5<2fRL?teuIKFyd*D9sY!@Gf z2M~`T#l3gIUEsBFUw9)t2!0GwrT0as`oHD)4BVgiYvy_0PH+xX{1B*e1-K_X3(kS( zLOnl%s`qVBb4nNwK_u=lumq4|*8>-w!sCHcg`RBc#KRdzu;U4hI z@DTVgoDF{lkAc5|YR~>ebpJxAexD3?gDc>nuooTy-wf4{%c0tT9aR5rg&NoUq3(Ma z9ti&#YW$vqJHtQ1S@2b;=gpdL>pKvtoyWjk;bN%zPJz3?)lmH%fVyuO?gi^mQ~Oq^ zdT)Zd|D#aP{UlVszX;W?A42v2-=X^R3#jMpa;zQyIdDJX3!&;=;o@81uEfhw<6n2_ zmqLxtbx`B+3D^(60QH<#pvuo$VB5DJ)O;TfcY!BC-Pa9OZk>w{LG?3)8t)kDzAK={ z@n)$0-v%W&pN8t^SD@;90`3Zb3Du7mq3YS=I6KaVK;1tdYW_}wdfwSk@^B$UG`uF% zeK$kR=O-Xj=Y1LO2A_ty?*+#{Ks|Tog|@wWK#jxEQ02Rz+Iuq8bIyVq?~9es)z{1@Qv#9x8Bf4A4$@`pmrXE#*4&VsYxR>uHJj>e$MT>;g<8=;=} zVK^H;2qljXLyg1ZQ0;yhs-1ft&zgqE!Y()jHU95_>ep>h_1z15;SZq3<=_)+Jx4)A z&pQ#S{_~*jzZ|MvH$lzMolyP0&+%Ju58^+DD))?w{~oG-HA?mD237A|D7oo_8izMQ z$=#@n*P!|{?&3E>jq5FNPxx^-8-5n59S^wl@4EDVgKFoqF8?K{@!gd{QTkzUPxyMr zn-Xuh&dRM#nolyO|2dW?UyZ98;I(`IdT|5U>|F5Ce|I1MF zvBx4CKN9Xmd@+p#X`52U3d)_zBeWpM@&-d#HB)5vo70 zLXF#AOYHhQ1R|>5=}_qvsPavy@t$z$S3=3_^-%SE3~IbS3)R1`yY%ls_3H_!@-IM* zpSRTZ{~)M&KiX7f+}Bv>gQ!p<*sq@+o1aODX8)I0#tjy3ipGL!fyCesP-Rv zqOI>JsQ5Cdc6K}VKs|R2RK4dzl`BI%zvegr^}MU0#^bM`o_7<}`2L;aXI%b$a3|6q zg!{m+LACP-j!#0>|2))uzXbK%{ZF!TbufG_@%d2o9Ou$cfCmtNgNtu~TCW#Cjc?+3 zE!>~@N1^25^HB5kAXNXq3-$aTy7*I$zkn+L8>n&l15`b;mf8Lv0X0qwpyqcO)Ohr{ z^Z}@PFMt}CQK)rNgDN)(=fJl^jo-~K{VpgybT8C+eHZHfC!y+l2CDtPgKGb)Q0>_D zWIJvLK#lJqQ00z+DtDrbcSF^?78c<7P~&zDR6A~mYUjOB^ZXU4`W}JW?;eNRw_k+1 zZ_iUK=feYtp9b~Z&CrJd)O~M<8mEsyJ?9^w#^GyF&wB)FoPPv0?$5(H@I|Qp@4npD zyO-k;@G#O(fNJL&cp%&ibzcQap5ErtZ-eT`=b)bV5L7!Jg)0A3DE;vg)Oa282HOrF z>iG*@d=XUsa;WE>;quRc>dzaY+Fyh!SA&|jCRBT`fJeexp~`&;YCgUW)&Iw#bVy{&36eN32TnmLp|p%sB&L~hr@5U^rxZf`A?{J@4m|3KMx*8ya%dXZ-T0S z1Zo{$3^l)3KwKg{t=pa4!5N)Vg}k<-Y{g z&VBmryqpR(4r`(63!&uXy-@AH1#159cIgj6)%$Izad-hrZ@vUIzOTCcLsr{7Bs-G7_^=}gDx$ky-A5?v}L5=4F zP~-ShxCs6Ms=W)=+HqV8yNLHfl}n(;7P)cu!0-FG=W z9=;2zz4yBGZ$pjq_o4dtYpC`9x{X#Y7eeW^bx`+>!9C#>Q2o6Ds{H$1`aN)O;$MLp zzwbe{c;OHgw3C%6}!bGEJb7^wc81hsCuq1M40 zq3*j9>N)R*>h~Q`_HLj0A&Fin= z{_tfN-*d>e>rklmbSzu}d*ROTN~m#oC)7B66snzfL5CA^<$n$} zPQQh-;VUkE))rgu{!ruE<#-a*cy+^_;3{|kTn*LkH$urx1MUmo3Nbc*6s^Ul3gwP)73w!VF!+V4Z9FN2c96;ShZF4S{};T#x4J^vc0@w@@*IUj;2 z!#knI{YiKb-1R(r|B+Djb-DO*DE+twYJF9qPnaj1U20O!O1gFc*hzRh0+ z^_+8|#-Rb#o=f5J@G2;|_zYD24??y7DX4jP*6~kJP%Ey^d?b`@dE`hrLT6hTj zG&JiRN`4-Pl9Okl%J2L}yN?_O)vkW1{%?SK{<%=|dm)tEjKV`ugx{4G>{hrh|TYd+MxodhL^y)M2M9!&f^mmWj)V;rho?}U2p^-%r& zAk=t%396mnf*Q~7yY#1^^v39V7Tu7)8A1B;E_ygfHgab%l1OJ6E!u6x@aQJ0-5L81}5OyLwP4qaW@zZ?0 zfp7@%HxSMyEK)}9x51VD9%-*7+)FsYrH#090r4?{*7GTZD+r^6-w~c9{3jv(-Oa_v z2`ef8UvS9PbsBuo6}p7$D+${Ol5NRH`rDbb^mii{331JD<&-E&Tet$*ZJQuL=dg)cP3^2L@Xo}2=62Ony`R$ z{bEO5FC+Yna0%gm2_^E5gX!;Yx%g)nSq&GHKSAgrY$VhOuO*y8(C;R~ugn$u0Q_r0 zO!#-gWt7?C%6*!+e)C-X7Ou}!0>2ue+g#Z{|KqMD>$^~1vYxoKRq$+gy@@=QxVO8j z^9-)PN;sAHOYkwmW|#L7uCF7!op3GTSi*M+&k5atq=QbxXj0m2sI2g6^& zb#OkRoA7$VFkymp>52a!yh_mTTZBEydxweHKbL{G5*noIcQT9!=MeTI>`S&?_$#Pzr9_2F^TV(mKPG=gRqvoI=mF_OxTt10O4(fIixR#rx6|@ zyoZqfZsy`GJKkxW`_)mm&gr5@Da?exnJA^*MHiCYalU^jGzjtxbBK|pe zBH<{m2VCacx$ffn0>Viy?YHn{!ru@cC;XnE-*~Rh-Q4x{q<_fda#nH_7Ujww?$XaA z?f-IRbUEqD9iK~IP1;$6AGox=T$zV*W!~!2enHyqgq~d9Pq<#{;%}qeYY0nn`MNxx z@GjEV6Z9K}`@$vg6Yx5hemtxb--ED~pkE(p7Z6_H`gFn<2=65vL)t8;-#o(ogjWb( zBy^GYCAgBH-_HrR6TVJ3oxF?TMT92^*AUn5UkOJLzCrkVf_^8G*RYr7?|l9qNZKS^ zPdJ+JkAzD}8;1H-EzCJcm-`WpCI4zT8~zxUp?+n8Pq>!&olw8cgd>TsA^ef+1C+?` zdBXXmJqvxf2?m5Was6iaBf@!vCSfmveqXcjz5@5BT>873>vt0lBfN#gcN3~E|6CZQ z1>w;y{UDciii^LK__;1^A?zhwLEex{6JAGrHoT4S8zs2ka?(G*^**kyk8%B3m-lAU zF6VlMi{AtP+g*F}i+-&hhixYQ`e35oYWhRtVKA0>^Amp{j9M-=@fOTa7WnnZ-&&8y zl14BR`tyt4k|kcxFgJNUBhAXTpc$&fn)fjq9zb=&!0*>sfk7WNkC7 z?XaZD?5C|WtEn_AVd8J(aoZ~4xYtuGD)_5fNwZ$_2g~)iIikjq)*F_BR<-GGNy6Cg zt;FF-vmSG|$sC||zo*f#v0%FuH0yqUu#J0~?j{l#uh`#IiK4LBzJ0tNSBw5gwLUVI zJblF{c)-Q9$8VNHe>7W^n7&e=gXw>Dp#Ka}~;}wby zhkhKA)mMogi!Csru?E^UTUq7f-^*Xj)$2l`Y~Rw$i% z+SE?95t?8-n$j=$YbwL0L80Fl$Mtw_K5Jq)t`z;jY8W=A=dK+wBRgX-rzQAXD^amN z?hi69S+0(ARiV_*ELMCEc(qY@}YRp#l=0VQq1n(Ju9IR(KfK zDp64NT?wk8f^Zli@K#mgkybT`y;W64*w@;3SEw_802!f43pRw~3q03JX<>h;9M(dA zLr`Nl>a|9TM{p69Dx)n_;pP@9%_KDA3c97Prq^TAd?#D0;!xVYH%!Kw^+sFOu4=|K zpcTiA8yi7$ES$)qx$UGg%{ImgSC(TJP0~$*w7G-o^j%Xl%bH=U?X!m&-EXAP=13dq z(XODP42L8sX=@&@H%Q9TalNSRj)0MLIXTbCc1;=^Z9Evm%?k zqnfOu_0o+??ad!9VB(7JhYA(BH5&c>!u}X6J2<=FDxPGZ` zbyrr|P`zGlR@7zpShI0kb(p3VbEO@7KH%2p(w6C&B)#_2j$Z>kh#)jP(i8tfA z({s#zi``cZWZ_loK{4_AiWNj|nn__2+a0!rQswFOT}&sD2frAz$N5iRaqE0cf!q8N zIzB9Rdwo?_UxZ?x@cL?v=7i5sCS|WLGBaVcSEp%{%~x7xmCOq^mf~pG%+hQd&6JrX zm1d-3DA_g}X0u#L{1PiziyfiY4%9Whw3SZj_&-~mjjYM;T}8Z|QIb})l?Rkj8J(>R z{G^GN3##=fRW!!nad$0B=evfrRw+~~vaQ${!zy|);wnb{2JKzIuV`yT2CzaC`fzCj zqtC%ZQ9*g(}S(tRc=eFY)?~KxqoAK`R<5XQGzNsbPFK{cZIs zl5J)`6~|l|)I^lOH??!sYM#O*6oy(+==E1Cjr5$b23vTtjucm`6J9?T*1$>ih?ibi zh0@<*wCxUL%r!b))yBn|^lXAtbS|c0cbA!cZ_A-lu%DB1z3K7?ClZ|>2J8xVi9>GB zbkWq@vQ;?Aba|s8E8JU+ZEj6nW-gb;>Nl(S3126v6-2|-JV@! z4xKB}tv_Q0nRVe3vSnlAQlM#)Zwi+XN56)?k3-ZxN6?=2>-{9yhKfiFcFi7=a;rom z)mD+ip>)43(Xi(iGCI`zQ1)Kp=Z?qadazJiU!K#KFb7cLeC&_i;gwXo6uz(EpvcDb&%E3lQQ-Doky6bor}95l+6kpy{h9&iIM9o;{Eb=^(parqTNPsK1dj^+3SU(>}6&>B|->>99YS0#SgfPIcx$ za4Bm@n?1uO0Z+UE)?KRx@G|tU1R}HWY*ZG9)h8xC!;4^3XB;l_$(w?rT5juir;hBb zkuNydoL~{Vf((@rt(ug8Db+vS^~Z@-WN66tHt=3k;_Ffyrr?vAeWM zbRy_>7?XrHL1Q;;k{_^Dv*{agai{)y?K|hO0IWGYP*KDAlj`YIco}e{!s9T)Sy!l( zCLD5BbuLA=yF4TO(Q#xI2d^=AZCyMAIC?Oc$5k6wTN>Vg*|gW2P1~I1c__j@;_0N( z?QOvKp~EgFq=L1<#_oa=2I^fs1C-bQV1>7n05`s-C4nh|KLrcI(daMIe z_Q>r{LRqqzjCPf2>Gm9Xn<^u+xDqZn)YY>#SvyjxnImbF)Efn>K~f96Ol;E&`F-r- z%Tj1@+R{z+aeAk&yDMkv+O?RTBB|X;o5;eCCVWl#*)8VTXAbc$Y)0cm-sW(G)nH5* zlENakbP?7x=~jtnjqDu(nC%CuzRa=3k&5-R&xkOHrew zJu0nbm=k#>5wvXO+T*!AYf2{ap>}zhWu9K73p>k66S_&kp41=X8`lo&*^M%l25+d|Q1COC=1{#g zQucD&ME-i(mO-f~F=voOr8t7Smmgb(IWx7aGbnfMXOG>2H(|mvf75-|3QR&GmZsH< z>85iIs->QI>9Hd{80St3J~r!!b(>Wue1fQeAO&bfFIlXG_7J7qb*zGS}ymV<{@zTPQ6a6Kpbf0+2@r#!%UOan! zkTkVhy8-U@H%3w2U(F#GCuiiZh+56bFg|g~;$>%!)>sE!I5$t{u4uG{-B=h3gIc%0 znnMs8X+=Aun>P@%2i6YswOhQTYw_$=oIlaN1!<9P&Q6y$7h%R#qEr2mau734r)?SP zFD!4DQ^QJOT-CSo|OG?P+w>W&d!yx6yGYdKtcE5iz}%ffi-fiiwpKN#ap3hrfd zn3Q9G6nA8?6mUPUZz$T+F3`W-)HRrk9k=P^)JI~>R3tMhImf8_+*AI1ar^k@)E&&w z)C0U}!5}mz;b^kOXfP=B$ch7Rmnsom;oyWoj#0c(V%X3w?XrVLcg4u0y9rBcGNj6= zl3=Fhi*98A85h4N8b_ho@z3X{HT)%yJ->wq)A~iCj)#!3*3JX-Tjq4eu@8H52antu zR+}wTJl7Dj|26_n{gdO^=wg}j5s)n2fc`;RG+t8nU(|3@7XmCrlYDaXN+yce{JN1CQVaNGC zmMLBjUjkmNgnl}iBs1reEo7Sa#WEr%o96AJPLSsHB7Tr{s2g4)a+}^R=5iKr%y+LI z89hHiZ`t+G`L+>h$#@BGWMi_@SomoBD{}-kNpYp1cyCG?qw$e=t9Zu7#9_vzz z7Sq^5DDNXYP>!nYO`H*<$+eyVqk%VTQG6b80G6QN&*XEI$i237+B2^$xWNqviz8u4MjjfgiYi0=TX-N6ECdq!Dx@$Vwy-}w zbqB*9d0Q=WFEOW!Mdt!ylIhkcyQOrgW-;%DQ(xfzXAMa5|t%^dH*#5Z_ zM^&Z}=4}XD^XyV+&xGGDYIaZK%P?}TsGKx`PQ~m$VeAg3{+N4}YPAsiwb@A-kLl8m zaL}~jrnG)uclfMHjR5T%Y{s;Ctl3gD@rTSvjxlAE`qm>$w|c;Nozi5hJ_@p#gMwQG z**$*0UHsiMx8Ip5*-Thz31m|6I*+xRt)q3WO*41Zbd7nYk!>l`haY3+!w(~ZQP^Vl z(R#Q~1$e1p@-HMAr zTY|E*LJy8***@#1?qk9=xjUNwYFeT%YL4TOVMFln9+xsDoSHm&siDF(>MPo)y%1R( zMZW0DY(z5$jZ#>_O`K2fL%ZXEihNB2#z(vTo#lGAx7w#agtry$y>DUaR!lxVY(e^Y z`8&oM?|7`;3j7w|YoV5{F_K$yYbvxunt@kmoj0aprj6RpEn;IdF)x9$j`6jT+sv|D z86UY+ED=uHbYLYFF)J0R#jJ3u-RtIT&j4FrdLi9#d+TH7jWO@x+i#4`#?ooQ4s%RL zVQV+r(E#R(L-yv5ce>>&x>H61dt1kg=1oBZZ8TPohkefB zIxM*L>dYV`Ak&TX{MllQtkwc2OI|tW)6;oq8`0*=K{gGecJf6#R%KfxPw;om_#uV7&%jfxsfh7VVc0Nd%zx&9P=EQL5u+@3R!FSPB=O7EtKIJM zOD28GZ8sO=4~bIc&UYy~wc9LXBzG8s9cEs>tbGc;qwHq)4o;F{Gp$q6)XYMRb6ZOo zv1=QNV=u^`404T``G6f3<+YnH&q5{NK)vzSe$4=;N|2N|DCF!Gh8xectXVU%Se^-o z&PiNYoS*Yc3gK^;MYUoqn96XU$yH5{We%tB$)~L<^|6d`qZw7P!G;c>49JekPkq4J zYk#iJ>}ZLA({mcwPpkN6tN_`?ZtL)ISi0BlKB~WoL6mJI2wG}4yKP{*+kr6+v4iZp zaO??HfcM%MFeb5(Zeq5K6>@iN)VbZoYz1w#S*kbdu2$;s{5W_AzpXmrh&d3;!XSS?iUgB2R+3e{$!VJMS zHNFV^1bmrXkIS-Ey-nOTbsygg7-88M7iBLRc{4{%Dz#5Hi_5HkTICF^ObkderjpIK z*@K$7YIU+@+94BJ#sejFKfsn*RYX3uv#IPKR2W~WRTZFEwVzji!2O|J9<2L7)Bt4`mfx^s-|I%mrD zbofpqEN7ff*2~6AT*jhjxEAsb7<)NrHJaAy%wIc$ax}#KNU^zX55l%E9=BS8Pa1eb zj1_?cAShR{AdCr%BQ;(B<_yg#&6wQuO5Qlx0^TN>-)=3KRboo$lL)zjr?1HEEiAYH zGEOwcc?OMQ3YwEfRBeqN*_j_O+rB$*U#&N_xF>Oq?VyBh9}~-sm5`Stsegd8CAYL) z!dCcj+LA7J+V(V$nJ-gg&Oe2B(kKelsq=8UL2)Nr+k%e8YYU{B#TGE8XM56&To&;k zz$$+7Pm@zduuhJq|?{e7O7D?kC}C!SvbeNTxHoxM6L$;=1VJ-Ikg{L zOkE|@1j&1z8AS)8jL@OC%zu>D2t~f=>;jb~@z?O>c)K+CK>)Ky- zYJZ5X7%c=#XFko3JM`%zV=~ZZW`#znpTVZNg~rEE`sl5_(eb%I zE7%;+V!Lt*m}d4n4S6l1)a4VPN2flzhRXeO-+5>$uD3q=wyBl*^fg{~6{{(H7>Twj*pC}X zU|BL%NTKznp=pgXEn65~uiGp#Pnw-~`6Y5T1?Eqn4?)gv@x?hCpLC#}q>no6*C4dQ z&urM-@qIf-5a;CA7D|-}mOcoU(XEZgxK0pHW_7$0(se8-)A%qtV_JSyI^8(l_?Arm zH*HbrR$@EKLdNT7-je0M8nKc+O*Pr$oR=E&_B}J-Dm#lo=4RqEoI2*@Qe^`SZZ>4TN#q%^N% zg21{h&S}W)Zg3?QUNz*P*lC7OTV3?6)M<{U-?d0%o0jA^mu{>F^q|zjwB%HGDXZNl z+p>I7+A}R`Hl>R7{!Dw@nEBMs*Gmp#Ut#cM?^Drh=_|5fT_xKHH#n}E#|KA|J@;-tZmtg(Cix>V+FY(aEPo)C*9%9l(O+BxX7@vo7_h{`a;Nk9biAx J8M2@0{6B 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..b9d0c76a4f6ff2a639308eb182b50a59081f93fe GIT binary patch literal 9736 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 tb76(A9cA^w?pF# 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 XpC-z&6T)eGRd2rV43elV<;C$Y@pPc^I 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..ee7d15e3041bba86b6eb203edad2c7e72837a1ef GIT binary patch literal 26175 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 BwM75` literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..7b2cd8b55f581a4e7994ab40447eae9277aef14e GIT binary patch literal 3965 zcmbW3TWl0n7{`xytrxuD{dVw*!j=V$LPcU*A)wSY-Ngq@NT$1IyCd6~&CF~oMoqye z3K|};m>|U4ED|+Wq&;@jH}_Z^-(q@G|T4cz;J5Hr_&vNG{*m=-f|vc}GcJc>w-4S8ABD27Ama;A z;@t)%&K>YNxEG3kN1*8P6_hx>%ld!F+CNE~T>K6tu0L@m`d>;ASHgMl7I+`L9~R*C za2u4o#PDkP36y<&17-csa6bGCYB(R~Pr$WM^nVAghsR(Q&Lvo}^E{+W?abPHq2%XN zcn?gV*zZCFY2N~6{u(I#!%*s~lJP?*`S>LpKaZeg-Suz-?1!W9Jy?KUh$#APfReun zcpKaam%}4)5&RX39ZeC4ZjZu+@JU#NTcND`9xjD{LD6w3lSS8Icr7##`E8Ct>yj82 zWi8R=WVSZs{c?G5-OIgzTWW_8Y_6of@V<~x_ z$4%%~3(*;w)Y;rQZrSf0+&6HO=GG;8&s6Vq@k&NsYi`MjT;B^-Z&1<$#%t)cCEt@)PFkwZ zDQ#4Jrs|Blej`wQjVSUx?VK>uZ@kC^s=pCN{#d#=dymXBQP%H1YxI~HANj}nN8HdE zsTu8@h_&iRy5t8QW>^9}09j~m5602>6#H!YrN@O3p(5Rb0KV~+mbv{b0^GEd{%37uB zeu%hOa6MgjJX2FcHRFUvho)vq5r(xp=8PH}mKyRWuryeys9|@s8l}%!_6zAEyM>A$ z*!X8@rV0jCQXOPJ`c!l58YDy~SrZ{ts0w~1ns5T63XQOCys|26@*?M%9=)Pabt}=z zg?dGQ6x4*hHQTfsU&*{MGFe`;cdMoqOdeJ~E2eFAimEtaoQ=BZ`!!YER3|e&3OPZk zdVF%9TJM!j#q~^CL8noRv>PglHAL7Rt%d^sX|&9(E$5z?>6|Imu3=O6gD5u;j=JSs zUt=`P75yIFH8hwTHsh{X$UWjjrbjQyFMc4GUzS^(*Grc6EM2l7za*dUTIYmOuE<#k zYfj_`J-Xny+*D813G{$dE;}_>uNZUO+QVVi-R*iSS?G;6NNlcXoG~2Ew0Rv^JFx0R zq>H=rUHv`>#KRF=@6jUOqI%77y$5v(H=&6hT3=k9TXtfe1XM9WZk1Q^rObQuvJp4x zQc3(_5+6$9FOzt85+Ce%x|4XHov3FsYv_LqXDEPj$ zBobsBJ!3fddCAVkDB|Hd6*6W32k3{fE$Z|ivyS1n2~HfOO-v>6yEb56-oyvn#VuL* z3?uD6lUUM140LzU!cJ~(2eUWX+?sa0$wqj~1m^9uj;Oy(ck7Xy9aBmCdD7gD3En!m z@7#-{H`0htPD=+9Oh#fUL@HI@Sc%zGt5?v9k)5;qsCVf*YD+-Q3=PyHb*QJh6et7sV1YZSX`T2dr&_X%{mk zKf7&+ls9#XbvZojk&vazXBC+}9m=cWU!SZbRsRNeA4N)Q^-3@7?hJ|vwBq7vS-ytw$1Qi zTOTA=3Ng(Xu33Sco$Y28-?j^hmTEbA=3igy7=vl(IL^-gslUpc&r{5Ala#Pe+eWVJ zfVS0Z>*L=h{=cfBHg}lskWqHoL4D?;8rn`1G@o_8HGAx*SQ6fr_Z@Vk6~Hw4h<0~( qv&Me7MV0hd?t}CTk|v5_jw^{gVh>;TMN2<&spwO(F5b_-B7Xyk1AXEE literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..04eb49ecf5d1297fcf49e31a5dcb3d4305638d79 GIT binary patch literal 27574 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..25f1be6aa1bfcd2dbb3eb60d344937e594af891b GIT binary patch literal 2833 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 BFFXJM literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9c359746c219c3776714487a2c1006c79b3a6fef GIT binary patch literal 19547 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 ay@THQXDt1n&KaHL(uaKggPs1F>i+>insmDW literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..49572c078b46055af80d5dbb248530b96d660ba3 GIT binary patch literal 27590 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 Fe*n(>K*j(7 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..95fa04fe50318ed33d006752d34b7ad83f00ed24 GIT binary patch literal 28553 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 UKm1$sNk>LmE0fc4fjcw$eHq)$ literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..8a9f45d34e49088e7e7688b88a7689e67bfbd34d GIT binary patch literal 10147 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..eb02f6ca29afac1317edbeb293aeff3eb02e11bc GIT binary patch literal 31167 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 R2e;AZuJh!?z|_`x|39h5K7#-N literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..8b0241e11fa7877867eb26eb8b5e4a4177be3074 GIT binary patch literal 31187 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..22605ab84eb7d130864f90ef5bb71b614190e5b2 GIT binary patch literal 18243 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 X%{tQlJSOOy_L`pB&4(85_0InX=8t~Q literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9f4b0607d6d58cea00339b4b0820f1abf36c0798 GIT binary patch literal 3628 zcmai#U2Ggz6~`}7D40T_l+W;S18GQT#@ThNDs1df+jZKs3ASPvAyFZXcdzXs>zUQe ztX)SDaxgLl9zZFGe9$i{^#vXl$EGHU9r04}fY2TFfrmmL5JDjFK#_Pug5S9_yWUOO zFxor6d*{wQ_niMZclPzWZu_y~D$zbk`{~=18kPP#xN+^fO{sUn{qRHZAnb#q@DBK8 z_&)eG_-+_Lek$hn9=HfU2+zWI!KdMS;l+Y4LCts#ehR)?@C|r?@ttfgb_OAj)X{>E zLD_ernE!h5d=9>!=kvw*47{E3S@;q7UAPNA55?{^$WOh(?N0bR_!;;|_&NBW;QBVMfX3z55T{`Ps4vh@&9g&iTyoL<_|)N_dzJ@o`Aby042`v!!h`Cco@C` zhoOg&aTr0-^E#CEzlZ$PYuqHBze2J9Ux*887b0l52a4Wf1)qQi87I(#FG8`GL9zEb z{4D%CtiU^%d=x$m?}O*y-S8DCalHmbmw&)A6p^KV1`19LFW=%5{FzL&e3zfhtWrA;;ZCWd}?2kCry)meD0%(pK|rn3wwoq#i1wt+Y58{O(GJk|&^|$voU|{AvwcbK<-FfT zqr~0$M|zh7O3rB|^(NPTxeZT8%~TCn(_kS;1C!|S1rsj>W>F0{8peOw%aT{*IAR6Q(9sqs=6Z=JUlx zKQ&LL#q;2_(eq+_`lj^{1&KdhH`?FvbuLPEHHt&bj)iWrnp<}!PMM|YAgl%9Yn!1{(8$U5RF?CZ-F|31mf7Up+)I_w1 zrSX{=buyTpOY?h|{mFch3t=XTo&Q~$sY!z>xegMKeyexf8YDy~S(74Eq9&u6bkUEE znrtQw6V}w^QkeQrR`lTHTriU!IiLqe)3`1iuDhWN{0Q$QsVVYW^qrbcFu6JToS1I( zW?oG#8vm4@ilVxjT56D)2!;H(I``-0m(=57&CCR$sVV3;>!}VBMX@FbThVGFj=q7G z-m#kZmG;ASsrH>TjVMmN6Ul5)^G2Gpi8mEhbl=3dchW2bV!?aJPfbM+l*)&^(ttN` zzb-#eDV6Unl}n|*<9?EQQ=EmQ?x#^)(e?#<)o$Bg($;OuZfW~7yOAy1m+fYDN$bI+ z9!*CzKkTRCPY2ZpPe*f6ziA%9QaIZr)83Tv=kcIDuIME0J8|s9*pBn%{!-s)#F+`% z8#O9g^gP(8`$2eESLggVG3n6bQ%Ai+JMW2)GbZ-N!fGUyU(tuAgS79f-ou7dk~=>U znOczQf&Nne1AP-O}!%a#?># zmo%?4J~A}Wo*EpwU%GBZX|P<_6P6?6cZlN3U&rnS0A#%T|HSdiIGdj*qQwx#V4v*m16+iTd` zA}Qx>OWp8H*=N|}W!gHX@^#r$wv}D98$BCoyPmDEE4FZ=rLt8qD&1^ZxiB{Ixy2jX z**Ui#`*&P<(>FA$H;9j@@-VtBvDw1+z{Ne#JPcwBFIX1$!==9h6Z`p z`QNhJZ=vc%JYPm7Cvu*dZigh=mHhEW_8s0^m0^#xFA~fJHebvm({DX%5Gr9 zZ6yibk>IA#s1M9B}q+}w4E-Sb{SMw@*sQSPhJo0H(4+BwPvxJ zcih63i=89P(MGK6a+;O>i7Uc9u1;3Ox%G^KLf;FRFOrqlkbD4EX-xMhq;oH>vr5u* zRq9=8xy3g`J{+5(26BnhNQu16bt$Rr(}e#N@4D(-r*jrd1kvu^B8;0il1-%II~#Q> ztH)~>lT${bC$n;9Z>Wqe*>7E-9IR^v Q%lTOop{XxdrTlaL57$VK9RL6T literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..defd1623eeab7c961de313a6a9568d703237c840 GIT binary patch literal 3009 zcmai#Pi$009LEPm(N#pjzxZ!JK`OlRwi3jpt+a(=X-hZkf<~js?AzJh>ArolnVGkx z8)EQah$hAuV`7LV7y~Cy9`K?ElZqE(OgQL4iSb}e^nxc39Q^)f-?j~Eoa~#=%)FW3 z{C?m0z1b@p*S^P4LOc)Q`CtuW6V$#D70QmajNJqdfSbVGU=ExBZwHTp>%o`6TR;Wk z#|)}l!3FRx@HOye@LljW@NC8lAV>dG@L}+B#;f2i^fzF0vNH@~h)rgk25H}7_WqS@ zyaC>U@mAJ91+GK?HSk{W4e&wm97uLQ2k~QwgczW%e^j`}_)$9#=tHN1KtIbs+7(8Qc!;0=IxA@NqB&N&mAT zma?xwiuXH^?Ee5#TvtHS?GKRRy#|uqHQ1c?-2~FSt>6P-2$Bv*K(ZTwWG@EEF9VYP zuY)_l^C0Erw;<))?;x%F3nabQpc(+zgXG8484rVG_j!=^e;K?RY=X4@H0bjI#E+dr z1(WO(5FxP7K*;Z729^u?zB}vPvpl-e*oNkPcxW%ufpWTE9zlcSq3?(a?MJ>*p);iN zB%YmkNK1-`G@$&VGKhyhOVW|fiu9#iCVxqr8}I~p=-lWGH{+pL`-S4|7t)w?CCy1E z`u-6z+lq(sgmQxNp9<;A#wt2>Y%FrBqnwhK&vm5fD7nDK+HEO}NFqtiSVh7qome(z zB0ejVlut!EpG8^NO^p zDmjg2+j&nWMMoRuq-D?PmSjFms<=q1yiC6Oo`tV$M%J9Kcqwg5!>8pUo6%5WM%Vcq zl=VurwS~B_pc38|iHun>mcmMIWh^5H!(6pQU3#}zQ7^#KT&>2Asd~fp>Q(kjy+uBR znl|45RhqGqgepB9C?5V_bNm`e2%Tt+gHV>0bj>XYBUvf6ZJAVAX)$r)WPuNt8mi_- zck$r~XJX=5?7KejQOvVWX6KrIBdiO`_!ev|oHhksigiU- zacpI2x@zeR=fgG|8bp$JRdk@M8+uTtqgb5OQygwkmZF7C`~3p9<^b%eBsV)XduYY$ z{9u@y(D+yqYzi3)oP^xnj)hA0^Qa+=m2TvCc{13yGLM|ANfR7OB26h@;QK1dQrwD=7a-SlgFB&f&Do)$J<8NjcBDfFjU*(A{+Q(SpdqHn9e_go@dx}GkbQM_Y3(z?*A z-Jiy_fiMu_@~$a5a_KD#5${gQtuqpLtK>*fh~Yh2-kQy|R6H*e%?|38 zSUMwnie$Q|%>NTG0E1bClEt#4slt2YEv^#(g|Zh#Z|7c=Y_2*lI`O>nF+)k@EELYX zpP1>Mg_Y$*QCB6BfZ`Aa E0npIy%>V!Z literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..f048587842d3e14c5bfb7e846390ca987b9a1257 GIT binary patch literal 22003 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9dc0b4de53fda377444cd399eec39f9ebf957e5e GIT binary patch literal 27502 zcmbuH37lS4efKXCw#dE<2sc4Ukj!Lb2?K#lGTBHb88Q=M0Kq%Yb7$uAY~ypEC*hga z)}_AqD%BRm))z5aE7S!wtwzPT&ZO=O*4J7U-qyO{QmbHjwMFUocb5CyXBNQseLkG| z-gEBR&;R_-|D1cmBPY+hJK&cb76j+O;&X%GM?AmxbcF`NrgMYf1h^S?!QJo(cso1^ z{wY+teU1km{|TN#_!IDOIR8BBKOQRnLUZeDc;y(%1p3`1n>#-QBKbFGh!BsAN2ULIWhAUtL4#N8(RSEtJZh_}s5Cr@e+{&Me z;Ge-O;e$~1e*z*Z!RiZbyqjP*{#Qc&3-DY=H$t`Voi6;NQ0X3a{2|o1{yUWX{T8lZiYj%I~94`F|N+0)GiFg%{E}s@F~McvyyJzCxwH1FGD+pwd48kAV-tBj9(O|6icW z{i*ZMTW0HXJXC(?ICi=4tDS$V?HGfS-v(6qcR;1v z5BI>&K(+4*22=fYHPrilsQ5R-`S4Xx@m>$rZ+E%yd!W+Y2Q_XVf@;rKpycZjcoO`T z^B;+@s9xtl_2Xiw_?JTEzaA>TYvB!WH&lB*2-TmTfLb>XLACdLup9mYD&O-iv%DB8 z-Q`gA?S&eb&5qk$_)d5@;V*`2X9Sf`8LB?FLDlnR@O1cEcq)85JOv(rsO;bium}DE zYF=M_xoy`aQ2F&iGtb~M{AI|{2lqmTAowbzi-N;fS+0UKDX2irn|Hv|;m4uc^$n!ISc;6?DYa1s0<)VO~as=p4SQ7Y#s zsBt_4YJ4t&>Yr6m{kGbLZ-OV|-v!lgx4QRxp~mf%@GQ6wo&g_p{5n*>{sb!jr=ZF` zp2hJ@crKLxa;W~^2rq;csCvB-hVVWpJL$7f<1i18+Ho9IzNa`YgzCrTQ0cFPs&7AB z0&jrox7(rmJH7+eU;hdq@XPRQ_^9*GTWkCKJgE2AK=sQFQ1!h9N`6x)Il0$` zAAl<73vdDaHk7N>mL4MCNcLZ)u;26!I)d#Ln3gqjaez{BC$eYU^OgCqDa zfs+4wpvt)qs=c3srk@~FJNOP%J5O0}>-l`B`dHr*5$QvKXrTE~xrn0VP+Pq3VAFRCzZ$jzf*xE1}A{8*Yd1f|9G>z!7-e zMw`z^pyGWVYJ4AtlHZ>|mHW7R{}fbzpMo%HTrP&vUw!aMcq3H$VYm?1p!)Gn*ah!} zz3_|hT6o-MYe&5Z(&XS3@P+WRa5;Po4#F1@IfA#ri{ZE7MexWiHs58AH^XIw-{Jfp zhw7)F!lU7nQ2lhoR%^GP0X2>VsPKEB#_0hlz5Q7@A3o`LRKJ~{Cqv0o2U@a0PrW?1gH7 zKRh4qg)8Ab@L2d&sB!r&ybwMPkAr6o*!&kmrC$RV!CRrm^G>LGy$4FJJ`OcMKMmD? z--S!y51{(zLdoAZp!)sW&VSTyD~HFyGYLNjD&D0~>92I} zH$wHx_0C^_3~^A0(i4ZE;(rNV2EPT>ZztSf+kZ7wJ8yw!zy_2Y-2pXzpMb;gF?cWB zd86&$$D!&o|0di16QSnK`B3t-0;=6>oPPkGh5u$KIcY(a_gC;$@Ik0~aP^CAzpRC) z;U9#T!UQV+eefvwKB)0L;P@%1@%aK&zK=ka{{&R~j=b5{^K7Vi-Oj%js=hm+#-jk0 zZ^QZj2o~|b0V=;=LCMFwTdck~0V=;sp~i1BR6cv4k041NFgp#ALL#6vE zR6HqrjrZknB}`y9yceq9zXX@T=O6^hnIh06qj&-^ZcyJ1VyAIUP!_7D2W58n_DXfa>?xx$r~q z0{q{C8{qGt%rAfdNPHQ z%X^{f{Qy)yeHy+5{sWXeUovL<@oIPk{&i6OvKeYzu7^j%64dxLpz?V&RQ$hys`tH6 z{r_G#4^Bd*{~TmUgNL1eO=9QGPN@0yAiPNNpwd4EmH#of+V-Cf)&50LodCpXcY|{uBRA@Jif`JZsKMPX89C--S5! z+beNz!Ciz~Mcl18{jPD;^Wi-A;nw1=#x2Kvhw%67CBJ{e{grt_FTye2f57=y^ZY;E zv#`xQkHZsq_lNLOs9#fm-17_JzvA5jmn)p#kv!iGUyu7aZWm6!vj~5WeGJ|Px8wc< zcR22P-bs%1`y1RnIF0)mghx32o(~7z^9^thVOwww+)cQ{+&dnFpW-gS|7!RVoMikz zaQ?T}JsbhA!wuoq;a)_V=R*CexHsZHgG!7=W_|oW zJpT~4o46@F7Z%+6Q+d{J1$-QS&iH2ka}IH&NA!Et!u(~K3?9JU!u!wW!XM^Y`to0J z&%y1*{a@Ul{Ac|BcRvsR zi2GyQG8aehUW+?h5B$!+oy@xr8y{yF@MXA1a9ds2YaG81`*70LN4c=eNP9F+dg$G_ zf-7e~&m|YnBZVCR)(EslB z5Ac%Q^H+JE#C-y{0(TJiQQS*hemBFf;D0_&zmHi23kd(;?)mTGk+@rM|L($s0pgtJ z{7=Hq;Q9%h2akeZf@^Re!tKJp8tS(JcOCv;!GFS)ar#|_yA1a;+yG9$^KoYr*Z(f( z;b!k~JdyYJ@q7Tc(uMuTvBo!TlYs7q=7lb=+Av|LZ2Nqwze? z1$-ISaF5|maAAuagfy$1+xyoCy~DL;Bj_zOl09*_xlpTy z>uTj%Jqu~Xm2hoTD2>)@&1!L$mm4U1=1WSA({NL*L5g}cu7@h2R<+sMm)rNm^*u?v zH|WL0#D(jcX`@yN2ghplMnRP#tS=skn&n2gGbN9{q#hRk5 zjas-N+C!R#OGH4c)~tsENwpdm+sXIV>g8fsDAx+5^m{MAj{2Fx+f37%7u$K4D!sbrx1GhXeK6Xg#XXOXcygXgF>p z6LGkxH}_@{uc$$}fq>XHZH?%phLW_y$~G(E3}$=Ulg z89IGozSj9@;b7coB-K%B*AYAv-$u9QgK{xurZGa^A61)CnN;=K-f%ch)sG!n1igEr zMpUij{{B6U~R2dszmit%2S=G?mEwT1{ri-AUBm@Z9Pd#RuK$p&Ob=&oqp+MXI}p$aIf`-v6fzwmX0D%S`Qi0b`~M-E+;lZXcl&yF)}%Ox zzL;LCoGQr_PP+LGE*!@BGxvGqe&dPjx!T64c0}Cc+@JU_G7q}F7mHhMguZ( z(t<8dD<|((>t-(oo5N;+$eIZj*B#;_5A{Zb9x%GYPsv)9IkC>n1_wm4jIu<-wR_IL zl1|aw*b^@utD%LNFQ|O4Z90X`W@@!gdl~3Run4V8CCe?;Q`$ftC^RP#iwO3!x~y59 zuSS-U#3<8qwA!@A6q`j+wV$!9f*lFf#T7bdUeg;|t1$;6I<_%ZE1D%zC8AGI3%0-9 z=#80}BXt(5w)Bmg31UZi#_Ct7RVpYcwd-lp`dA@@fyT7!RBbOhKdx627I6m3qqW3zpD}Pk zS63HNVwTfLY1og(L|zwei}x-J)|q)QG!|Fla9dP~I|950%tvxzVOO~RwsFjsrJE}P z=_-|^(G%)nylLjIU6OWSkTn^gdW@W6-K3>PZ9LOJK0FEw))q>gEi_$y<(iNs&T@Um z)Uzu;SEpx8-PR|m)5Ja{t1wc|qS}^R*A8T?!a6N&+7=Ys2gVqakh_V7hz}#{#vJI3 z->5U(&3awNS8fopFt>pFC|<@~id`rKR=J)mx~rNkmQWd=4s*<6XT#d4-d=D%vo_dg znODA*d6Qx0Ta3zS=`>es%``-L%g9VMC4F8&UzCnX68f-FJ3MXsBOe8Ws}WaI*;Q4H zqI$Dh#YS0>r5un^+Uc8_k%@#jnr=tM$JJ;U1wSp9Ig4`3G4h%Q-j*LUS_5x6Zp02V zr$SChgT5qHsrg}9YgXR5-^f(9_OVZ#t*yqiqB<^9-(|L?61m1$f~+z_n^rBcH7Ipw z@%yz6FnMG_JNyE;Ia>hL;`Z{M#T-O$6~=~Zw}sX&%U%rCYUM_vUUJnk#-KIzvM_0{ zhKr~Mwk5+Qa^s|R6BTB(ePj&D@mgZc2%o!A`sNMNk*%2~0Xrr33i*h`)}AD$lBK>0 zK2A{&sBTOguZFi*XNHkn^{>>b2?o9?p;51y34o_oXc~d%X>YY$i&!hyvv&>M^zxRY z4Q#6*>ujJaH1$Lzihm45X1<;3SA7)p; zwkTxV9GA}Q)yxhOVKB-+lNvS{W*22vyKsad%V(S_QD=gD9nzVpe11L`RObepsoB() zQ965)LX4!{)~H8mu)#=)@+n7bZpSkD$-Sv?4AKbq)XIpf8Eh|O#PP=rDumpUY8(zV zt8uWQoQyk@hgGAVOw_6}lUuk|eIdW3dp@B#8f=U?(P59e zu@e|+dSD(0*h4art;ckc z36}JjUA6JKt--jAg_PqJBuYD>PzoDwW6TH_!!?c^y3;+Q3rzt% zfwSAD3vZ`@Ig8&2=Jc3e*1}mL<#TZ**=R-@T~0m&7h$QJF1=f~&N7#58XqTT3~|_F z_vtnUmTkk#({URdMyzP4FpSS4U1jt+66cO$!l7t*KFf-I|&D7RO=EdZ)sgs^&z-Oy}a>PovN6W(85|lZ?G85E_eD2TQUcn7 zG(#C}*?~EO_8V|#Wq}W{6JQHlHg!cB=xGP0MwG_ER-*uEaQnc??3cFM>E2A$zCJ|W zcF@LpG(MIT(r{f=FOpa~fg-J8nYII1`gB-kI(KiZ)-_o~?G}=~<8Y1Sc15bP9Wg4$ z99j8eGKR>WkQo7eX)|FRF={fYjH`ELaCn2TJJ`yBqWKdJHaSoWX`u0T*%gJgi9^P% z@hEFXF-Z&MD5(%jGZY1%t+?IYGg;nDqwgsDUealc+CimFyvA$EQF0# zw@OMzk{IK~JhdG1mILYyHKrqP|I#Wv@6%Y@bIGUQZTGVah{JUVYKf$J-lU@%o>>KD zBiW~&<3T@STL`pW?FqKU4e36(R}R}io1S1>jp>Q_c)_2E^1;O@_ z5$1GT%M7=|<>R*n+sE13Z>W`Zl!$m(g+7~V$imdNY%yBn6q`X@K3Q)!COJe|CmHV5T_QNylCcUYJz06HRoA>y<>7QpU4tYY*2n z5*=pQvq_-jxrs8f2&Y~(T|;w<`z%VCEzPqnXon8}f8UZi6U|i=y){Sw@TQ{^_986E zQ(zT_Kd)ls?D}Jfq6|@s!46gl_dUug?HzHE-9a%w!FR+J3A|ZU+XmK-n9VvXS?-|9 z>7hB_wD*HPirbE++(@#ysr6nk^J|3PUCbWS?^9cup*(v$V`H+CWCz8j>jOIgZB1_c z9jcs#4vk{Y{iL)9={57mTHy9EO3iA=p2Tf1IUUR9tPNtio8)$W^m24&Pl)r!VYw!_ zm$S9by&BTAHdePaReXN!aBGA3aE?ly7SV#^GGU&|lEdqEH_irZ`?HC)xmt{GBVuY! zH0*e%_;Z>IOBcbCiZHXT-K%rNn%?<}<~E#8Ybzu>5p&sVDa}++M}+C;w7IPWGh1pO zStb|vfl8IPpN$5`5*BqYXy)v(r|lhJqu2J*<}p4EG_C_9f8H*4^yhh-jP z50gqqErohwjb@vdEV7yTDRf)ZY$RpYMV-Q$uS*^04yGoGM+sH?xj}lLuZS2Q&eB0e zw0lc6uQK0Qe=C?ZvI_n2gTCqxT8qao<<4tNfEDfxI3H%!h70ivzD!)ZggX7b^Ccx!p_oQVVY;a`SQ}~VCBI zW^a5z4~5LTtTXj8k9;8CtFIb9sTn2Jcifzpl2M&C&wQlS za~g2qB9+8x|MhH|YH8rN(2mG>wvh?h2(=GWo7HF!Q&wl2!7lblC1tI_v<-Df*5UGH zKET{jFlSI{;69}&KFexNCtqEgi(Of5sDGDU&fgL1n?zTCI+_%_);34euAy2_IDcS! z*AAwrs@~NXHR7Id#j+L4x|XfzTDB@&zOv_%CEFll-c3GR!&tt-M_`TA?l7oZnwfn(Am1^Q&tpjw(Ij(2gvm2T8dFfB)wG_3gSY z?_M^49n+E1g)WHzv6vrA*-<9dEA^Sbp2m&UJBK!Ot!l?pl}6%v*LvFO0%@_9*bRxhrG3s#5AFS>HR?#vXUu_&WGR!JuBM}GSF z3QVffu zlW&^Zr}J*JxMEW@II!7 zx?Zw2qBe*21?x!^OulJ?peeT*9d1`;SrCFx5sr?0>`;rM&xNa)1 z)O~bHxFMP-N8!%aD2Gs$$Y(J#TWgn@ikM=MkA!+vE6JgKS#mTLUFCA=n><);u_=op z)jtVi$~1Rwtp1xkC`HWQv1B4r*(ph>rkjzxKxK39Lnlw8lLzR4s1-4HgF#wqW@$JY zS1G-mOzl&f+-qh7XP%ay1&wZCMNu=KI` zq|um+f_itbkv?UFsCtl%K4GldoFAu>@1%rXWM$aLQ0we-&==F~hxQ@7Mt+m9X=EtW z`7PrT#+n~t$;xwVO@OOTDPe`@-hI)hPbL{i{iFpOTbo4GJE4bxs1jA?czk84|>(7$IJ@ zlE2ww>via@64GF!%G-?=nEF7)ls$QST%Wu@rZepTwEb&qt!9IAxXYDY@u4n*3~ypp z6d9l`CJ#)6y^SD~t9B4d$O<>zVd6!Nwg~thw^Mm)|3qXaZY3^-R%13K>~^dx%-g#8 zJe*C_3C7q?nc3BYja}8(Q|W`>Gh2P1Ly2W#@${9PJn+n#usVD7HG!ENM)RmiPSZMB zsz*jGWS4~0^K4Z(m1cTuVU^V_Ax-7nbEtblbW;{)6~5C39G&>M8WB4Q-Oy(*7;+g7 zlLw82^vB$3mMQbo-2_(+ks+?Vf zndFMivSv${#D8&}DHMomzLxWU-yYqCxgYQp{RuxmoDeoJCUa zuEktiMCqW-(P3Ifu??!TWn~nsM!{-xD+jYhoU_c58>V*QtTYrmv)+tNrcFB9K3n9# z&mXJ*vf=f!N6Nb;!Q=}~s{XGcT3nDsiMtiY4yBWhSxkdctTBB-atL@m>RfM(0^<2lWSnb5s3Tz>1<0=XU;}I3-VsBJ;W2{(>m^gLz zGzqfo7cu9!UV&QWbBQq!$UZ8t+|t*sfX;hN(g=MKH<_^~1E)-wHbWS76IfnZ&SA;f zZeEjN5}PO(q`J8scIdE<$Zjlxg}Yg87lt)*h>)^F`aYiRBJc*w{wi9M0wAZQo~JIi5bBxm4wx z%i7as#|>$Jm%>V~op?44+tpaGVM&H4Q_ZQ{T+D2tnmdl2-E@J|XOjom#c7E}(U^v~TkINaWJ~JCGi^=9@jB8)7axs~f z-_w-Kyl!s~bDANzKBqa?OLJmOmh%(T%YimWdgbR-kRMV+!y3JG9v3e#M2&txe%G>C z^UqA@ifr~^s8`PJNQ64l{v{l?i82#td&y6U*>hjpbVFwLgzZi@O3v;0BYVGYT9;Da z*^1_KpxIAuFR9tHwn$dZ?#!ymb!pp@)ABWY;$HsEM#M&<(M+3shoEh>|D(vfwxRxO%qbh2qLm1QkX*-2dJb*mBU zuIYigy`*}tWO~o;uh5`b7tWe0u&s9j*47k@Fibh_ z(o)1hfFHW{dn%@L1+$JIeE_RU`vSAe z@6>aMmfPxc*f9Ifi9yWbWK*#n)&HCnp<_5dSkN0xzjcN70Cb3wC>ERj|~QQ z7_+Sd51qB%#A$8VhxJiu`n4@I2YW_@I~w?md99s1sQpg1)iJiRc81ai`Fh#4bm>5p zCL^3UHX;lwJFRr$E+n*blnKbxygO1?4JG3VcYn=6&7cn8yecMZxSXh<=WR_*ljnkTLkpif^Z++X3VjY!}BaN%=@-!IsjJS%flT?z^~yI(De&6&sIA z0Y&Uy>~z~Z??>)gtc~2e81`D=+8VvqEIAQE>6&wBgp_Ggw9{l*=Dnoa?WuHd#l}(V zt&GiTu#sI4<)Ho8f0??{xn8O}CISaS*d1&r?O&OsqwZLX3o&I1qy{EJ*1zU_kGgY^ zhxFNZb!~36@6(ySsaY#K8ku%CFr?v8e2eammn%#%gT!{o)N5c6|kaf~H z7?*U0sx^7Ii7YkgMPCIwV4ZzjVH0dxiW-qBU^Zr5;Pp>-Bo!mMoQ2O{%Qrf^w6{~S zEiPr}9d_Q@qfq7a z54jtT=2TIJEB{_fjbbYo=#R6cnFoG(@iu4JwmPhN!QIA@1npxi0M{6EOyE?Z^6*O0 zd?NDS8!%h);l(UG!~oyZ;>MLu{M?oX`70!2`i{iEUDlBnZ!rGULscfMSsdEmD_A|o zSWq-DOjyttCd)B-TKmFzV-}G9@HI3HNI&AtnH2>LZ6sVJoNfZ)5}$+ z#Tf&)HEXQsWhAJ?5g)gXL*0{cW_!YpOx`VYIY%d)Z87%dK(!aSFom%Z%}MZXv-@^i z1CC{*aFh9n<&I(fmcgqi>(_TdbDn8+nho5-s>!s%WYlSh*=kVIjA*K;|D5Hbx#cJD zwiomVP zMl{S4=E7S|}KEBTI znMi-URfr^3*@JP_poApxVP}(uZ-QM1Eh+29C7-j~3fEk>+)|EG7U|GVcI@fi$@|@S zO4&2nWuSFfer0w@!$__4sC(aD%Q98!WW7_Fc5Jpy4~Fjet%zZxvr)AhFk}7ceJh#> zxGR_FGnB0vD+LqYZA<3do&;Mb4>m@05N+1u=_j;C)pwj`EJ9CkW5Kiu1?rDgH5=ON zq)C=d!e^agMnS2}kY``Yvxq*k2zwm-dlWKzf{u*M!tTCIy9FZa4Ljs!i|p5qXxx0N zGMdUB+Z&T4r@UB)tRjuLNg#0wvJ0A-0?FOb%)+wI|N7S8c9nVYN)TG?KdVrsaqKBj zV3en+V{Qh|6*+eV#TE=5tBTJ&t;+U8nY}ftvbEEa^3Erj{c|CosM_&!g<_g&)4+O} zeZuRgDk?))0nDGUb5SDLE)?`bdsW(^FDGmb?9m@P54+50r=-ha{EG@^yOsdFZh;B6 z(<+vG7iv#9CU0*JH>Wts^)g^4uUoaWZL^0HgP2ltADLrH@p_IPvG450tk>@9oY_Gw zO+VY@IYTouOgdvoz|3TJ-(7U&Lt$;bfB|QgJXsueEzAX&7TUWiNw8gC0V-acWXGc# z+-Jz_gMmHd)}bU9Lvo|S*2DCqHUFMAp+;}+l$}R4d{oa}V(1UnNAsfmDVyYvNhPyR=9#_cKDIs;S=7GXwoDtB&x~{FV`Kt<<@nnLS z{|S;gvI;q4UW&P@<%Ba)&RjVE)<5?v<@zfZn03bz_GBii4vCls8op_L(%u||!|r^n zVhvya;l&J}=?m;M?clLVbLHj&vvL^$>=_`eoF>zSvm-yXF{W5zXI^mC)-HFcHUAv;`rWOpFa9YV z7FA?Uge%E)T~O^_lE=HFnq?;g};oc5P;F!>*jG8>NtM z+T6S3!yw*PQ3GZQ@F!MM(patLZc{Fd862Q7Id0GH>goJMjoQIDvF}Ap3+A=_DW~4x_!fyFq(9$IkAZ z1jI-PBiVoivXC$cBm|*wia0{(KyNvza#b9gc(*G5kgDJ+DkPOuK}b?@r79uL=iA-0 zw=3NxWb1mr(>*=?dwqYu?%8|)!qc8Ld|sjbHtmMb8}m!BX9{0@{^A^C7&1Qv&jo)0 zUIe}mo(leJ=>H1j&rD&`7r`%s=Y!M1v%%ZIgKCBq{S7F2{{U*e zkHGW5{{$}p&!Tf7cnNq0*bbfs&H~Q_XMUDU%HEH`uY#vAsQXuek~agCp0hydu@Kb!9uSqyeF0ODKl5$AB!3Gi z{k8|(14^GCffoEZ_$BZokUw)8M(F+*!FKR^Q1bf%mcsZN5LL|&!OOsd;8(!+z-i#W zfwI?Ptn`=#O5fW-+1Cr|`8A;Q-vmnj4p8g74r<A`Q;22 z*Z7w}*?TD{yRHM}uQ?zpnFXMDad#Ns0_yo~pyccUCFc!LdhY}IGY9#Se(!?P`+e|c z@MBQVUHuzgZU=ZV{Vwnda0Mv&4}!Au5m4)F4&%E(>HTWB{{|?14ug{OQ&2pA4^&+K z8I&F8FsSj%_>#Rhg1ExW0VS^&lwS9MvZoL*0VOX5l@Ft!=06IuwAlzs|DB-tw;z-q zM?uMX7yK>oJy7fadl>&U$e%e2r%T@D0j~!2d>be^U7+O71?7*$p?@!U75xEF@;3*3 z4HUnQfzIzBE;k>C{wYirPc8(d?@gfO-v(;^`JnQ&H{6dv#r1wr^Bw@@k5N$eJreK< zQ0wgglGl>KwT%fV%!#w%baxE@r#9s%cpAA#3^GYOXB^-aFkfTLgp zegd8fE~6OBzbiq-e+0y}<_S>o+yhGg1EA#o9MrszLHXxYNGbi#2F2@(K|Oa3h)c|D zQ2D$Pl$>Eu^PdL0z!$*V!1qA;?<<%3xXlLDUkr*DWl(ng0F+SZ0DD0B`}?5$`6?(L|0yVczXP^`bx`wu4Jsbzv$*WM22_6B19pRh;0o{!P`o+? z;|Z}j57c_oK=FP7D0_QBOfjoL>A4w1Me{>&E%+`dy%*wKjVIuB;8URdZ~&D23ka6b zf~aU_fNp(IcC7}PYDPe<_Y$aiKL(}WhhQgo%C%n4F7SH#cY)%?6Ce~ZFN0d|$DsWF zGf;N^9jLtjm(c$d6yK+ytma<|-T+<;BFcOVls`9uvi~`dN6caH7VyJx|MIVSeP@EW z!t{cA?xBEB27EE#k3jkPIH+~s1Ev3effevVg5Lpd1ZRK;LD~6_p!{+P!CnI128#Dv zz-8buP&~bW!Ow$NfU^HOkd!msARu6hP;$Qyx zLby;a|9~bA_J*+>VlGY(od*Km3o5?nhrVK2rHNz8j}t%Z82BC98roeneTHdsX*a3E z=M0*-@_lvq4ANG+E6>Rbx!z4veO^Hm4~sN?x;>be!Oh{i8SbDnhqjUS5^a=r5A8|X zd9?ha9NtE|llF&U@FMW{Y1f3l>fo+$eK&X`EerkS;JLIVw3}()rkz4-{+t#%vja{I zcyYkz!Ee$|rI8Nq^DVy5raePDhxRm0pT}vxODoWBrEQ?)pZmE`u0KKBLc4)>A1$R_ zO8Y%p{y8&T%mcr!>p82^YQ=xsIpu;~9G9wQPN9;FB$Xu2?2?hVJd(ttW=>z9n(eM; zm2}81A56=Yf*xgTaaxY;oZ;cj^`Z&qR8qSj8cEAZC1zT&XqT4LfpRqDJB4bw9G5B$ z6>Jt)DoJS|v!e-fSH-q47?lR%K07)XmuxaLjCk(b{xZt+C&hTWTeKLh#h%O-qLLmO zO8b)jgr`=mwFRem@?ca+(o$o6J%$m(!*NuON`+XL#iZaSp&FgFCijb7R7gwXy&flP zyuUoCJU)V)g-N9+TBV^j=i0eZVYQi?rmKgd^6HGMa$j7w-Dxo`=bh!rgRz-gtyFkC z8dt14s>B2MkD&A~MXbSLFPwHUFaw6VQ|@lb5s{K7QAEBY3`P!n`OOwD5OnREmqX5$1VG7Og7Awl__Sl?3wV1JQW; z45k%Za3<^SF!Z#FDwG~dOGzayLvRtgnu*LUg3P?MP#q%3ES!#(ifPoBnfXy+(6S07 zw@GGUcYo{>ClTKVqmd-7mTgq(vsq=Wl45>eQn5>uQi&wMBs2g1810bNS58J^`@y=M zS7slqd(rksM#TmF>B6=WYR`*Dk^+Thfip|N zD@N54zRL}6x-*nksXQZT5pUamnBO!fFIZZg)sk}DpRO?rQXX(=x}Y3CP<4e%)o)=8 zx1*x*Ne^EJVsl3_Fj%Bj2*9FBJY;>Y-;t76p54~*#Z??eMq?`OG@Eh1VI~fzGaMI^ z{(@}DlRYqDx^aa`UoP~$;=Jo+DkZw=G$AE}XMJ)9$A>XjN}U_SKwg8xvlu{_QES+j z0H;+krB-qW(c-{(*4SRk-Z$d4)cH8e+|{zU7)M!bdZO}xo0=C|m$4b+E<_<0;y#sO zmR?wnh6j^EX1k+upXrJFEAGoKuMSg55aGIQK0EJ9`YMB_C#A~vqyu&dJJjN+L?E0V zDqNxKJU~wcaE{}%3#cyv6zPF7v|zh)mASbvEKM`EM(ic!oJ_xlPwxW$DIrp;E?`$Y zd6he2k-^V!Im*ta3SKsgldNDC`yH!{X856CRDV0oopEI}Ew2VgtuK1!&a@PpCBxK? z1!+-x2sV2TY0EAvDH}9#wwk3$p+X7HxFA^LEK)y|2kyBL!Mq}M0yeSL%6W-)zNL_} zY?t)+8y8a>S=Huc@lZ-7@$6~r@XNGIm}SmZ_uUk(<Fc+`@PrSkW`rtp(s)RMFfOB9!i%}Ytr|)gVnfjj;iu%=u%9%}JsNXi z4qKG^1%EbD1)OAEf2c9b2NPJFujMw`PIX5qTop=IW|pV@l~K~(EPtTtKx8+|t5ktf zpIN>(Qz=nq=hv?6_QvI*g!*Ul3k(<8W^Q_5vYF3a2nOO;U)6CqXovbO;ou)6GY?93I=wvj9{Tb=mX<=!q-L7p>UmN?G zAIxP$Ig|*Uh@F zzs35?u4_tHcC>eOb=a$}vbt=)ysM+b-e%h^)9KIdnwj6awd)35x+mIi?P#|TKkOf2 zPW!by)4?+{uf1i8scox`)gP_xtsSm!H?>{$b+u!S8f9uP)!yR9mfC(>+h5<##o_vs zwWGCT_4Pb6Ry(N2kJa|q_R>Aj(y_HeOj}nwpsDo@wSCNaoQDt9#%%4lR;V4Q9Y*fa z+R^%!6CQoDzFm^)n>6_yo|HHV-N5ui+}ziAKnwddCYN{&D~?Sn^>BSdeIt5e0ah{* zDTnKuYj2|77)u|hf5+5bLHPCwbdl9t{XH2aEjMBiQ;*80sJ*pK(z6EAZCznwLV$j4)%T74aXBR5`i(R{SN4vw(Mo5YAaF5ZsOBCc|W z=uY6-CTE=V^kWhNV>T$t-lfQ&C<8Xu_MR*qlLKWem!jNeyn-GZ6jsI91P2m1x2pG- zjIZyo&dww9r0T^O9th+kLNqcJ&s3|n@U-iSt5MPjJI5xY*C@cL?6>h z_oS_ExnmSqrT5z|F_A*(dlxnBVU4(-V2n0EC>HX_ zZG#j)zb%P($k#41<_YXN65hx^v0=aJf-7+*cfpTVjN&%2b|HB>hRj5t1_n#>t9&5DHJQKoiBCiB9{&VubSrU3O}>3#!mM zinH<&WnxoR-b$DKTU3!UGaTJohWu(L96(x1&$uH^YfTbK8YPd+K>{&2aT22hscG|` zWQT1^ycY43Og~8s^22#RyIj*Y-8e#sDJV?UR&JjhWo?niRVU>tH6P%KCo6ZvXgM2t zxalGtuGaBDqBzOy$NO9IWnNJz@}rban6L6Y=NC4Q{D&Lp+qCg+LfZrN$5?8EuSN%n z#oKTSVmm3D+(Aewiu}fzP@9p`jye%YHfCxsyBSIWWl!Uf(6s-{3{OnLD6`x_am;6y zhGeflYwCEmPs^Cv({N8TSFSyd;jMc?V;$uS8p`_{-STeNa3?#Rto>ecNDdq0WX-Ww zyyP^132e$PZV+D@=7}MNwp(a7UO?#Q)tgGN1L5I()zS%NqmeeM8RJfGtnaLAT7x`q z+Jc*tqG@=tlxUgKd~$7BbW*A}J?`k{qTeD5vJwW;Pscc{QLH$liko4wulTA5jO z)yLFc$3~J(l(BBfeSRrO$QaryU!|Mgg#0EKb{Bu5JSZ=zkc-mV@uXHb8#Pr)Zn?AK zg!A?&e))`MPP%HM)D882{FsU=2+|>)Q!v4C*`UnW>`q!vSHI_mQ(9whXq;5SS>Oai z$?*Dj(I=QNfkYPq%0Hey%DZgiy;AgQRb;E$-s$T5idiiSH-i^6p z%9yF`Wbys35bCTbuBedU?VV)dJED~e(Tm7^M|3AqcWU=VHI6&FA#$kPv!vS{HRfDh z-$wKp<-Da8rAABs_$<$zAQy$V9SPHkwDCggA9Wena)x|9Cm@Ts)7&lzk~qZbjY%Sr z-~2;^XqHcKuidJKq{7Kn{uvb9uYJa!j`71ZpTI4zS7BRhc|G#1Z91|vr@A&Uw|zAw zy0##NtmPL1D%k|T54gbiOO5@h*Hg&kPn37CM8a~ z!*O!^*lF2-Eg}_ z>v>d3qu+5(I^HzB0r<>l{T1tfdnJ5c6jcVgA5O+N(n6Ax&I66?|9^>h=W2P$oq{K` zd6zN~9gyLV6X8eh@xnpunc?;+S4DV@MM?M5i6@c{CvuA048&oIURaYtj!g}8ysrzC)I$+xr)GXjSEFUWNEyuG~znZeK$G0>h2NE z!;fgF>tDCDwYc9{TrxG^uWz7c@{D(2)1_uovzr*zd=uxKyqz@F+Yn8koDEkglf?Y| zS9<+2q@qQwaW5)+>)YsxAY-ZlD%;`b#=Ii94K38f)|}JeaV%>Hs~zAV2-_LsRO3mD z(rkttWOWqa`3*H~-U#w~5r<>cb$3Vq2N>TVnk%+DVl+;h4H=4=mr~!T6NBGeIEknd zXuI&0{A8^ss71ttQO_!!efF`Wd#CjV@TNuGnd<2K8MY$Ma{irEul!s1=fnR1<;liR literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..3ce757e4d08a7e7e7348d82c930700560e66b5f5 GIT binary patch literal 9402 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 CR=S=5 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/.keep b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/.keep new file mode 100644 index 0000000..e69de29 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg new file mode 100644 index 0000000..41fce36 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg new file mode 100644 index 0000000..aa125be --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg new file mode 100644 index 0000000..fc2640d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg new file mode 100644 index 0000000..2e2ac62 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg new file mode 100644 index 0000000..2c82d74 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg new file mode 100644 index 0000000..cff31b1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg @@ -0,0 +1,35 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg new file mode 100644 index 0000000..d3eadd1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg new file mode 100644 index 0000000..4ca02dc --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg new file mode 100644 index 0000000..f6dfb02 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg new file mode 100644 index 0000000..731c0fd --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg new file mode 100644 index 0000000..c843522 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg new file mode 100644 index 0000000..763a380 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg new file mode 100644 index 0000000..42b8470 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg new file mode 100644 index 0000000..d69ae29 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg new file mode 100644 index 0000000..720fa18 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg new file mode 100644 index 0000000..b6b1393 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg new file mode 100644 index 0000000..4903fd2 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg new file mode 100644 index 0000000..6d15f88 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic.svg new file mode 100644 index 0000000..b0037ad --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg new file mode 100644 index 0000000..ad8d2a5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg new file mode 100644 index 0000000..7d03f0c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg new file mode 100644 index 0000000..ebbaa42 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg new file mode 100644 index 0000000..16e9d9e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg new file mode 100644 index 0000000..976ac04 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg new file mode 100644 index 0000000..7884f4e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg new file mode 100644 index 0000000..251fe3a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg @@ -0,0 +1,103 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg new file mode 100644 index 0000000..73bea1d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg new file mode 100644 index 0000000..2278c4e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg @@ -0,0 +1,92 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg new file mode 100644 index 0000000..a57017e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg new file mode 100644 index 0000000..b271af1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg new file mode 100644 index 0000000..d28b713 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg new file mode 100644 index 0000000..80449b8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg new file mode 100644 index 0000000..c518e65 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg new file mode 100644 index 0000000..5a34df5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg new file mode 100644 index 0000000..63f45e4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg new file mode 100644 index 0000000..a1e5380 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg new file mode 100644 index 0000000..0760fd0 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg new file mode 100644 index 0000000..190f2b7 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg new file mode 100644 index 0000000..d874f4b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg new file mode 100644 index 0000000..daba3ed --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg new file mode 100644 index 0000000..1a583a9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg new file mode 100644 index 0000000..de3118c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg new file mode 100644 index 0000000..6c40cec --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg new file mode 100644 index 0000000..f09fbc5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg new file mode 100644 index 0000000..307ee2c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg @@ -0,0 +1,118 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg new file mode 100644 index 0000000..2ca7f94 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg new file mode 100644 index 0000000..a23a9a9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg new file mode 100644 index 0000000..4bbe335 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg new file mode 100644 index 0000000..bd6251d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg new file mode 100644 index 0000000..21a7907 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg new file mode 100644 index 0000000..42b1780 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg new file mode 100644 index 0000000..7ce4ae4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg new file mode 100644 index 0000000..9924c84 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg new file mode 100644 index 0000000..e352453 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg new file mode 100644 index 0000000..0844542 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg new file mode 100644 index 0000000..55e657a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg new file mode 100644 index 0000000..96aa0fb --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg new file mode 100644 index 0000000..0554b40 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg new file mode 100644 index 0000000..2325b5d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg new file mode 100644 index 0000000..e48c0b9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg new file mode 100644 index 0000000..a346c66 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg new file mode 100644 index 0000000..a15c420 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg new file mode 100644 index 0000000..67553a2 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg new file mode 100644 index 0000000..b2aa610 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg new file mode 100644 index 0000000..b8b2284 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg new file mode 100644 index 0000000..d6c8cee --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg new file mode 100644 index 0000000..946bb65 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg new file mode 100644 index 0000000..a0a2b99 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg @@ -0,0 +1,18 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg new file mode 100644 index 0000000..8e59598 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg new file mode 100644 index 0000000..c1c819c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg new file mode 100644 index 0000000..c7c4a15 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg new file mode 100644 index 0000000..8273e6c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg new file mode 100644 index 0000000..82962c4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg new file mode 100644 index 0000000..169bb1a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg @@ -0,0 +1,138 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg new file mode 100644 index 0000000..02d87d9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg new file mode 100644 index 0000000..43a3cb5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg new file mode 100644 index 0000000..71052b3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg new file mode 100644 index 0000000..e8bf7d6 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg new file mode 100644 index 0000000..d4ce9d8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg new file mode 100644 index 0000000..cfaddfb --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg new file mode 100644 index 0000000..48cda14 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg new file mode 100644 index 0000000..bee800f --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg @@ -0,0 +1,88 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg new file mode 100644 index 0000000..9474a72 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg new file mode 100644 index 0000000..7da31b3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg new file mode 100644 index 0000000..3fbbae0 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg new file mode 100644 index 0000000..c646eae --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg new file mode 100644 index 0000000..7eddf2b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg new file mode 100644 index 0000000..08c3ba8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg new file mode 100644 index 0000000..1179af3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg @@ -0,0 +1,93 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg new file mode 100644 index 0000000..b87c15f --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg @@ -0,0 +1 @@ + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg new file mode 100644 index 0000000..09f7966 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg new file mode 100644 index 0000000..ba04343 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg new file mode 100644 index 0000000..27aa967 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg @@ -0,0 +1,1412 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg new file mode 100644 index 0000000..43e74e7 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg new file mode 100644 index 0000000..7e35c7b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + H: 2.5 x + 1/2 x + 1x + 1x + + 1x + + 1x + + + + + + + + + + + H: 2.5 x + + 1/2 x + + 1x + + 1x + + + + 1x + + + + 1x + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic.svg new file mode 100644 index 0000000..985702d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg new file mode 100644 index 0000000..ad8d2a5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg new file mode 100644 index 0000000..7d03f0c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg new file mode 100644 index 0000000..56c7967 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg @@ -0,0 +1,287 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg new file mode 100644 index 0000000..ebbaa42 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg new file mode 100644 index 0000000..16e9d9e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg new file mode 100644 index 0000000..976ac04 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg new file mode 100644 index 0000000..7884f4e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg new file mode 100644 index 0000000..251fe3a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg @@ -0,0 +1,103 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg new file mode 100644 index 0000000..1179af3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg @@ -0,0 +1,93 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg new file mode 100644 index 0000000..41fce36 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg new file mode 100644 index 0000000..0a1afe7 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg @@ -0,0 +1,330 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg new file mode 100644 index 0000000..73bea1d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg new file mode 100644 index 0000000..2278c4e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg @@ -0,0 +1,92 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg new file mode 100644 index 0000000..a57017e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg new file mode 100644 index 0000000..0687ab4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg @@ -0,0 +1,312 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg new file mode 100644 index 0000000..b271af1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg new file mode 100644 index 0000000..e26d0b1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg @@ -0,0 +1,328 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + Exit To App + + + + Lock Outline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg new file mode 100644 index 0000000..2955da8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg new file mode 100644 index 0000000..077fcc7 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg @@ -0,0 +1,202 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg new file mode 100644 index 0000000..aa125be --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg new file mode 100644 index 0000000..d28b713 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg new file mode 100644 index 0000000..ff230a7 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg @@ -0,0 +1,45 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg new file mode 100644 index 0000000..46b2317 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg @@ -0,0 +1,87 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg new file mode 100644 index 0000000..013cc7c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg @@ -0,0 +1,227 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg new file mode 100644 index 0000000..80449b8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg new file mode 100644 index 0000000..c518e65 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg new file mode 100644 index 0000000..5a34df5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg new file mode 100644 index 0000000..fc2640d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg new file mode 100644 index 0000000..63f45e4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg new file mode 100644 index 0000000..a1e5380 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg new file mode 100644 index 0000000..0760fd0 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg new file mode 100644 index 0000000..190f2b7 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg new file mode 100644 index 0000000..d874f4b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg new file mode 100644 index 0000000..02caa74 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg @@ -0,0 +1,65 @@ + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg new file mode 100644 index 0000000..daba3ed --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg new file mode 100644 index 0000000..1a583a9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg new file mode 100644 index 0000000..de3118c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg new file mode 100644 index 0000000..c969ff2 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg @@ -0,0 +1,285 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg new file mode 100644 index 0000000..2eeaae6 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg @@ -0,0 +1,219 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg new file mode 100644 index 0000000..2e2ac62 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg new file mode 100644 index 0000000..6c40cec --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg new file mode 100644 index 0000000..2c82d74 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg new file mode 100644 index 0000000..447e292 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg new file mode 100644 index 0000000..f09fbc5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg new file mode 100644 index 0000000..307ee2c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg @@ -0,0 +1,118 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg new file mode 100644 index 0000000..2ca7f94 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg new file mode 100644 index 0000000..a23a9a9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg new file mode 100644 index 0000000..cff31b1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg @@ -0,0 +1,35 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg new file mode 100644 index 0000000..4bbe335 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg new file mode 100644 index 0000000..78c769b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg new file mode 100644 index 0000000..24067fd --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg @@ -0,0 +1,163 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg new file mode 100644 index 0000000..bd6251d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg new file mode 100644 index 0000000..21a7907 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg new file mode 100644 index 0000000..42b1780 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg new file mode 100644 index 0000000..09f7966 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg new file mode 100644 index 0000000..eab2c5c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg new file mode 100644 index 0000000..fc8dd05 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg new file mode 100644 index 0000000..020a8e3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg @@ -0,0 +1,322 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg new file mode 100644 index 0000000..7ce4ae4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg new file mode 100644 index 0000000..d3eadd1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg new file mode 100644 index 0000000..501012f --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg @@ -0,0 +1,297 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg new file mode 100644 index 0000000..ba4c27e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg @@ -0,0 +1,290 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg new file mode 100644 index 0000000..9924c84 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg new file mode 100644 index 0000000..e352453 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg new file mode 100644 index 0000000..0844542 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg new file mode 100644 index 0000000..4ca02dc --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg new file mode 100644 index 0000000..1e85ea4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg new file mode 100644 index 0000000..1d75e16 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg new file mode 100644 index 0000000..15e9d51 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg @@ -0,0 +1,76 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg new file mode 100644 index 0000000..49311b4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg new file mode 100644 index 0000000..8a69a7b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg @@ -0,0 +1,384 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg new file mode 100644 index 0000000..47fae59 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg new file mode 100644 index 0000000..e146519 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg @@ -0,0 +1,298 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg new file mode 100644 index 0000000..f6dfb02 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg new file mode 100644 index 0000000..55e657a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg new file mode 100644 index 0000000..731c0fd --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg new file mode 100644 index 0000000..96aa0fb --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg new file mode 100644 index 0000000..0554b40 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg new file mode 100644 index 0000000..2325b5d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg new file mode 100644 index 0000000..e48c0b9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg new file mode 100644 index 0000000..a346c66 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg new file mode 100644 index 0000000..a15c420 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg new file mode 100644 index 0000000..13d524c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg new file mode 100644 index 0000000..8f94a84 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg @@ -0,0 +1,438 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg new file mode 100644 index 0000000..67553a2 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg new file mode 100644 index 0000000..c843522 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg new file mode 100644 index 0000000..763a380 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg new file mode 100644 index 0000000..b2aa610 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg new file mode 100644 index 0000000..42b8470 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg new file mode 100644 index 0000000..2d04fcf --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg @@ -0,0 +1,307 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg new file mode 100644 index 0000000..b8b2284 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg new file mode 100644 index 0000000..d69ae29 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg new file mode 100644 index 0000000..a2e9833 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg @@ -0,0 +1,610 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exit To App + + + + Lock Outline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg new file mode 100644 index 0000000..d6c8cee --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg new file mode 100644 index 0000000..946bb65 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg new file mode 100644 index 0000000..a0a2b99 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg @@ -0,0 +1,18 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg new file mode 100644 index 0000000..fae1077 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg @@ -0,0 +1,208 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg new file mode 100644 index 0000000..8e59598 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg new file mode 100644 index 0000000..c1c819c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg new file mode 100644 index 0000000..c7c4a15 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg new file mode 100644 index 0000000..fdd6224 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg new file mode 100644 index 0000000..5ccb02c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg @@ -0,0 +1,295 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg new file mode 100644 index 0000000..7acd64d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg @@ -0,0 +1,285 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg new file mode 100644 index 0000000..04f57e3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg @@ -0,0 +1,210 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg new file mode 100644 index 0000000..8273e6c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg new file mode 100644 index 0000000..720fa18 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg new file mode 100644 index 0000000..82962c4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg new file mode 100644 index 0000000..169bb1a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg @@ -0,0 +1,138 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg new file mode 100644 index 0000000..02d87d9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg new file mode 100644 index 0000000..43a3cb5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg new file mode 100644 index 0000000..71052b3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg new file mode 100644 index 0000000..e8bf7d6 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg new file mode 100644 index 0000000..ba1c723 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg @@ -0,0 +1,99 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg new file mode 100644 index 0000000..830e664 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg @@ -0,0 +1,543 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg new file mode 100644 index 0000000..d4ce9d8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg new file mode 100644 index 0000000..b5219b3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg @@ -0,0 +1,793 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg new file mode 100644 index 0000000..cfaddfb --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg new file mode 100644 index 0000000..48cda14 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg new file mode 100644 index 0000000..bee800f --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg @@ -0,0 +1,88 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg new file mode 100644 index 0000000..b6b1393 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg new file mode 100644 index 0000000..ff813d5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg @@ -0,0 +1,504 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg new file mode 100644 index 0000000..9474a72 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg new file mode 100644 index 0000000..7da31b3 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg new file mode 100644 index 0000000..3fbbae0 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg new file mode 100644 index 0000000..4903fd2 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg new file mode 100644 index 0000000..022435a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg new file mode 100644 index 0000000..c646eae --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg new file mode 100644 index 0000000..7eddf2b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg new file mode 100644 index 0000000..75ed8b9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg @@ -0,0 +1,392 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg new file mode 100644 index 0000000..f29c05d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg @@ -0,0 +1,86 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg new file mode 100644 index 0000000..08c3ba8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg new file mode 100644 index 0000000..6d15f88 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg new file mode 100644 index 0000000..ff8584d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg @@ -0,0 +1,52 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets new file mode 100644 index 0000000..f2c8e16 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets @@ -0,0 +1,52 @@ +ArcMenu Style//rgba(53,53,53,0.987)//rgb(223,223,223)//rgb(32,32,32)//rgb(21,83,158)//rgba(255,255,255,1)//rgb(32,32,32)//9//1//5//12//24//false// +Simply Dark//rgba(28, 28, 28, 0.98)//rgba(211, 218, 227, 1)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Blue//rgb(25,31,34)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Light Blue//rgb(255,255,255)//rgb(51,51,51)//rgb(235,235,235)//rgba(189,230,251,0.9)//rgba(89,89,89,1)//rgba(189,230,251,0.9)//9//1//5//12//24//true// +Silk Desert//rgba(50,52,73,0.820946)//rgba(211, 218, 227, 1)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//11//0//0//0//0//false// +Breeze//rgb(237,237,243)//rgb(36,36,40)//rgba(63,62,64,0.246622)//rgba(61,174,235,0.55)//rgb(36,36,40)//rgb(210,210,215)//9//1//0//0//0//false// +Breeze Dark//rgb(49,53,61)//rgb(237,237,243)//rgba(63,62,64,0.246622)//rgba(61,174,235,0.55)//rgb(237,237,243)//rgb(65,69,73)//9//1//0//0//0//false// +Dark Blue 2//rgb(50,52,61)//rgb(211,217,227)//rgba(211,217,227,0.2)//rgb(81,149,226)//rgba(255,255,255,1)//rgba(211,217,227,0.5)//9//1//4//0//0//false// +Dark Orange//rgb(51,51,51)//rgb(226,224,221)//rgba(174,167,159,0.2)//rgb(233,84,32)//rgba(255,255,255,1)//rgba(233,84,32,0.5)//9//1//4//12//24//true// +Light Orange//rgb(246,246,245)//rgb(76,76,76)//rgba(51,51,51,0.2)//rgb(233,84,32)//rgba(114,114,114,1)//rgba(233,84,32,0.5)//9//1//4//12//24//true// +Blue Orange//rgb(44,62,80)//rgb(189,195,199)//rgba(189,195,199,0.2)//rgb(231,76,60)//rgba(227,233,237,1)//rgba(189,195,199,0.5)//9//1//4//0//0//false// +Light Purple//rgb(237,245,252)//rgb(39,45,45)//rgba(39,45,45,0.2)//rgba(144,112,164,0.5)//rgba(77,83,83,1)//rgba(144,112,164,0.5)//9//1//6//0//0//false// +Dark Green//rgb(27,34,36)//rgb(243,243,243)//rgba(46,149,130,0.2)//rgb(46,149,130)//rgba(255,255,255,1)//rgba(46,149,130,0.35)//9//1//6//0//0//true// +Gray//rgb(142,142,142)//rgb(255,255,255)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//11//0//0//0//0//false// +Terminal Green//rgba(28, 28, 28, 0.98)//rgb(17,164,40)//rgb(63,62,64)//rgba(17,164,40,0.641892)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Sky Clear//rgba(64,145,191,0.756757)//rgb(243,243,243)//rgb(63,62,64)//rgba(135,64,191,0.253378)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Ubi Purple//rgba(174,64,191,0.523649)//rgb(243,243,243)//rgb(63,62,64)//rgba(189,191,64,0.763514)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Shade//rgb(46,52,54)//rgb(186,189,182)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Red Shade//rgba(191,64,74,0.753378)//rgb(243,243,243)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Tilk Blue//rgba(74,179,228,0.716216)//rgb(243,243,243)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Green Blue//rgb(87,121,89)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Gray Blue//rgb(136,138,133)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Pastel//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgb(233,185,110)//rgb(173,127,168)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 2//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(191,64,190,0.344595)//rgb(114,159,207)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 3//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(64,137,191,0.358108)//rgb(78,154,6)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 4//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(64,191,70,0.307432)//rgb(196,160,0)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgb(233,185,110)//rgb(173,127,168)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 2//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(191,64,190,0.344595)//rgb(114,159,207)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 3//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(64,137,191,0.358108)//rgb(78,154,6)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 4//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(64,191,70,0.307432)//rgb(196,160,0)//rgb(63,62,64)//9//0//0//0//0//false// +Yellow Shade//rgb(196,160,0)//rgb(46,52,54)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Adapta//rgb(250,251,252)//rgb(34,45,50)//rgb(81,84,86)//rgba(0,150,136,0.121711)//rgba(72,83,88,1)//rgb(0,150,136)//11//0//8//12//24//true// +Adapta Nokto//rgb(38,50,56)//rgb(205,215,218)//rgb(38,50,56)//rgba(125,131,134,0.207237)//rgba(243,253,255,1)//rgb(0,188,212)//11//0//8//12//24//true// +Arc//rgb(245,246,247)//rgb(55,54,68)//rgba(82,148,226,0.903915)//rgba(56,55,68,0.0782918)//rgba(93,92,106,1)//rgb(82,148,226)//11//0//8//12//24//true// +Arc Dark//rgb(56,60,74)//rgb(188,195,205)//rgba(82,148,226,0.903915)//rgba(188,195,205,0.188612)//rgba(226,233,243,1)//rgb(82,148,226)//11//0//8//12//24//true// +Pop!_OS Dark//rgb(69,63,63)//rgb(188,185,183)//rgb(68,61,58)//rgba(250,164,26,0.885135)//rgba(226,223,221,1)//rgb(50,128,138)//11//0//8//12//24//true// +Pop!_OS//rgb(250,251,252)//rgb(87,79,74)//rgba(188,185,183,0.722973)//rgba(250,164,26,0.885135)//rgba(125,117,112,1)//rgb(72,185,199)//11//0//8//12//24//true// +McOS CTLina//rgba(243,243,243,0.841549)//rgb(32,32,32)//rgba(243,243,243,0.841549)//rgb(203,204,207)//rgba(70,70,70,1)//rgb(61,140,248)//11//0//8//12//24//true// +McOS CTLina Dark//rgba(47,47,46,0.873239)//rgb(198,194,194)//rgb(44,45,44)//rgb(37,87,214)//rgba(236,232,232,1)//rgb(37,87,214)//11//0//8//12//24//true// +Android Dark Blue//rgb(63,62,64)//rgb(243,243,243)//rgb(0,177,251)//rgba(237,250,12,0.35473)//rgba(255,255,255,1)//rgb(0,177,251)//11//0//4//12//24//true// +Android Light Blue//rgb(255,255,255)//rgb(63,62,64)//rgb(0,177,251)//rgba(237,250,12,0.35473)//rgba(101,100,102,1)//rgb(0,177,251)//11//0//4//12//24//true// +Android Light Green//rgb(255,255,255)//rgb(63,62,64)//rgb(4,149,90)//rgba(143,219,207,0.334459)//rgba(101,100,102,1)//rgb(237,250,12)//11//0//4//12//24//true// +Android Dark Green//rgb(46,52,54)//rgb(243,243,243)//rgb(4,149,90)//rgba(143,219,207,0.334459)//rgba(255,255,255,1)//rgb(237,250,12)//11//0//4//12//24//true// +Android Dark Yaru//rgb(46,52,54)//rgb(243,243,243)//rgb(189,86,53)//rgba(247,186,36,0.405405)//rgba(255,255,255,1)//rgb(189,86,53)//11//0//4//12//24//true// +Android Light Yaru//rgb(255,255,255)//rgb(63,62,64)//rgb(189,86,53)//rgba(247,186,36,0.405405)//rgba(101,100,102,1)//rgb(189,86,53)//11//0//4//12//24//true// +Adapta 4k Dark//rgb(49,59,67)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Adapta 4k Light//rgb(255,255,255)//rgb(46,52,54)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(84,90,92,1)//rgb(4,149,90)//11//1//4//12//24//true// +Neon Yellow Punk//rgb(49,59,67)//rgb(237,250,12)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(248,255,109,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Blue//rgba(49,59,67,0.841216)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Jade//rgba(24,81,58,0.875)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Amber//rgba(84,34,18,0.881757)//rgb(243,243,243)//rgb(247,186,36)//rgba(247,186,36,0.472973)//rgba(255,255,255,1)//rgb(247,186,36)//11//1//4//12//24//true// +Elegant Purple Haze//rgba(41,1,31,0.881757)//rgb(243,243,243)//rgba(112,8,67,0.425676)//rgba(112,8,67,0.425676)//rgba(255,255,255,1)//rgb(176,52,139)//11//0//4//12//24//true// diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuButton.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuButton.js new file mode 100644 index 0000000..ba9c387 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuButton.js @@ -0,0 +1,875 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Clutter, GLib, GObject, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; +const Util = imports.misc.util; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var DASH_TO_PANEL_UUID = 'dash-to-panel@jderose9.github.com'; +var DASH_TO_DOCK_UUID = 'dash-to-dock@micxgx.gmail.com'; +var UBUNTU_DOCK_UUID = 'ubuntu-dock@ubuntu.com'; + +var MenuButton = GObject.registerClass(class Arc_Menu_MenuButton extends PanelMenu.Button{ + _init(settings, arcMenuPlacement, panel, dashIndex) { + super._init(0.5, null, true); + this._settings = settings; + this._panel = panel; + this.menu.destroy(); + this.menu = null; + this.add_style_class_name('arc-menu-panel-menu'); + this.arcMenuPlacement = arcMenuPlacement; + this.tooltipShowing = false; + this.tooltipHidingID = null; + this.tooltipShowingID = null; + this.dtpNeedsRelease = false; + + let menuManagerParent; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL) + menuManagerParent = this._panel; + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + menuManagerParent = this; + + //Create Main Menus - ArcMenu and arcMenu's context menu + this.arcMenu = new ArcMenu(this, 0.5, St.Side.TOP); + this.arcMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.arcMenuContextMenu = new ArcMenuContextMenu(this, 0.5, St.Side.TOP); + this.arcMenuContextMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.menuManager = new PopupMenu.PopupMenuManager(menuManagerParent); + this.menuManager._changeMenu = (menu) => {}; + this.menuManager.addMenu(this.arcMenu); + this.menuManager.addMenu(this.arcMenuContextMenu); + + //Context Menus for applications and other menu items + this.contextMenuManager = new PopupMenu.PopupMenuManager(this); + this.contextMenuManager._changeMenu = (menu) => {}; + this.contextMenuManager._onMenuSourceEnter = (menu) =>{ + if (this.contextMenuManager.activeMenu && this.contextMenuManager.activeMenu != menu) + return Clutter.EVENT_STOP; + + return Clutter.EVENT_PROPAGATE; + } + + //Sub Menu Manager - Control all other popup menus + this.subMenuManager = new PopupMenu.PopupMenuManager(this); + this.subMenuManager._changeMenu = (menu) => {}; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget = new MW.MenuButtonWidget(); + this.x_expand = false; + this.y_expand = false; + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this._delegate = this; + this.menuButtonWidget = new MW.DashMenuButtonWidget(this, this._settings); + this.dash = this._panel._allDocks[dashIndex]; + this.style_class = 'dash-item-container'; + this.child = this.menuButtonWidget.actor; + this.icon = this.menuButtonWidget.icon; + this.label = this.menuButtonWidget.label; + this.container.showLabel = () => this.menuButtonWidget.showLabel(); + this.container.hideLabel = () => this.menuButtonWidget.hideLabel(); + this.container.toggleButton = this.menuButtonWidget.actor; + this.toggleButton = this.menuButtonWidget.actor; + this.container.setDragApp = () => {}; + this.arcMenuContextMenu.addExtensionSettings(this.arcMenuPlacement); + } + + //Add Menu Button Widget to Button + this.add_child(this.menuButtonWidget.actor); + } + + initiate(){ + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + //Dash to Panel Integration + this.dashToPanel = Main.extensionManager.lookup(DASH_TO_PANEL_UUID); + this.extensionChangedId = Main.extensionManager.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === DASH_TO_PANEL_UUID && extension.state === 1) { + this.dashToPanel = Main.extensionManager.lookup(DASH_TO_PANEL_UUID); + this.syncWithDashToPanel(); + } + if (extension.uuid === DASH_TO_PANEL_UUID && extension.state === 2) { + this.dashToPanel = null; + this.arcMenuContextMenu.removeExtensionSettings(); + this.updateArrowSide(St.Side.TOP); + if(this.dtpPostionChangedID>0 && this.extensionSettingsItem){ + this.extensionSettingsItem.disconnect(this.dtpPostionChangedID); + this.dtpPostionChangedID = 0; + } + } + }); + if(this.dashToPanel && this.dashToPanel.stateObj){ + this.syncWithDashToPanel(); + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + //Dash to Dock Integration + this.dtdPostionChangedID = this._panel._settings.connect('changed::dock-position', ()=> { + let side = this._panel._settings.get_enum('dock-position'); + this.updateArrowSide(side); + }); + } + + this._monitorsChangedId = Main.layoutManager.connect('monitors-changed', () => { + this.updateHeight(); + }); + + this._startupCompleteId = Main.layoutManager.connect('startup-complete', () => { + this.updateHeight(); + }); + + this.initiateRecentlyInstalledApps(); + this.setMenuPositionAlignment(); + + //Create Basic Layout + this.createLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.createLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + setDragApp(){ + } + + handleDragOver(source, _actor, _x, _y, _time) { + return imports.ui.dnd.DragMotionResult.NO_DROP; + } + + acceptDrop(source, _actor, _x, _y, _time) { + return false; + } + + syncWithDashToPanel(){ + this.arcMenuContextMenu.addExtensionSettings(this.arcMenuPlacement); + this.extensionSettingsItem = Utils.getSettings('org.gnome.shell.extensions.dash-to-panel', DASH_TO_PANEL_UUID); + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side); + let dashToPanelPositionSettings = 'panel-positions' + try{ + this.extensionSettingsItem.get_string(dashToPanelPositionSettings); + } catch(e){ + dashToPanelPositionSettings = 'panel-position' + } + this.dtpPostionChangedID = this.extensionSettingsItem.connect('changed::' + dashToPanelPositionSettings, ()=> { + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side); + }); + if(global.dashToPanel && global.dashToPanel.panels){ + global.dashToPanel.panels.forEach(p => { + if(p.panel === this._panel){ + this.dtpPanel = p; + } + }); + } + } + + initiateRecentlyInstalledApps(){ + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this._settings.get_boolean('disable-recently-installed-apps')) + return; + + this._appList = this.listAllApps(); + //Update Categories on 'installed-changed' event------------------------------------- + this._installedChangedId = appSys.connect('installed-changed', () => { + this._newAppList = this.listAllApps(); + + //Filter to find if a new application has been installed + let newApps = this._newAppList.filter(app => !this._appList.includes(app)); + + //A New Application has been installed + //Save it in settings + if(newApps.length){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + let newRecentApps = [...new Set(recentApps.concat(newApps))]; + this._settings.set_strv('recently-installed-apps', newRecentApps); + this.MenuLayout.reloadApplications(); + } + + this._appList = this._newAppList; + }); + } + + listAllApps(){ + let appList = appSys.get_installed().filter(appInfo => { + try { + appInfo.get_id(); // catch invalid file encodings + } catch (e) { + return false; + } + return appInfo.should_show(); + }); + return appList.map(app => app.get_id()); + } + + createMenuLayout(){ + this._menuInForcedLocation = false; + this.arcMenu.actor.style = null; + this.arcMenu.removeAll(); + this.section = new PopupMenu.PopupMenuSection(); + this.arcMenu.addMenuItem(this.section); + this.mainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL + }); + this.mainBox._delegate = this.mainBox; + this.section.actor.add_child(this.mainBox); + + this.MenuLayout = Utils.getMenuLayout(this, this._settings.get_enum('menu-layout')); + this.setMenuPositionAlignment(); + this.updateStyle(); + this.forceMenuLocation(); + this.updateHeight(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + reloadMenuLayout(){ + this._menuInForcedLocation = false; + + this.MenuLayout.destroy(); + this.MenuLayout = null; + + this.arcMenu.actor.style = null; + + this.MenuLayout = Utils.getMenuLayout(this, this._settings.get_enum('menu-layout')); + + this.setMenuPositionAlignment(); + this.updateStyle(); + this.forceMenuLocation(); + this.updateHeight(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + setMenuPositionAlignment(){ + let layout = this._settings.get_enum('menu-layout'); + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + let arrowAlignment = (this._settings.get_int('menu-position-alignment') / 100); + if(layout != Constants.MenuLayout.RUNNER){ + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER){ + this.arcMenuContextMenu._arrowAlignment = arrowAlignment + this.arcMenu._arrowAlignment = arrowAlignment + this.arcMenuContextMenu._boxPointer.setSourceAlignment(.5); + this.arcMenu._boxPointer.setSourceAlignment(.5); + } + else if(this.dashToPanel && this.dashToPanel.stateObj){ + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side, false); + } + else{ + this.updateArrowSide(St.Side.TOP, false); + } + } + else{ + this.updateArrowSide(St.Side.TOP, false); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER){ + this.arcMenuContextMenu._arrowAlignment = arrowAlignment + this.arcMenuContextMenu._boxPointer.setSourceAlignment(.5); + } + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(layout != Constants.MenuLayout.RUNNER){ + let side = this._panel._settings.get_enum('dock-position'); + this.updateArrowSide(side, false); + } + else{ + this.updateArrowSide(St.Side.TOP, false); + } + } + } + + updateArrowSide(side, setAlignment = true){ + let arrowAlignment; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget.updateArrowIconSide(side); + if(side === St.Side.RIGHT || side === St.Side.LEFT) + arrowAlignment = 1.0; + else + arrowAlignment = 0.5; + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + arrowAlignment = 0.5; + + this.arcMenuContextMenu._arrowSide = side; + this.arcMenuContextMenu._boxPointer._arrowSide = side; + this.arcMenuContextMenu._boxPointer._userArrowSide = side; + this.arcMenuContextMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenuContextMenu._arrowAlignment = arrowAlignment; + this.arcMenuContextMenu._boxPointer._border.queue_repaint(); + + this.arcMenu._arrowSide = side; + this.arcMenu._boxPointer._arrowSide = side; + this.arcMenu._boxPointer._userArrowSide = side; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = arrowAlignment; + this.arcMenu._boxPointer._border.queue_repaint(); + + if(setAlignment) + this.setMenuPositionAlignment(); + } + + forceMenuLocation(){ + let layout = this._settings.get_enum('menu-layout'); + let forcedMenuLocation = this._settings.get_enum('force-menu-location'); + if(layout === Constants.MenuLayout.RUNNER || layout === Constants.MenuLayout.RAVEN) + return; + + if(forcedMenuLocation === Constants.ForcedMenuLocation.OFF){ + if(!this._menuInForcedLocation) + return; + this.arcMenu.sourceActor = this; + this.arcMenu.focusActor = this; + this.arcMenu._boxPointer.setPosition(this, 0.5); + this.setMenuPositionAlignment(); + this._menuInForcedLocation = false; + return; + } + + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + + if(!this.dummyWidget){ + this.dummyWidget = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyWidget); + } + + if(!this._menuInForcedLocation){ + this.arcMenu.sourceActor = this.dummyWidget; + this.arcMenu.focusActor = this.dummyWidget; + this.arcMenu._boxPointer.setPosition(this.dummyWidget, 0.5); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px;"; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = 0.5; + this._menuInForcedLocation = true; + } + + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let rect = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY; + if(forcedMenuLocation === Constants.ForcedMenuLocation.TOP_CENTERED) + positionY = rect.y + this.rise; + else if(forcedMenuLocation === Constants.ForcedMenuLocation.BOTTOM_CENTERED) + positionY = rect.y + rect.height - this.rise; + this.dummyWidget.set_position(positionX, positionY); + } + + updateStyle(){ + let forcedMenuLocation = this._settings.get_enum('force-menu-location'); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + let layout = this._settings.get_enum('menu-layout'); + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + let gapAdjustment = this._settings.get_int('gap-adjustment'); + + this.arcMenu.actor.set_style_class_name(null); + this.arcMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + this.arcMenuContextMenu.actor.set_style_class_name(null); + this.arcMenuContextMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenuContextMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + if(layout === Constants.MenuLayout.RAVEN){ + this.MenuLayout?.updateStyle(); + return; + } + + if(removeMenuArrow){ + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px; -boxpointer-gap: " + gapAdjustment + "px;"; + this.arcMenu.box.style = "margin:0px;"; + } + else if(forcedMenuLocation === Constants.ForcedMenuLocation.OFF){ + this.arcMenu.actor.style = "-boxpointer-gap: " + gapAdjustment + "px;"; + this.arcMenu.box.style = null; + } + + this.MenuLayout?.updateStyle(); + } + + vfunc_event(event){ + if (event.type() === Clutter.EventType.BUTTON_PRESS){ + if(event.get_button() == 1){ + this.toggleMenu(); + } + else if(event.get_button() == 3){ + this.arcMenuContextMenu.toggle(); + } + } + else if(event.type() === Clutter.EventType.TOUCH_BEGIN){ + this.toggleMenu(); + } + else if(event.type() === Clutter.EventType.ENTER && this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this.menuButtonWidget.actor.add_style_pseudo_class('selected'); + this.menuButtonWidget._icon.add_style_pseudo_class('active'); + } + else if(event.type() === Clutter.EventType.LEAVE && this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + this.menuButtonWidget.actor.remove_style_pseudo_class('selected'); + this.menuButtonWidget._icon.remove_style_pseudo_class('active'); + } + } + return Clutter.EVENT_PROPAGATE; + } + + toggleMenu(){ + if(this.contextMenuManager.activeMenu) + this.contextMenuManager.activeMenu.toggle(); + if(this.subMenuManager.activeMenu) + this.subMenuManager.activeMenu.toggle(); + + this.forceMenuLocation(); + let layout = this._settings.get_enum('menu-layout'); + if(layout === Constants.MenuLayout.GNOME_OVERVIEW){ + if(this._settings.get_boolean('gnome-dash-show-applications')){ + Main.overview._overview._controls._toggleAppsPage(); + } + else + Main.overview.toggle(); + } + else if(!this.arcMenu.isOpen){ + if(layout === Constants.MenuLayout.RUNNER || layout === Constants.MenuLayout.RAVEN) + this.MenuLayout.updateLocation(); + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + if(this.dtpPanel){ + if(this.dtpPanel.intellihide?.enabled){ + this.dtpPanel.intellihide._revealPanel(true); + this.dtpPanel.intellihide.revealAndHold(1); + } + else if(!this.dtpPanel.panelBox.visible){ + this.dtpPanel.panelBox.visible = true; + this.dtpNeedsHiding = true; + } + } + else if(this._panel === Main.panel && !Main.layoutManager.panelBox.visible){ + Main.layoutManager.panelBox.visible = true; + this.mainPanelNeedsHiding = true; + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(this.dash.getDockState() === 0){ + this.dash._removeAnimations(); + this.dash._animateIn(0, 0); + } + } + this.arcMenu.toggle(); + if(this.arcMenu.isOpen && this.MenuLayout){ + if(this.MenuLayout.activeMenuItem && this.MenuLayout.layoutProperties.SupportsCategoryOnHover) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + else if(this.arcMenu.isOpen){ + this.arcMenu.toggle(); + } + } + + getActiveMenu(){ + if(this.contextMenuManager.activeMenu) + return this.contextMenuManager.activeMenu; + else if(this.subMenuManager.activeMenu) + return this.subMenuManager.activeMenu; + else if(this.arcMenu.isOpen) + return this.arcMenu; + else if(this.arcMenuContextMenu.isOpen) + return this.arcMenuContextMenu; + else + return null; + } + + toggleArcMenuContextMenu(){ + if(this.arcMenuContextMenu.isOpen) + this.arcMenuContextMenu.toggle(); + } + + updateHeight(){ + let layout = this._settings.get_enum('menu-layout'); + + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + let monitorWorkArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor); + + if(height > monitorWorkArea.height){ + height = (monitorWorkArea.height * 8) / 10; + } + + if(!(layout == Constants.MenuLayout.SIMPLE || layout == Constants.MenuLayout.SIMPLE_2 || layout == Constants.MenuLayout.RUNNER) && this.MenuLayout) + this.mainBox.style = `height: ${height}px`; + if(this.MenuLayout?.updateWidth) + this.MenuLayout.updateWidth(true); + } + + _onDestroy(){ + if (this._monitorsChangedId){ + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = null; + } + if (this._startupCompleteId){ + Main.layoutManager.disconnect(this._startupCompleteId); + this._startupCompleteId = null; + } + if(this.createLayoutID){ + GLib.source_remove(this.createLayoutID); + this.createLayoutID = null; + } + if(this.updateMenuLayoutID){ + GLib.source_remove(this.updateMenuLayoutID); + this.updateMenuLayoutID = null; + } + if(this.tooltipShowingID){ + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if(this.tooltipHidingID){ + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.extensionChangedId){ + Main.extensionManager.disconnect(this.extensionChangedId); + this.extensionChangedId = null; + } + if(this.dtpPostionChangedID && this.extensionSettingsItem){ + this.extensionSettingsItem.disconnect(this.dtpPostionChangedID); + this.dtpPostionChangedID = null; + } + if(this.dtdPostionChangedID && this._panel._settings){ + this._panel._settings.disconnect(this.dtdPostionChangedID); + this.dtdPostionChangedID = null; + } + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this.MenuLayout) + this.MenuLayout.destroy(); + if(this.arcMenu) + this.arcMenu.destroy(); + if(this.arcMenuContextMenu) + this.arcMenuContextMenu.destroy(); + if(this.dummyWidget) + this.dummyWidget.destroy(); + + super._onDestroy(); + } + + updateMenuLayout(){ + this.tooltipShowing = false; + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.MenuLayout){ + this.MenuLayout.destroy(); + this.MenuLayout = null; + } + this.updateMenuLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.updateMenuLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + loadExtraPinnedApps(){ + if(this.MenuLayout) + this.MenuLayout.loadExtraPinnedApps(); + } + + updateLocation(){ + if(this.MenuLayout && this.MenuLayout.updateLocation) + this.MenuLayout.updateLocation(); + } + + displayPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.displayPinnedApps(); + } + + loadPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.loadPinnedApps(); + } + + reload(){ + if(this.MenuLayout){ + this.reloadMenuLayout(); + } + } + + shouldLoadPinnedApps(){ + if(this.MenuLayout) + return this.MenuLayout.shouldLoadPinnedApps; + } + + setDefaultMenuView(){ + if(this.MenuLayout) + this.MenuLayout.setDefaultMenuView(); + } + + _onOpenStateChanged(menu, open) { + if(open){ + //Avoid Super L hotkey conflicts with Pop Shell extension by + //setting 'overlay-key' mode to Shell.ActionMode.ALL. + let hotKeyPos = this._settings.get_enum('menu-hotkey'); + if(hotKeyPos === Constants.HotKey.SUPER_L) + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.ALL); + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget.setActiveStylePseudoClass(true); + this.add_style_pseudo_class('active'); + + if(Main.panel.menuManager && Main.panel.menuManager.activeMenu) + Main.panel.menuManager.activeMenu.toggle(); + + if(this.dtpPanel && !this.dtpNeedsRelease){ + if(this.dtpPanel.intellihide?.enabled){ + this.dtpNeedsRelease = true; + } + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this.menuButtonWidget.hideLabel(); + if(this.dash._autohideIsEnabled || this.dash._intellihideIsEnabled){ + this.dtdNeedsHiding = true; + this.dash._autohideIsEnabled = false; + this.dash._intellihideIsEnabled = false; + } + this.menuButtonWidget.actor.add_style_pseudo_class('selected'); + this.menuButtonWidget._icon.add_style_pseudo_class('active'); + } + } + else{ + if(!this.arcMenu.isOpen){ + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + this.tooltipShowing = false; + if(this.activeTooltip){ + this.activeTooltip.hide(); + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + } + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + if(this.dtpPanel && this.dtpNeedsRelease && !this.dtpNeedsHiding){ + this.dtpNeedsRelease = false; + this.dtpPanel.intellihide?.release(1); + } + if(this.dtpPanel && this.dtpNeedsHiding){ + this.dtpNeedsHiding = false; + this.dtpPanel.panelBox.visible = false; + } + if(this.mainPanelNeedsHiding){ + Main.layoutManager.panelBox.visible = false; + this.mainPanelNeedsHiding = false; + } + this.menuButtonWidget.setActiveStylePseudoClass(false); + this.remove_style_pseudo_class('active'); + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + if(this.dtdNeedsHiding){ + let dtdSettings = Utils.getSettings('org.gnome.shell.extensions.dash-to-dock', DASH_TO_DOCK_UUID); + if(dtdSettings){ + this.dash._autohideIsEnabled = dtdSettings.get_boolean('autohide'); + this.dash._intellihideIsEnabled = dtdSettings.get_boolean('intellihide'); + } + this.dash._box.sync_hover(); + this.dash._updateDashVisibility(); + this.dtdNeedsHiding = false; + } + + this.menuButtonWidget.actor.remove_style_pseudo_class('selected'); + if(!this.menuButtonWidget.actor.hover) + this.menuButtonWidget._icon.remove_style_pseudo_class('active'); + } + } + } + } +}); + +var ArcMenu = class Arc_Menu_ArcMenu extends PopupMenu.PopupMenu{ + constructor(sourceActor, arrowAlignment, arrowSide) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this._menuButton = sourceActor; + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + this._boxPointer.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this._menuClosedID = this.connect('menu-closed', () => this._menuButton.setDefaultMenuView()); + this.connect('destroy', () => this._onDestroy()); + } + + open(animate){ + if(!this.isOpen) + this._menuButton.arcMenu.actor._muteInput = false; + super.open(animate); + } + + close(animate){ + if(this.isOpen){ + if(this._menuButton.contextMenuManager.activeMenu) + this._menuButton.contextMenuManager.activeMenu.toggle(); + if(this._menuButton.subMenuManager.activeMenu) + this._menuButton.subMenuManager.activeMenu.toggle(); + } + + super.close(animate); + } + + _onDestroy(){ + if(this._menuClosedID){ + this.disconnect(this._menuClosedID) + this._menuClosedID = null; + } + } +}; + +var ArcMenuContextMenu = class Arc_Menu_ArcMenuContextMenu extends PopupMenu.PopupMenu { + constructor(sourceActor, arrowAlignment, arrowSide) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this._menuButton = sourceActor; + this.extensionSettingsItem = false; + + this.actor.add_style_class_name('panel-menu'); + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + + this.addMenuItem(this.createQuickLinkItem(_("ArcMenu Settings"), Constants.PrefsVisiblePage.MAIN)); + + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.addMenuItem(separator); + + let item = new PopupMenu.PopupMenuItem(_("Settings Quick Links:"), { + activate: false, + reactive: false + }); + item.add_style_class_name("margin-box arcmenu-menu-item"); + this.addMenuItem(item); + + this.addMenuItem(this.createQuickLinkItem(_("Change Menu Layout"), Constants.PrefsVisiblePage.MENU_LAYOUT)); + this.addMenuItem(this.createQuickLinkItem(_("Layout Tweaks"), Constants.PrefsVisiblePage.LAYOUT_TWEAKS)); + this.addMenuItem(this.createQuickLinkItem(_("Customize Menu"), Constants.PrefsVisiblePage.CUSTOMIZE_MENU)); + this.addMenuItem(this.createQuickLinkItem(_("Button Appearance"), Constants.PrefsVisiblePage.BUTTON_APPEARANCE)); + + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.addMenuItem(separator); + + this.addMenuItem(this.createQuickLinkItem(_("About"), Constants.PrefsVisiblePage.ABOUT)); + } + + addExtensionSettings(arcMenuPlacement){ + if(!this.extensionSettingsItem){ + let extensionCommand, extensionName; + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + extensionName = _("Dash to Panel Settings"); + extensionCommand = 'gnome-extensions prefs ' + DASH_TO_PANEL_UUID; + } + else if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + let dashToDock = Main.extensionManager.lookup(DASH_TO_DOCK_UUID); + let ubuntuDash = Main.extensionManager.lookup(UBUNTU_DOCK_UUID); + if(dashToDock && dashToDock.stateObj && dashToDock.stateObj.dockManager){ + extensionName = _("Dash to Dock Settings"); + extensionCommand = 'gnome-extensions prefs ' + DASH_TO_DOCK_UUID; + } + if(ubuntuDash && ubuntuDash.stateObj && ubuntuDash.stateObj.dockManager){ + extensionName = _("Ubuntu Dock Settings"); + extensionCommand = 'gnome-control-center ubuntu'; + } + } + + let item = new PopupMenu.PopupMenuItem(_(extensionName)); + item.add_style_class_name("margin-box arcmenu-menu-item"); + item.connect('activate', ()=>{ + Util.spawnCommandLine(extensionCommand); + }); + this.addMenuItem(item, 1); + this.extensionSettingsItem = true; + } + } + + removeExtensionSettings(){ + let children = this._getMenuItems(); + children[1].destroy(); + this.extensionSettingsItem = false; + } + + createQuickLinkItem(title, prefsVisiblePage){ + let item = new PopupMenu.PopupMenuItem(_(title)); + item.add_style_class_name("margin-box arcmenu-menu-item"); + item.connect('activate', ()=>{ + this._settings.set_int('prefs-visible-page', prefsVisiblePage); + Util.spawnCommandLine(Constants.ArcMenuSettingsCommand); + }); + return item; + } +}; diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js new file mode 100644 index 0000000..c38431f --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js @@ -0,0 +1,3693 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); +const {Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Shell, St} = imports.gi; +const AccountsService = imports.gi.AccountsService; +const AppFavorites = imports.ui.appFavorites; +const BoxPointer = imports.ui.boxpointer; +const Constants = Me.imports.constants; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Signals = imports.signals; +const _SystemActions = imports.misc.systemActions; +const SystemActions = _SystemActions.getDefault(); +const Util = imports.misc.util; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; +const { loadInterfaceXML } = imports.misc.fileUtils; + +const ClocksIntegrationIface = loadInterfaceXML('org.gnome.Shell.ClocksIntegration'); +const ClocksProxy = Gio.DBusProxy.makeProxyWrapper(ClocksIntegrationIface); + +Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish'); +Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish'); + +const INDICATOR_ICON_SIZE = 18; +const USER_AVATAR_SIZE = 28; + +function activatePowerOption(powerType, arcMenu){ + arcMenu.itemActivated(BoxPointer.PopupAnimation.NONE); + if(powerType === Constants.PowerType.POWER_OFF) + SystemActions.activatePowerOff(); + else if(powerType === Constants.PowerType.RESTART) + SystemActions.activateRestart ? SystemActions.activateRestart() : SystemActions.activatePowerOff(); + else if(powerType === Constants.PowerType.LOCK) + SystemActions.activateLockScreen(); + else if(powerType === Constants.PowerType.LOGOUT) + SystemActions.activateLogout(); + else if(powerType === Constants.PowerType.SUSPEND) + SystemActions.activateSuspend(); + else if(powerType === Constants.PowerType.HYBRID_SLEEP) + Utils.activateHybridSleep(); + else if(powerType === Constants.PowerType.HIBERNATE) + Utils.activateHibernate(); +} + +var ApplicationContextItems = GObject.registerClass({ + Signals: { + 'close-context-menu': { }, + }, + +}, class Arc_Menu_ApplicationContextItems extends St.BoxLayout{ + _init(actor, app, menuLayout){ + super._init({ + vertical: true, + x_expand: true, + y_expand: true, + style_class: 'margin-box', + }); + this._menuLayout = menuLayout; + this._settings = menuLayout._settings; + this._menuButton = menuLayout.menuButton; + this._app = app; + this.sourceActor = actor; + this.layout = this._settings.get_enum('menu-layout'); + + this.discreteGpuAvailable = false; + this._switcherooNotifyId = global.connect('notify::switcheroo-control', + () => this._updateDiscreteGpuAvailable()); + this._updateDiscreteGpuAvailable(); + } + + set path(path){ + this._path = path; + } + + _updateDiscreteGpuAvailable() { + this._switcherooProxy = global.get_switcheroo_control(); + if (this._switcherooProxy) { + let prop = this._switcherooProxy.get_cached_property('HasDualGpu'); + this.discreteGpuAvailable = prop?.unpack() ?? false; + } else { + this.discreteGpuAvailable = false; + } + } + + closeMenus(){ + this.close(); + this._menuLayout.arcMenu.toggle(); + } + + close(){ + this.emit('close-context-menu'); + } + + rebuildItems(){ + this.destroy_all_children(); + if(this._app instanceof Shell.App){ + this.appInfo = this._app.get_app_info(); + let actions = this.appInfo.list_actions(); + + let windows = this._app.get_windows().filter( + w => !w.skip_taskbar + ); + + if (windows.length > 0){ + let item = new PopupMenu.PopupMenuItem(_("Current Windows:"), { + reactive: false, + can_focus: false + }); + item.actor.add_style_class_name('inactive'); + this.add_child(item); + + windows.forEach(window => { + let title = window.title ? window.title + : this._app.get_name(); + let item = this._appendMenuItem(title); + item.connect('activate', () => { + this.closeMenus(); + Main.activateWindow(window); + }); + }); + this._appendSeparator(); + } + + if (!this._app.is_window_backed()) { + if (this._app.can_open_new_window() && !actions.includes('new-window')) { + let newWindowItem = this._appendMenuItem(_("New Window")); + newWindowItem.connect('activate', () => { + this.closeMenus(); + this._app.open_new_window(-1); + }); + } + if (this.discreteGpuAvailable && this._app.state == Shell.AppState.STOPPED) { + const appPrefersNonDefaultGPU = this.appInfo.get_boolean('PrefersNonDefaultGPU'); + const gpuPref = appPrefersNonDefaultGPU + ? Shell.AppLaunchGpu.DEFAULT + : Shell.AppLaunchGpu.DISCRETE; + + this._onGpuMenuItem = this._appendMenuItem(appPrefersNonDefaultGPU + ? _('Launch using Integrated Graphics Card') + : _('Launch using Discrete Graphics Card')); + + this._onGpuMenuItem.connect('activate', () => { + this.closeMenus(); + this._app.launch(0, -1, gpuPref); + }); + } + + for (let i = 0; i < actions.length; i++) { + let action = actions[i]; + let item; + if(action === "empty-trash-inactive"){ + item = new PopupMenu.PopupMenuItem(this.appInfo.get_action_name(action), {reactive:false, can_focus:false}); + item.actor.add_style_class_name('inactive'); + this._appendSeparator(); + this.add_child(item); + } + else if(action === "empty-trash"){ + this._appendSeparator(); + item = this._appendMenuItem(this.appInfo.get_action_name(action)); + } + else{ + item = this._appendMenuItem(this.appInfo.get_action_name(action)); + } + + item.connect('activate', (emitter, event) => { + this.closeMenus(); + this._app.launch_action(action, event.get_time(), -1); + }); + } + + //If Trash Can, we don't want to add the rest of the entries below. + if(this.appInfo.get_string('Id') === "ArcMenu_Trash") + return false; + + let desktopIcons = Main.extensionManager.lookup("desktop-icons@csoriano"); + let desktopIconsNG = Main.extensionManager.lookup("ding@rastersoft.com"); + if((desktopIcons && desktopIcons.stateObj) || (desktopIconsNG && desktopIconsNG.stateObj)){ + this._appendSeparator(); + let fileDestination = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP); + let src = Gio.File.new_for_path(this.appInfo.get_filename()); + let dst = Gio.File.new_for_path(GLib.build_filenamev([fileDestination, src.get_basename()])); + let exists = dst.query_exists(null); + if(exists) { + let item = this._appendMenuItem(_("Delete Desktop Shortcut")); + item.connect('activate', () => { + if(src && dst){ + try { + dst.delete(null); + } catch (e) { + log(`Failed to delete shortcut: ${e.message}`); + } + } + this.close(); + }); + } + else { + let item = this._appendMenuItem(_("Create Desktop Shortcut")); + item.connect('activate', () => { + if(src && dst){ + try { + // copy_async() isn't introspectable :-( + src.copy(dst, Gio.FileCopyFlags.OVERWRITE, null, null); + this._markTrusted(dst); + } catch (e) { + log(`Failed to copy to desktop: ${e.message}`); + } + } + this.close(); + }); + } + } + + let canFavorite = global.settings.is_writable('favorite-apps'); + if (canFavorite) { + this._appendSeparator(); + let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._app.get_id()); + if (isFavorite) { + let item = this._appendMenuItem(_("Remove from Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.removeFavorite(this._app.get_id()); + this.close(); + }); + } else { + let item = this._appendMenuItem(_("Add to Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.addFavorite(this._app.get_id()); + this.close(); + }); + } + } + + let pinnedApps = this._settings.get_strv('pinned-app-list'); + let pinnedAppID = []; + + //filter pinnedApps list by every 3rd entry in list. 3rd entry contains an appID or command + for(let i = 2; i < pinnedApps.length; i += 3){ + pinnedAppID.push(pinnedApps[i]); + } + let isAppPinned = pinnedAppID.find((element) => { + return element == this._app.get_id(); + }); + + //if app is pinned and menulayout has PinnedApps category, show Unpin from ArcMenu entry + if(isAppPinned && this._menuLayout.hasPinnedApps) { + let item = this._appendMenuItem(_("Unpin from ArcMenu")); + item.connect('activate', ()=>{ + this.close(); + for(let i = 0; i < pinnedApps.length; i += 3){ + if(pinnedApps[i + 2] === this._app.get_id()){ + pinnedApps.splice(i, 3); + this._settings.set_strv('pinned-app-list', pinnedApps); + break; + } + } + }); + } + else if(this._menuLayout.hasPinnedApps) { + let item = this._appendMenuItem(_("Pin to ArcMenu")); + item.connect('activate', ()=>{ + this.close(); + pinnedApps.push(this.appInfo.get_display_name()); + pinnedApps.push(''); + pinnedApps.push(this._app.get_id()); + this._settings.set_strv('pinned-app-list',pinnedApps); + }); + } + + if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) { + this._appendSeparator(); + let item = this._appendMenuItem(_("Show Details")); + item.connect('activate', () => { + let id = this._app.get_id(); + let args = GLib.Variant.new('(ss)', [id, '']); + Gio.DBus.get(Gio.BusType.SESSION, null, (o, res) => { + let bus = Gio.DBus.get_finish(res); + bus.call('org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Actions', 'Activate', + GLib.Variant.new('(sava{sv})', + ['details', [args], null]), + null, 0, -1, null, null); + this.closeMenus(); + }); + }); + } + } + } + else if(this._path){ + let newWindowItem = this._appendMenuItem(_("Open Folder Location")); + newWindowItem.connect('activate', () => { + let file = Gio.File.new_for_path(this._path); + let context = global.create_app_launch_context(Clutter.get_current_event().get_time(), -1) + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(file.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + this.closeMenus(); + }); + } + else if(this._menuLayout.hasPinnedApps && this.sourceActor instanceof PinnedAppsMenuItem) { + let item = this._appendMenuItem(_("Unpin from ArcMenu")); + item.connect('activate', () => { + this.close(); + let pinnedApps = this._settings.get_strv('pinned-app-list'); + for(let i = 0; i < pinnedApps.length; i += 3){ + if(pinnedApps[i + 2] === this._app){ + pinnedApps.splice(i, 3); + this._settings.set_strv('pinned-app-list', pinnedApps); + break; + } + } + }); + } + } + + //_markTrusted function borrowed from + //https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/tree/master/extensions/apps-menu + async _markTrusted(file) { + let modeAttr = Gio.FILE_ATTRIBUTE_UNIX_MODE; + let trustedAttr = 'metadata::trusted'; + let queryFlags = Gio.FileQueryInfoFlags.NONE; + let ioPriority = GLib.PRIORITY_DEFAULT; + + try { + let info = await file.query_info_async(modeAttr, queryFlags, ioPriority, null); + + let mode = info.get_attribute_uint32(modeAttr) | 0o100; + info.set_attribute_uint32(modeAttr, mode); + info.set_attribute_string(trustedAttr, 'yes'); + await file.set_attributes_async(info, queryFlags, ioPriority, null); + + // Hack: force nautilus to reload file info + info = new Gio.FileInfo(); + info.set_attribute_uint64( + Gio.FILE_ATTRIBUTE_TIME_ACCESS, GLib.get_real_time()); + try { + await file.set_attributes_async(info, queryFlags, ioPriority, null); + } catch (e) { + log(`Failed to update access time: ${e.message}`); + } + } catch (e) { + log(`Failed to mark file as trusted: ${e.message}`); + } + } + + _appendSeparator() { + let separator = new ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.add_child(separator); + } + + _appendMenuItem(labelText) { + let item = new ArcMenuPopupBaseMenuItem(this._menuLayout); + this.label = new St.Label({ + text: _(labelText), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + item.add_child(this.label); + this.add_child(item); + return item; + } +}); + +var ApplicationContextMenu = class Arc_Menu_ApplicationContextMenu extends PopupMenu.PopupMenu { + constructor(actor, app, menuLayout){ + super(actor, 0.0, St.Side.TOP); + this._menuLayout = menuLayout; + this._settings = menuLayout._settings; + this._menuButton = menuLayout.menuButton; + this._app = app; + this.layout = this._settings.get_enum('menu-layout'); + this._boxPointer.setSourceAlignment(.20); + this._boxPointer._border.queue_repaint(); + this.blockSourceEvents = true; + Main.uiGroup.add_child(this.actor); + this._menuLayout.contextMenuManager.addMenu(this); + this.contextMenuItems = new ApplicationContextItems(actor, app, menuLayout); + this.contextMenuItems.connect('close-context-menu', () => this.toggle()); + this.contextMenuItems._delegate = this.contextMenuItems; + this.box.add_child(this.contextMenuItems); + this.sourceActor = actor; + this.sourceActor.connect("destroy", ()=> { + if(this.isOpen) + this.close(); + Main.uiGroup.remove_child(this.actor); + this.contextMenuItems.destroy(); + this.destroy(); + }); + } + + centerBoxPointerPosition(){ + this._boxPointer.setSourceAlignment(.50); + this._arrowAlignment = .5; + this._boxPointer._border.queue_repaint(); + } + + rightBoxPointerPosition(){ + this._arrowSide = St.Side.LEFT; + this._boxPointer._arrowSide = St.Side.LEFT; + this._boxPointer._userArrowSide = St.Side.LEFT; + this._boxPointer.setSourceAlignment(.50); + this._arrowAlignment = .5; + this._boxPointer._border.queue_repaint(); + } + + set path(path){ + this.contextMenuItems.path = path; + } + + open(animate){ + if(this._menuLayout.searchResults && this.sourceActor !== this._menuLayout.searchResults.getTopResult()) + this._menuLayout.searchResults.getTopResult()?.remove_style_pseudo_class('active'); + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + this._menuButton.tooltipShowing = false; + } + if(this.sourceActor.tooltip){ + this.sourceActor.tooltip.hide(); + this._menuButton.tooltipShowing = false; + } + + super.open(animate); + } + + close(animate){ + super.close(animate); + if(this.sourceActor instanceof ArcMenuButtonItem) + this.sourceActor.sync_hover(); + else{ + this.sourceActor.active = false; + } + + this.sourceActor.sync_hover(); + this.sourceActor.hovered = this.sourceActor.hover; + } + + rebuildItems(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + if(customStyle){ + this.actor.style_class = 'arc-menu-boxpointer'; + this.actor.add_style_class_name('arc-menu'); + } + else{ + this.actor.style_class = 'popup-menu-boxpointer'; + this.actor.add_style_class_name('popup-menu'); + } + + this.contextMenuItems.rebuildItems(); + } + + _onKeyPress(actor, event) { + return Clutter.EVENT_PROPAGATE; + } +}; + +var ArcMenuPopupBaseMenuItem = GObject.registerClass({ + Properties: { + 'active': GObject.ParamSpec.boolean('active', 'active', 'active', + GObject.ParamFlags.READWRITE, + false), + 'hovered': GObject.ParamSpec.boolean('hovered', 'hovered', 'hovered', + GObject.ParamFlags.READWRITE, + false), + 'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive', + GObject.ParamFlags.READWRITE, + true), + }, + Signals: { + 'activate': { param_types: [Clutter.Event.$gtype] }, + }, + +}, class Arc_Menu_PopupBaseMenuItem extends St.BoxLayout{ + _init(menuLayout, params){ + params = imports.misc.params.parse(params, { + reactive: true, + activate: true, + hover: true, + style_class: null, + can_focus: true, + }); + super._init({ style_class: 'popup-menu-item arcmenu-menu-item', + reactive: params.reactive, + track_hover: params.reactive, + can_focus: params.can_focus, + accessible_role: Atk.Role.MENU_ITEM + }); + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this.hasContextMenu = false; + this._delegate = this; + this._menuLayout = menuLayout; + this.arcMenu = this._menuLayout.arcMenu; + this.shouldShow = true; + this._parent = null; + this._active = false; + this._activatable = params.reactive && params.activate; + this._sensitive = true; + + this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' }); + this.add_child(this._ornamentLabel); + + this.x_align = Clutter.ActorAlign.FILL; + this.x_expand = true; + + if (!this._activatable) + this.add_style_class_name('popup-inactive-menu-item'); + + if (params.style_class) + this.add_style_class_name(params.style_class); + + if (params.reactive && params.hover) + this.bind_property('hover', this, 'hovered', GObject.BindingFlags.SYNC_CREATE); + + if(params.hover) + this.actor.connect('notify::hover', this._onHover.bind(this)); + + this.arcMenuOpenStateChangeID = this.arcMenu.connect('open-state-changed', (menu, open) =>{ + if(!open) + this.cancelPopupTimeout(); + }); + + let textureCache = St.TextureCache.get_default(); + let iconThemeChangedId = textureCache.connect('icon-theme-changed', this._updateIcon.bind(this)); + this.connect('destroy', () => { + textureCache.disconnect(iconThemeChangedId); + this._onDestroy(); + }); + } + + _updateIcon() { + if(!this._iconBin || !this.createIcon) + return; + + let icon = this.createIcon(); + this._iconBin.set_child(icon); + } + + get actor() { + return this; + } + + get active(){ + return this._active; + } + + set active(active) { + if(this.isDestroyed) + return; + let activeChanged = active != this.active; + if(activeChanged){ + this._active = active; + if(active){ + if(this._menuLayout.activeMenuItem !== this) + this._menuLayout.activeMenuItem = this; + this.remove_style_class_name('selected'); + this.add_style_pseudo_class('active'); + if(this.can_focus) + this.grab_key_focus(); + } + else{ + this.remove_style_pseudo_class('active'); + this.remove_style_class_name('selected'); + } + this.notify('active'); + } + } + + set hovered(hover) { + let hoverChanged = hover != this.hovered; + if(hoverChanged){ + let isActiveStyle = this.get_style_pseudo_class()?.includes('active') + if(hover && !isActiveStyle){ + this.add_style_class_name('selected'); + } + else{ + this.remove_style_class_name('selected'); + } + } + } + + setShouldShow(){ + //If a saved shortcut link is a desktop app, check if currently installed. + //Do NOT display if application not found. + if(this._command.endsWith(".desktop") && !Shell.AppSystem.get_default().lookup_app(this._command)){ + this.shouldShow = false; + } + } + + _onHover() { + if(this.tooltip === undefined && this.actor.hover && this.label){ + let description = this.description; + if(this._app) + description = this._app.get_description(); + Utils.createTooltip(this._menuLayout, this, this.label, description, this._displayType ? this._displayType : -1); + } + } + + vfunc_button_press_event(){ + let event = Clutter.get_current_event(); + this.pressed = false; + if(event.get_button() == 1){ + this._menuLayout._blockActivateEvent = false; + this.pressed = true; + if(this.hasContextMenu) + this.contextMenuTimeOut(); + } + else if(event.get_button() == 3){ + this.pressed = true; + } + this.active = true; + return Clutter.EVENT_PROPAGATE; + } + + vfunc_button_release_event(){ + let event = Clutter.get_current_event(); + if(event.get_button() == 1 && !this._menuLayout._blockActivateEvent && this.pressed){ + this.pressed = false; + this.activate(event); + if(!(this instanceof CategoryMenuItem) && !(this instanceof ArcMenuButtonItem)) + this.active = false; + return Clutter.EVENT_STOP; + } + if(event.get_button() == 3 && this.pressed){ + this.pressed = false; + if(this.hasContextMenu) + this.popupContextMenu(); + else if(!(this instanceof CategoryMenuItem && !(this instanceof ArcMenuButtonItem))){ + this.active = false; + this.hovered = true; + } + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + vfunc_key_focus_in() { + super.vfunc_key_focus_in(); + if(!this.actor.hover) + this._menuLayout._keyFocusIn(this.actor); + this.active = true; + } + + vfunc_key_focus_out() { + if(this.contextMenu && this.contextMenu.isOpen){ + return; + } + super.vfunc_key_focus_out(); + this.active = false; + } + + activate(event) { + this.emit('activate', event); + } + + vfunc_key_press_event(keyEvent) { + if (!this._activatable) + return super.vfunc_key_press_event(keyEvent); + + let state = keyEvent.modifier_state; + + // if user has a modifier down (except capslock and numlock) + // then don't handle the key press here + state &= ~Clutter.ModifierType.LOCK_MASK; + state &= ~Clutter.ModifierType.MOD2_MASK; + state &= Clutter.ModifierType.MODIFIER_MASK; + + if (state) + return Clutter.EVENT_PROPAGATE; + + let symbol = keyEvent.keyval; + if ( symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter) { + this.activate(Clutter.get_current_event()); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + vfunc_touch_event(event){ + if(event.type == Clutter.EventType.TOUCH_END && !this._menuLayout._blockActivateEvent && this.pressed){ + this.remove_style_pseudo_class('active'); + this.activate(Clutter.get_current_event()); + this.pressed = false; + return Clutter.EVENT_STOP; + } + else if(event.type == Clutter.EventType.TOUCH_BEGIN && !this._menuLayout.contextMenuManager.activeMenu){ + this.pressed = true; + this._menuLayout._blockActivateEvent = false; + if(this.hasContextMenu) + this.contextMenuTimeOut(); + this.add_style_pseudo_class('active'); + } + else if(event.type == Clutter.EventType.TOUCH_BEGIN && this._menuLayout.contextMenuManager.activeMenu){ + this.pressed = false; + this._menuLayout._blockActivateEvent = false; + this._menuLayout.contextMenuManager.activeMenu.toggle(); + } + return Clutter.EVENT_PROPAGATE; + } + + contextMenuTimeOut(){ + this._popupTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 600, () => { + this.pressed = false; + this._popupTimeoutId = null; + if(this.hasContextMenu && this._menuLayout.arcMenu.isOpen && !this._menuLayout._blockActivateEvent) { + this.popupContextMenu(); + this._menuLayout.contextMenuManager.ignoreRelease(); + } + return GLib.SOURCE_REMOVE; + }); + } + + cancelPopupTimeout(){ + if(this._popupTimeoutId){ + GLib.source_remove(this._popupTimeoutId); + this._popupTimeoutId = null; + } + } + + _onDestroy(){ + this.isDestroyed = true; + if(this.arcMenuOpenStateChangeID){ + this.arcMenu.disconnect(this.arcMenuOpenStateChangeID); + this.arcMenuOpenStateChangeID = null; + } + } +}); + +var ArcMenuSeparator = GObject.registerClass( +class Arc_Menu_Separator extends PopupMenu.PopupBaseMenuItem { + _init(separatorLength, separatorAlignment, text) { + super._init({ + style_class: 'popup-separator-menu-item', + reactive: false, + can_focus: false, + }); + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + this.remove_child(this._ornamentLabel); + this.reactive = true; + this.label = new St.Label({ + text: text || '', + style: 'font-weight: bold' + }); + this.add_child(this.label); + this.label_actor = this.label; + + this.label.add_style_pseudo_class = () => { return false; }; + + this.label.connect('notify::text', + this._syncLabelVisibility.bind(this)); + this._syncLabelVisibility(); + + this._separator = new St.Widget({ + style_class: 'popup-separator-menu-item-separator separator-color-style', + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(this._separator); + if(separatorAlignment === Constants.SeparatorAlignment.HORIZONTAL){ + this.style = "padding: 0px 5px;" + if(separatorLength === Constants.SeparatorStyle.SHORT) + this._separator.style = "margin: 5px 45px;"; + else if(separatorLength === Constants.SeparatorStyle.MEDIUM) + this._separator.style = "margin: 5px 15px;"; + else if(separatorLength === Constants.SeparatorStyle.LONG) + this._separator.style = "margin: 0px 5px;"; + else if(separatorLength === Constants.SeparatorStyle.MAX) + this._separator.style = "margin: 0px; padding: 0px;"; + else if(separatorLength === Constants.SeparatorStyle.HEADER_LABEL){ + this._separator.style = "margin: 0px 20px 0px 10px;"; + this.style = "padding: 5px 15px;" + } + } + else if(separatorAlignment === Constants.SeparatorAlignment.VERTICAL){ + if(separatorLength === Constants.SeparatorStyle.ALWAYS_SHOW){ + this.style = "padding: 8px 4px;" + } + else{ + this._syncVisibility(); + this.vertSeparatorChangedID = this._settings.connect('changed::vert-separator', this._syncVisibility.bind(this)); + this.style = "padding: 0px 4px;" + } + + this._separator.style = "margin: 0px; width: 1px; height: -1px;"; + this.remove_child(this.label); + this.x_expand = this._separator.x_expand = true; + this.x_align = this._separator.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = this._separator.y_expand = true; + this.y_align = this._separator.y_align = Clutter.ActorAlign.FILL; + } + + this.connect('destroy', () => { + if(this.vertSeparatorChangedID){ + this._settings.disconnect(this.vertSeparatorChangedID); + this.vertSeparatorChangedID = null; + } + }); + } + + _syncLabelVisibility() { + this.label.visible = this.label.text != ''; + } + + _syncVisibility() { + this._separator.visible = this._settings.get_boolean('vert-separator'); + } +}); + +var ActivitiesMenuItem = GObject.registerClass(class Arc_Menu_ActivitiesMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _("Activities Overview"), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this.label); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + icon_name: 'view-fullscreen-symbolic', + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + } + + activate(event) { + this._menuLayout.arcMenu.toggle(); + Main.overview.show(); + super.activate(event); + } +}); + +var Tooltip = class Arc_Menu_Tooltip{ + constructor(menuLayout, sourceActor, title, description) { + this._menuButton = menuLayout.menuButton; + this._settings = this._menuButton._settings; + this.sourceActor = sourceActor; + if(this.sourceActor.tooltipLocation) + this.location = this.sourceActor.tooltipLocation; + else + this.location = Constants.TooltipLocation.BOTTOM; + let descriptionLabel; + this.actor = new St.BoxLayout({ + vertical: true, + style_class: 'dash-label tooltip-menu-item', + opacity: 0 + }); + + if(title){ + this.titleLabel = new St.Label({ + text: _(title), + style: description ? "font-weight: bold;" : null, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(this.titleLabel); + } + + if(description){ + descriptionLabel = new St.Label({ + text: description, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(descriptionLabel); + } + + global.stage.add_child(this.actor); + + this.actor.connect('destroy',()=>{ + if(this.destroyID){ + this.sourceActor.disconnect(this.destroyID); + this.destroyID = null; + } + if(this.activeID){ + this.sourceActor.disconnect(this.activeID); + this.activeID = null; + } + + if(this.hoverID){ + this.sourceActor.disconnect(this.hoverID); + this.hoverID = null; + } + if(this.toggleID){ + this._settings.disconnect(this.toggleID); + this.toggleID = null; + } + }) + this.activeID = this.sourceActor.connect('notify::active', ()=> this.setActive(this.sourceActor.active)); + this.destroyID = this.sourceActor.connect('destroy',this.destroy.bind(this)); + this.hoverID = this.sourceActor.connect('notify::hover', this._onHover.bind(this)); + this._useTooltips = ! this._settings.get_boolean('disable-tooltips'); + this.toggleID = this._settings.connect('changed::disable-tooltips', this.disableTooltips.bind(this)); + } + + setActive(active){ + if(!active) + this.hide(); + } + + disableTooltips() { + this._useTooltips = ! this._settings.get_boolean('disable-tooltips'); + } + + _onHover() { + if(this._useTooltips){ + if(this.sourceActor.hover){ + if(this._menuButton.tooltipShowing){ + this.show(); + this._menuButton.activeTooltip = this.actor; + } + else{ + this._menuButton.tooltipShowingID = GLib.timeout_add(0, 750, () => { + this.show(); + this._menuButton.tooltipShowing = true; + this._menuButton.activeTooltip = this.actor; + this._menuButton.tooltipShowingID = null; + return GLib.SOURCE_REMOVE; + }); + } + if(this._menuButton.tooltipHidingID){ + GLib.source_remove(this._menuButton.tooltipHidingID); + this._menuButton.tooltipHidingID = null; + } + } + else { + this.hide(); + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + } + this._menuButton.tooltipHidingID = GLib.timeout_add(0, 750, () => { + this._menuButton.tooltipShowing = false; + this._menuButton.activeTooltip = null; + this._menuButton.tooltipHidingID = null; + return GLib.SOURCE_REMOVE; + }); + } + } + } + + show() { + if(this._useTooltips){ + this.actor.opacity = 0; + this.actor.show(); + + let [stageX, stageY] = this.sourceActor.get_transformed_position(); + + let itemWidth = this.sourceActor.allocation.x2 - this.sourceActor.allocation.x1; + let itemHeight = this.sourceActor.allocation.y2 - this.sourceActor.allocation.y1; + + let labelWidth = this.actor.get_width(); + let labelHeight = this.actor.get_height(); + + let x, y; + let gap = 5; + + switch (this.location) { + case Constants.TooltipLocation.BOTTOM_CENTERED: + y = stageY + itemHeight + gap; + x = stageX + Math.floor((itemWidth - labelWidth) / 2); + break; + case Constants.TooltipLocation.TOP_CENTERED: + y = stageY - labelHeight - gap; + x = stageX + Math.floor((itemWidth - labelWidth) / 2); + break; + case Constants.TooltipLocation.BOTTOM: + y = stageY + itemHeight + gap; + x = stageX + gap; + break; + } + + // keep the label inside the screen + let monitor = Main.layoutManager.findMonitorForActor(this.sourceActor); + if (x - monitor.x < gap) + x += monitor.x - x + gap; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; + else if (y - monitor.y < gap) + y += monitor.y - y + gap; + else if (y + labelHeight > monitor.y + monitor.height - gap) + y -= y + labelHeight - (monitor.y + monitor.height) + gap; + + this.actor.set_position(x, y); + this.actor.ease({ + opacity: 255, + duration: Dash.DASH_ITEM_LABEL_SHOW_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + }); + } + } + + hide() { + if(this._useTooltips){ + this.actor.ease({ + opacity: 0, + duration: Dash.DASH_ITEM_LABEL_HIDE_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => this.actor.hide() + }); + } + } + + destroy() { + if (this._menuButton.tooltipShowingID) { + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + } + if (this._menuButton.tooltipHidingID) { + GLib.source_remove(this._menuButton.tooltipHidingID); + this._menuButton.tooltipHidingID = null; + } + if(this.toggleID>0){ + this._settings.disconnect(this.toggleID); + this.toggleID = 0; + } + if(this.hoverID>0){ + this.sourceActor.disconnect(this.hoverID); + this.hoverID = 0; + } + if(this._menuButton.activeTooltip = this.actor) + this._menuButton.activeTooltip = null; + + global.stage.remove_child(this.actor); + this.actor.destroy(); + } +}; + +var ArcMenuButtonItem = GObject.registerClass( + class Arc_Menu_ArcMenuButtonItem extends ArcMenuPopupBaseMenuItem { + _init(menuLayout, tooltipText, iconName, gicon) { + super._init(menuLayout); + this.style_class = 'popup-menu-item arc-menu-button'; + this._settings = this._menuLayout._settings; + this._menuLayout = menuLayout; + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + this.iconName = iconName; + this.gicon = gicon; + this.toggleMenuOnClick = true; + + if(tooltipText){ + this.tooltip = new Tooltip(this._menuLayout, this.actor, tooltipText); + this.tooltip.location = Constants.TooltipLocation.TOP_CENTERED; + this.tooltip.hide(); + } + + if(this.iconName !== null){ + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + } + } + + createIcon(overrideIconSize){ + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: this.gicon ? this.gicon : Gio.icon_new_for_string(this.iconName), + icon_size: overrideIconSize ? overrideIconSize : iconSize, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER + }); + } + + setIconSize(size){ + if(!this._iconBin) + return; + this._iconBin.set_child(this.createIcon(size)); + } + + activate(event){ + if(this.toggleMenuOnClick) + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +// Settings Button +var SettingsButton = GObject.registerClass(class Arc_Menu_SettingsButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Settings"), 'emblem-system-symbolic'); + } + activate(event) { + super.activate(event); + Util.spawnCommandLine('gnome-control-center'); + } +}); + +// Runner Layout Tweaks Button +var RunnerTweaksButton = GObject.registerClass(class Arc_Menu_RunnerTweaksButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Configure Runner"), 'emblem-system-symbolic'); + this.tooltip.location = Constants.TooltipLocation.BOTTOM_CENTERED; + } + activate(event) { + super.activate(event); + this._menuLayout._settings.set_int('prefs-visible-page', Constants.PrefsVisiblePage.RUNNER_TWEAKS); + Util.spawnCommandLine(Constants.ArcMenuSettingsCommand); + } +}); + +//'Insider' layout Pinned Apps hamburger button +var PinnedAppsButton = GObject.registerClass(class Arc_Menu_PinnedAppsButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Pinned Apps"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.togglePinnedAppsMenu(); + } +}); + +//'Windows' layout extras hamburger button +var ExtrasButton = GObject.registerClass(class Arc_Menu_ExtrasButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Extras"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.toggleExtrasMenu(); + } +}); + +//"Leave" Button with popupmenu that shows lock, power off, restart, etc +var LeaveButton = GObject.registerClass(class Arc_Menu_LeaveButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Leave"), 'system-shutdown-symbolic'); + this.toggleMenuOnClick = false; + this._menuLayout = menuLayout; + this.menuButton = menuLayout.menuButton; + this._settings = menuLayout._settings; + this._createLeaveMenu(); + } + + _createLeaveMenu(){ + this.leaveMenu = new PopupMenu.PopupMenu(this, 0.5 , St.Side.BOTTOM); + this.leaveMenu.blockSourceEvents = true; + let section = new PopupMenu.PopupMenuSection(); + this.leaveMenu.addMenuItem(section); + + let box = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + box._delegate = box; + + section.actor.add_child(box); + + box.add_child(this._menuLayout.createLabelRow(_("Session"))); + + this.lockItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.LOCK); + box.add_child(this.lockItem); + + let logOutItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.LOGOUT); + box.add_child(logOutItem); + + box.add_child(this._menuLayout.createLabelRow(_("System"))); + + Utils.canHybridSleep((canHybridSleep, needsAuth) => { + if(canHybridSleep){ + let sleepItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.HYBRID_SLEEP); + box.insert_child_at_index(sleepItem, 4); + } + }); + + Utils.canHibernate((canHibernate, needsAuth) => { + if(canHibernate){ + let hibernateItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.HIBERNATE); + box.insert_child_at_index(hibernateItem, 5); + } + }); + + let suspendItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.SUSPEND); + box.add_child(suspendItem); + + let restartItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.RESTART); + box.add_child(restartItem); + + let powerOffItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.POWER_OFF); + box.add_child(powerOffItem); + + this._menuLayout.subMenuManager.addMenu(this.leaveMenu); + this.leaveMenu.actor.hide(); + Main.uiGroup.add_child(this.leaveMenu.actor); + this.leaveMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.tooltip){ + this.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.active = false; + this.sync_hover(); + this.hovered = this.hover; + } + }); + } + + _onDestroy(){ + Main.uiGroup.remove_child(this.leaveMenu.actor); + this.leaveMenu.destroy(); + } + + activate(event) { + super.activate(event); + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.leaveMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.leaveMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + this.leaveMenu.toggle(); + } +}); + +//'Unity' layout categories hamburger button +var CategoriesButton = GObject.registerClass(class Arc_Menu_CategoriesButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Categories"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.toggleCategoriesMenu(); + } +}); + +var PowerButton = GObject.registerClass(class Arc_Menu_PowerButton extends ArcMenuButtonItem { + _init(menuLayout, powerType) { + super._init(menuLayout, Constants.PowerOptions[powerType].TITLE, Constants.PowerOptions[powerType].IMAGE); + this.powerType = powerType; + } + activate(event) { + activatePowerOption(this.powerType, this._menuLayout.arcMenu); + } +}); + +var PowerMenuItem = GObject.registerClass(class Arc_Menu_PowerMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, type) { + super._init(menuLayout); + this.powerType = type; + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(Constants.PowerOptions[this.powerType].TITLE), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this.label); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: Gio.icon_new_for_string(Constants.PowerOptions[this.powerType].IMAGE), + style_class: 'popup-menu-icon', + icon_size: iconSize, + }); + } + + activate(){ + activatePowerOption(this.powerType, this._menuLayout.arcMenu); + } +}); + +var PlasmaMenuItem = GObject.registerClass(class Arc_Menu_PlasmaMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, title, iconPath) { + super._init(menuLayout); + this.remove_child(this._ornamentLabel); + this._menuLayout = menuLayout; + this.tooltipLocation = Constants.TooltipLocation.BOTTOM_CENTERED; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.vertical = true; + this.name = "arc-menu-plasma-button"; + this.iconPath = iconPath; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(title), + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + + this.label.x_align = this.label.y_align = Clutter.ActorAlign.CENTER; + this.label.y_expand = true; + + this._iconBin.x_align = this._iconBin.y_align = Clutter.ActorAlign.CENTER; + this._iconBin.y_expand = true; + + this.label.get_clutter_text().set_line_wrap(true); + this.add_child(this.label); + this.actor.connect('notify::hover', this._onHover.bind(this)); + } + + createIcon(){ + return new St.Icon({ + gicon: Gio.icon_new_for_string(this.iconPath), + style_class: 'popup-menu-icon', + icon_size: Constants.MEDIUM_ICON_SIZE + }); + } + + _onHover(){ + if(this.tooltip === undefined && this.actor.hover && this.label){ + let description = null; + Utils.createTooltip(this._menuLayout, this, this.label, description, Constants.DisplayType.LIST); + } + let shouldHover = this._settings.get_boolean('plasma-enable-hover'); + if(shouldHover && this.actor.hover && !this.isActive){ + this.activate(Clutter.get_current_event()); + } + } + + set active(active) { + let activeChanged = active != this.active; + if(activeChanged){ + this._active = active; + if(active){ + this.add_style_class_name('selected'); + this._menuLayout.activeMenuItem = this; + if(this.can_focus) + this.grab_key_focus(); + } + else{ + this.remove_style_class_name('selected'); + } + this.notify('active'); + } + } + + setActive(active){ + if(active){ + this.isActive = true; + this.set_style_pseudo_class("active-item"); + } + else{ + this.isActive = false; + this.set_style_pseudo_class(null); + } + } + + activate(event){ + this._menuLayout.searchBox.clearWithoutSearchChangeEvent(); + this._menuLayout.clearActiveItem(); + this.setActive(true); + super.activate(event); + } +}); + +var PlasmaCategoryHeader = GObject.registerClass(class Arc_Menu_PlasmaCategoryHeader extends St.BoxLayout{ + _init(menuLayout) { + super._init({ + style_class: "popup-menu-item", + style: 'padding: 0px;', + reactive: true, + track_hover:true, + can_focus: true, + accessible_role: Atk.Role.MENU_ITEM + }); + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this.backButton = new ArcMenuPopupBaseMenuItem(this._menuLayout); + this.backButton.x_expand = false; + this.backButton.x_align = Clutter.ActorAlign.CENTER; + this.label = new St.Label({ + text: _("Applications"), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER, + style: 'font-weight: bold' + }); + + this.backButton.add_child(this.label); + + this.add_child(this.backButton); + this.backButton.connect("activate", () => this._menuLayout.displayCategories() ); + + this.categoryLabel = new St.Label({ + text: '', + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this.categoryLabel); + } + + setActiveCategory(categoryText){ + if(categoryText){ + this.categoryLabel.text = _(categoryText); + this.categoryLabel.show(); + } + else + this.categoryLabel.hide(); + } +}); + +var AllAppsButton = GObject.registerClass(class Arc_Menu_AllAppsButton extends ArcMenuButtonItem{ + _init(menuLayout) { + super._init(menuLayout, null, 'go-next-symbolic'); + this.setIconSize(Constants.EXTRA_SMALL_ICON_SIZE); + this.toggleMenuOnClick = false; + this.style = 'min-height: 28px; padding: 0px 8px;' + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.x_expand = true; + this.x_align = Clutter.ActorAlign.END; + this._label = new St.Label({ + text: _("All Apps"), + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.insert_child_at_index(this._label, 0); + } + + activate(event){ + super.activate(event); + this._menuLayout.displayAllApps(); + } +}); + +var BackButton = GObject.registerClass(class Arc_Menu_BackButton extends ArcMenuButtonItem{ + _init(menuLayout) { + super._init(menuLayout, null, 'go-previous-symbolic'); + this.setIconSize(Constants.EXTRA_SMALL_ICON_SIZE); + this.toggleMenuOnClick = false; + this.style = 'min-height: 28px; padding: 0px 8px;' + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.x_expand = true; + this.x_align = Clutter.ActorAlign.END; + this._label = new St.Label({ + text: _("Back"), + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this._label); + } + + activate(event){ + super.activate(event); + this._menuLayout.setDefaultMenuView(); + } +}); + +// Menu item to go back to category view +var BackMenuItem = GObject.registerClass(class Arc_Menu_BackMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin({ + x_expand: false, + x_align: Clutter.ActorAlign.START, + }); + this.add_child(this._iconBin); + + this._updateIcon(); + + let backLabel = new St.Label({ + text: _("Back"), + x_expand: false, + x_align: Clutter.ActorAlign.START, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(backLabel); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.MISC_ICON_SIZE); + + return new St.Icon({ + icon_name: 'go-previous-symbolic', + icon_size: iconSize, + }); + } + + activate(event) { + if(this._layout === Constants.MenuLayout.ARCMENU){ + //If the current page is inside a category and + //previous page was the categories page, + //go back to categories page + if(this._menuLayout.previousCategoryType === Constants.CategoryType.CATEGORIES_LIST && (this._menuLayout.activeCategoryType <= 4 || this._menuLayout.activeCategoryType instanceof GMenu.TreeDirectory)) + this._menuLayout.displayCategories(); + else + this._menuLayout.setDefaultMenuView(); + } + else if(this._layout === Constants.MenuLayout.TOGNEE) + this._menuLayout.setDefaultMenuView(); + super.activate(event); + } +}); + +// Menu item to view all apps +var ViewAllPrograms = GObject.registerClass(class Arc_Menu_ViewAllPrograms extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + let backLabel = new St.Label({ + text: _("All Applications"), + x_expand: false, + x_align: Clutter.ActorAlign.START, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(backLabel); + + this._iconBin = new St.Bin({ + x_expand: false, + x_align: Clutter.ActorAlign.START, + }); + this.add_child(this._iconBin); + this._updateIcon(); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.MISC_ICON_SIZE); + + return new St.Icon({ + icon_name: 'go-next-symbolic', + icon_size: iconSize, + x_align: Clutter.ActorAlign.START + }); + } + + activate(event) { + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS || defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + this._menuLayout.displayCategories(); + else + this._menuLayout.displayAllApps(); + super.activate(event); + } +}); + +var ShortcutMenuItem = GObject.registerClass(class Arc_Menu_ShortcutMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, name, icon, command, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + if(this._settings.get_enum('shortcut-icon-type') === Constants.CategoryIconType.FULL_COLOR) + this.add_style_class_name('regular-icons'); + else + this.add_style_class_name('symbolic-icons'); + this._command = command; + this._displayType = displayType; + this.isContainedInCategory = isContainedInCategory; + this.iconName = icon; + + //Check for default commands-------- + if(this._command == "ArcMenu_Software"){ + let softwareManager = Utils.findSoftwareManager(); + this._command = softwareManager ? softwareManager : 'ArcMenu_unfound.desktop'; + } + else if(this._command === "ArcMenu_Trash"){ + this.trash = new Me.imports.placeDisplay.Trash(this); + this._command = "ArcMenu_Trash"; + this._app = this.trash.getApp(); + } + if(!this._app) + this._app = Shell.AppSystem.get_default().lookup_app(this._command); + + if(this._app && icon === ''){ + let appIcon = this._app.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(appIcon instanceof St.Icon){ + this.iconName = appIcon.gicon.to_string(); + } + } + //------------------------------------- + + this.hasContextMenu = this._app ? true : false; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(name), y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this.layout = this._settings.get_enum('menu-layout'); + if(this.layout === Constants.MenuLayout.PLASMA && this._settings.get_boolean('apps-show-extra-details') && this._app){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionLabel = new St.Label({ + text: this._app.get_description(), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + if(this._app.get_description()) + labelBox.add_child(descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + else if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.remove_child(this.label); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + } + this.setShouldShow(); + } + + createIcon(){ + let iconSizeEnum; + if(this.isContainedInCategory) + iconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + else + iconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + iconSizeEnum = this._settings.get_enum('button-item-icon-size'); + defaultIconSize = LayoutProps.DefaultButtonsIconSize; + iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + } + else if(this._displayType === Constants.DisplayType.GRID){ + iconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(iconSizeEnum, defaultIconStyle); + } + + return new St.Icon({ + icon_name: this.iconName, + gicon: Gio.icon_new_for_string(this.iconName), + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + } + + popupContextMenu(){ + if(this._app && this.contextMenu == undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._displayType === Constants.DisplayType.GRID || this.layout === Constants.MenuLayout.UNITY || this.layout === Constants.MenuLayout.AZ) + this.contextMenu.centerBoxPointerPosition(); + else if(this.layout === Constants.MenuLayout.MINT || this.layout === Constants.MenuLayout.TOGNEE) + this.contextMenu.rightBoxPointerPosition(); + if(this._path) + this.contextMenu.path = this._path; + } + if(this.contextMenu !== undefined){ + if(this.tooltip !== undefined) + this.tooltip.hide(); + if(!this.contextMenu.isOpen){ + this.contextMenu.rebuildItems(); + } + this.contextMenu.toggle(); + } + } + + activate(event) { + if(this._command === "ArcMenu_LogOut") + activatePowerOption(Constants.PowerType.LOGOUT, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Lock") + activatePowerOption(Constants.PowerType.LOCK, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_PowerOff") + activatePowerOption(Constants.PowerType.POWER_OFF, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Restart") + activatePowerOption(Constants.PowerType.RESTART, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Suspend") + activatePowerOption(Constants.PowerType.SUSPEND, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_HybridSleep") + activatePowerOption(Constants.PowerType.HYBRID_SLEEP, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Hibernate") + activatePowerOption(Constants.PowerType.HIBERNATE, this._menuLayout.arcMenu); + + else{ + this._menuLayout.arcMenu.toggle(); + if(this._command === "ArcMenu_ActivitiesOverview") + Main.overview.show(); + else if(this._command === "ArcMenu_RunCommand") + Main.openRunDialog(); + else if(this._command === "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else if(this._app) + this._app.open_new_window(-1); + else + Util.spawnCommandLine(this._command); + } + } +}); + +// Menu item which displays the current user +var UserMenuItem = GObject.registerClass(class Arc_Menu_UserMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, displayType) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._displayType = displayType; + this._settings = this._menuLayout._settings; + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + this.iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + } + else{ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + this.iconSize = Utils.getIconSize(IconSizeEnum, USER_AVATAR_SIZE); + } + + this.userMenuIcon = new UserMenuIcon(menuLayout, this.iconSize, false); + + this.add_child(this.userMenuIcon.actor); + this.label = this.userMenuIcon.label; + if(this._displayType !== Constants.DisplayType.BUTTON) + this.add_child(this.label); + } + + activate(event) { + Util.spawnCommandLine("gnome-control-center user-accounts"); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +var UserMenuIcon = class Arc_Menu_UserMenuIcon{ + constructor(menuLayout, size, hasTooltip) { + this._menuLayout = menuLayout; + this.iconSize = size; + + let username = GLib.get_user_name(); + this._user = AccountsService.UserManager.get_default().get_user(username); + + this.actor = new St.Bin({ + style_class: 'menu-user-avatar user-icon', + track_hover: true, + reactive: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + + this.label = new St.Label({ + text: GLib.get_real_name(), + y_align: Clutter.ActorAlign.CENTER + }); + + this.actor.style = "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + + this._userLoadedId = this._user.connect('notify::is-loaded', this._onUserChanged.bind(this)); + this._userChangedId = this._user.connect('changed', this._onUserChanged.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + if(hasTooltip) + this.actor.connect('notify::hover',this._onHover.bind(this)); + + this._onUserChanged(); + } + + _onHover() { + if(this.tooltip === undefined && this.actor.hover){ + this.tooltip = new Tooltip(this._menuLayout, this.actor, GLib.get_real_name()); + this.tooltip.location = Constants.TooltipLocation.BOTTOM_CENTERED; + this.tooltip._onHover(); + } + } + + _onUserChanged() { + if (this._user.is_loaded) { + this.label.set_text(this._user.get_real_name()); + if(this.tooltip) + this.tooltip.titleLabel.text = this._user.get_real_name(); + + let iconFile = this._user.get_icon_file(); + if (iconFile && !GLib.file_test(iconFile ,GLib.FileTest.EXISTS)) + iconFile = null; + + if (iconFile) { + this.actor.child = null; + this.actor.add_style_class_name('user-avatar'); + this.actor.style = 'background-image: url("%s");'.format(iconFile) + "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + } + else { + this.actor.style = "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + this.actor.child = new St.Icon({ + icon_name: 'avatar-default-symbolic', + icon_size: this.iconSize, + style: "padding: 5px; width: " + this.iconSize + "px; height: " + this.iconSize + "px;" + }); + } + } + } + + _onDestroy() { + if (this._userLoadedId) { + this._user.disconnect(this._userLoadedId); + this._userLoadedId = null; + } + if (this._userChangedId) { + this._user.disconnect(this._userChangedId); + this._userChangedId = null; + } + } +}; + +// Menu pinned apps item class +var PinnedAppsMenuItem = GObject.registerClass({ + Signals: { 'saveSettings': {}, }, +}, class Arc_Menu_PinnedAppsMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, name, icon, command, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._menuButton = menuLayout.menuButton; + this._settings = this._menuLayout._settings; + this._command = command; + this._iconString = this._iconPath = icon; + this._name = name; + this._displayType = displayType; + this._app = Shell.AppSystem.get_default().lookup_app(this._command); + this.hasContextMenu = true; + this.gridLocation = [-1, -1]; + this.isContainedInCategory = isContainedInCategory; + + //Modifiy the Default Pinned Apps--------------------- + if(this._name == "ArcMenu Settings"){ + this._name = _("ArcMenu Settings"); + } + else if(this._name == "Terminal"){ + this._name = _("Terminal"); + } + else if(this._name == "Files"){ + this._name = _("Files"); + } + if(this._iconPath === "ArcMenu_ArcMenuIcon" || this._iconPath === Me.path + '/media/icons/arc-menu-symbolic.svg'){ + this._iconString = this._iconPath = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + } + //------------------------------------------------------- + + if(this._app && this._iconPath === ''){ + let appIcon = this._app.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(appIcon instanceof St.Icon){ + this._iconString = appIcon.gicon ? appIcon.gicon.to_string() : appIcon.fallback_icon_name; + if(!this._iconString) + this._iconString = ""; + } + } + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(this._name), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + if(this._displayType === Constants.DisplayType.LIST && this._settings.get_boolean('apps-show-extra-details') && this._app){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionLabel = new St.Label({ + text: this._app.get_description(), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + if(this._app.get_description()) + labelBox.add_child(descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + this._draggable = DND.makeDraggable(this.actor); + this._draggable._animateDragEnd = (eventTime) => { + this._draggable._animationInProgress = true; + this._draggable._onAnimationComplete(this._draggable._dragActor, eventTime); + }; + this.isDraggableApp = true; + this._draggable.connect('drag-begin', this._onDragBegin.bind(this)); + this._draggable.connect('drag-end', this._onDragEnd.bind(this)); + + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + + this.setShouldShow(); + } + + createIcon(){ + let iconSize; + if(this._displayType === Constants.DisplayType.GRID){ + const IconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(IconSizeEnum, defaultIconStyle); + } + else if(this._displayType === Constants.DisplayType.LIST){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultPinnedIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + return new St.Icon({ + gicon: Gio.icon_new_for_string(this._iconString), + icon_size: iconSize + }); + } + + popupContextMenu(){ + if(this.contextMenu == undefined){ + let app = this._app ? this._app : this._command; + this.contextMenu = new ApplicationContextMenu(this.actor, app, this._menuLayout); + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(this.tooltip !== undefined) + this.tooltip.hide(); + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + _onDragBegin() { + this.isDragging = true; + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + this._menuButton.tooltipShowing = false; + } + if(this.tooltip){ + this.tooltip.hide(); + this._menuButton.tooltipShowing = false; + } + + if(this.contextMenu && this.contextMenu.isOpen) + this.contextMenu.toggle(); + + this.cancelPopupTimeout(); + + this._dragMonitor = { + dragMotion: this._onDragMotion.bind(this) + }; + DND.addDragMonitor(this._dragMonitor); + this._parentBox = this.actor.get_parent(); + let p = this._parentBox.get_transformed_position(); + this.posX = p[0]; + this.posY = p[1]; + + this.actor.opacity = 55; + this.get_allocation_box(); + this.rowHeight = this.height; + this.rowWidth = this.width; + } + + _onDragMotion(dragEvent) { + let layoutManager = this._parentBox.layout_manager; + if(layoutManager instanceof Clutter.GridLayout){ + this.xIndex = Math.floor((this._draggable._dragX - this.posX) / (this.rowWidth + layoutManager.column_spacing)); + this.yIndex = Math.floor((this._draggable._dragY - this.posY) / (this.rowHeight + layoutManager.row_spacing)); + + if(this.xIndex === this.gridLocation[0] && this.yIndex === this.gridLocation[1]){ + return DND.DragMotionResult.CONTINUE; + } + else{ + this.gridLocation = [this.xIndex, this.yIndex]; + } + + this._parentBox.remove_child(this); + let children = this._parentBox.get_children(); + let childrenCount = children.length; + let columns = layoutManager.gridColumns; + let rows = Math.floor(childrenCount / columns); + if(this.yIndex >= rows) + this.yIndex = rows; + if(this.yIndex < 0) + this.yIndex = 0; + if(this.xIndex >= columns - 1) + this.xIndex = columns - 1; + if(this.xIndex < 0) + this.xIndex = 0; + + if(((this.xIndex + 1) + (this.yIndex * columns)) > childrenCount) + this.xIndex = Math.floor(childrenCount % columns); + + this._parentBox.remove_all_children(); + + let x = 0, y = 0; + for(let i = 0; i < children.length; i++){ + if(this.xIndex === x && this.yIndex === y) + [x, y] = this.gridLayoutIter(x, y, columns); + layoutManager.attach(children[i], x, y, 1, 1); + [x, y] = this.gridLayoutIter(x, y, columns); + } + layoutManager.attach(this, this.xIndex, this.yIndex, 1, 1); + } + return DND.DragMotionResult.CONTINUE; + } + + _onDragEnd() { + if (this._dragMonitor) { + DND.removeDragMonitor(this._dragMonitor); + this._dragMonitor = null; + } + this.actor.opacity = 255; + let layoutManager = this._parentBox.layout_manager; + if(layoutManager instanceof Clutter.GridLayout){ + let x = 0, y = 0; + let columns = layoutManager.gridColumns; + let orderedList = []; + let children = this._parentBox.get_children(); + for(let i = 0; i < children.length; i++){ + orderedList.push(this._parentBox.layout_manager.get_child_at(x, y)); + [x, y] = this.gridLayoutIter(x, y, columns); + } + this._menuLayout.pinnedAppsArray = orderedList; + } + this.emit('saveSettings'); + } + + getDragActor() { + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + let icon = new St.Icon({ + gicon: Gio.icon_new_for_string(this._iconString), + style_class: 'popup-menu-icon', + icon_size: this._iconBin.get_child().icon_size + }); + let iconColor = this._settings.get_string('menu-foreground-color'); + if(customStyle) + icon.style = `color: ${iconColor};`; + return icon; + } + + getDragActorSource() { + return this.actor; + } + + gridLayoutIter(x, y, columns){ + x++; + if(x === columns){ + y++; + x = 0; + } + return [x, y]; + } + + activate(event) { + if(this._app) + this._app.open_new_window(-1); + else if(this._command === "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else + Util.spawnCommandLine(this._command); + + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +var ApplicationMenuItem = GObject.registerClass(class Arc_Menu_ApplicationMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, app, displayType, metaInfo, isContainedInCategory) { + super._init(menuLayout); + this._app = app; + this._menuLayout = menuLayout; + this.metaInfo = metaInfo; + this._settings = this._menuLayout._settings; + this.searchType = this._menuLayout.layoutProperties.SearchDisplayType; + this._displayType = displayType; + this.hasContextMenu = true; + this.isSearchResult = this.metaInfo ? true : false; + this.isContainedInCategory = isContainedInCategory; + + if(this._app){ + let disableRecentAppsIndicator = this._settings.get_boolean("disable-recently-installed-apps") + if(!disableRecentAppsIndicator){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + this.isRecentlyInstalled = recentApps.some((appIter) => appIter === this._app.get_id()); + } + } + + this._iconBin = new St.Bin({ + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: this._app ? this._app.get_name() : this.metaInfo['name'], + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.description = this._app ? this._app.get_description() : this.metaInfo['description']; + + let searchResultsDescriptionsSetting = this._settings.get_boolean("show-search-result-details"); + let appsShowDescriptionsSetting = this._settings.get_boolean("apps-show-extra-details"); + this.searchResultsDescriptions = searchResultsDescriptionsSetting && this.isSearchResult; + this.appsShowDescriptions = appsShowDescriptionsSetting && !this.isSearchResult; + + if(this.description && (this.searchResultsDescriptions || this.appsShowDescriptions) && this._displayType === Constants.DisplayType.LIST){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionText = this.description.split('\n')[0]; + this.descriptionLabel = new St.Label({ + text: descriptionText, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + labelBox.add_child(this.descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + this.label_actor = this.label; + + if(this.isRecentlyInstalled){ + this._indicator = new St.Label({ + text: _('New'), + style_class: "arc-menu-menu-item-text-indicator", + style: "border-radius: 15px; margin: 0px; padding: 0px 10px;", + x_expand: true, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._indicator); + } + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + + this.hoverID = this.connect("notify::hover", () => this.removeIndicator()); + this.keyFocusInID = this.connect("key-focus-in", () => this.removeIndicator()); + } + + createIcon(){ + let iconSize; + if(this._displayType === Constants.DisplayType.GRID){ + this._iconBin.x_align = Clutter.ActorAlign.CENTER; + + const IconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(IconSizeEnum, defaultIconStyle); + } + else if(this._displayType === Constants.DisplayType.LIST){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory || this.isSearchResult ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultPinnedIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + return this.metaInfo ? this.metaInfo['createIcon'](iconSize) : this._app.create_icon_texture(iconSize); + } + + removeIndicator(){ + if(this.isRecentlyInstalled){ + this.isRecentlyInstalled = false; + let recentApps = this._settings.get_strv('recently-installed-apps'); + let index = recentApps.indexOf(this._app.get_id()); + if(index > -1){ + recentApps.splice(index, 1); + } + this._settings.set_strv('recently-installed-apps', recentApps); + + this._indicator.hide(); + this._menuLayout.setRecentlyInstalledIndicator(); + } + } + + popupContextMenu(){ + this.removeIndicator(); + if(this.tooltip) + this.tooltip.hide(); + if(!this._app && !this._path) + return; + + if(this.contextMenu === undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._path) + this.contextMenu.path = this._path; + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + activateSearchResult(provider, metaInfo, terms, event){ + this._menuLayout.arcMenu.toggle(); + if(provider.activateResult){ + provider.activateResult(metaInfo.id, terms); + if (metaInfo.clipboardText) + St.Clipboard.get_default().set_text(St.ClipboardType.CLIPBOARD, metaInfo.clipboardText); + } + else{ + if (metaInfo.id.endsWith('.desktop')) { + let app = Shell.AppSystem.get_default().lookup_app(metaInfo.id); + if (app.can_open_new_window()) + app.open_new_window(-1); + else + app.activate(); + } + else{ + this._menuLayout.arcMenu.itemActivated(BoxPointer.PopupAnimation.NONE); + SystemActions.activateAction(metaInfo.id); + } + } + } + + activate(event) { + this.removeIndicator(); + + if(this.metaInfo){ + this.activateSearchResult(this.provider, this.metaInfo, this.resultsView.terms, event); + return Clutter.EVENT_STOP; + } + else + this._app.open_new_window(-1); + + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _onDestroy(){ + if(this.hoverID){ + this.disconnect(this.hoverID); + this.hoverID = null; + } + if(this.keyFocusInID){ + this.disconnect(this.keyFocusInID); + this.keyFocusInID = null; + } + } +}); + +// Menu Category item class +var CategoryMenuItem = GObject.registerClass(class Arc_Menu_CategoryMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, category, displayType) { + super._init(menuLayout); + this.appList = []; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + this._layout = this._settings.get_enum('menu-layout'); + this._category = category; + this._name = ""; + this._horizontalFlip = this._settings.get_boolean('enable-horizontal-flip'); + this._displayType = displayType; + this.layoutProps = this._menuLayout.layoutProperties; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: this._name, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this.label); + + if(this.isRecentlyInstalled) + this.setRecentlyInstalledIndicator(true); + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + this.remove_child(this.label); + } + + this.label_actor = this.label; + this._menuLayout._oldX = -1; + this._menuLayout._oldY = -1; + this.connect('motion-event', this._onMotionEvent.bind(this)); + this.connect('enter-event', this._onEnterEvent.bind(this)); + this.connect('leave-event', this._onLeaveEvent.bind(this)); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + + let defaultIconSize = this.layoutProps.DefaultCategoryIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + let defaultIconSize = this.layoutProps.DefaultButtonsIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + let icon = new St.Icon({ + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + + let categoryIconType = this._settings.get_enum('category-icon-type'); + let [name, gicon, iconName, fallbackIconName] = Utils.getCategoryDetails(this._category, categoryIconType); + this._name = _(name); + if(gicon) + icon.gicon = gicon; + else if(iconName) + icon.icon_name = iconName; + else + icon.fallback_icon_name = fallbackIconName; + + return icon; + } + + setRecentlyInstalledIndicator(shouldShow){ + if(this._displayType === Constants.DisplayType.BUTTON) + return; + this.isRecentlyInstalled = shouldShow; + if(shouldShow){ + this._indicator = new St.Icon({ + icon_name: 'message-indicator-symbolic', + style_class: 'arc-menu-menu-item-indicator', + icon_size: INDICATOR_ICON_SIZE, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._indicator); + } + else if(this._indicator && this.contains(this._indicator)) + this.remove_child(this._indicator); + } + + displayAppList(){ + this._menuLayout.searchBox?.clearWithoutSearchChangeEvent(); + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, null); + } + + activate(event) { + this.displayAppList(); + if(this.layoutProps.SupportsCategoryOnHover) + this._menuLayout.setActiveCategory(this, true); + super.activate(event); + } + + _onEnterEvent(actor, event) { + if(this._menuLayout.navigatingCategoryLeaveEventID){ + GLib.source_remove(this._menuLayout.navigatingCategoryLeaveEventID); + this._menuLayout.navigatingCategoryLeaveEventID = null; + } + } + + _onLeaveEvent(actor, event) { + if(!this._menuLayout.navigatingCategoryLeaveEventID){ + this._menuLayout.navigatingCategoryLeaveEventID = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 200, () => { + this._menuLayout.navigatingCategory = null; + this._menuLayout.navigatingCategoryLeaveEventID = null; + return GLib.SOURCE_REMOVE; + }); + } + } + + _onMotionEvent(actor, event) { + if(this.layoutProps.SupportsCategoryOnHover && this._settings.get_boolean('activate-on-hover')){ + if (!this._menuLayout.navigatingCategory) { + this._menuLayout.navigatingCategory = this; + } + + if (this._isInTriangle(event.get_coords())){ + if(this._menuLayout.activeCategoryType !== this._category && this._menuLayout.navigatingCategory === this) + this.activate(Clutter.get_current_event()); + return true; + } + this._menuLayout.navigatingCategory = this; + return true; + } + } + + _isInTriangle([x, y]){ + let [posX, posY] = this._menuLayout.navigatingCategory.get_transformed_position(); + + //the mouse is still in the active category + if (this._menuLayout.navigatingCategory === this){ + this._menuLayout._oldX = x; + this._menuLayout._oldY = y; + return true; + } + + if(!this._menuLayout.navigatingCategory) + return false; + + let width = this._menuLayout.navigatingCategory.width; + let height = this._menuLayout.navigatingCategory.height; + + let maxX = this._horizontalFlip ? posX : posX + width; + let maxY = posY + height; + + let distance = Math.abs(maxX - this._menuLayout._oldX); + let point1 = [this._menuLayout._oldX, this._menuLayout._oldY] + let point2 = [maxX, posY - distance]; + let point3 = [maxX, maxY + distance]; + + let area = Utils.areaOfTriangle(point1, point2, point3); + let a1 = Utils.areaOfTriangle([x, y], point2, point3); + let a2 = Utils.areaOfTriangle(point1, [x, y], point3); + let a3 = Utils.areaOfTriangle(point1, point2, [x, y]); + return area === a1 + a2 + a3; + } +}); + +var SimpleMenuItem = GObject.registerClass(class Arc_Menu_SimpleMenuItem extends CategoryMenuItem{ + _init(menuLayout, category) { + super._init(menuLayout, category); + this.subMenu = new PopupMenu.PopupMenu(this.actor,.5,St.Side.LEFT); + this.subMenu.connect("open-state-changed", (menu, open) => { + if(!open){ + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + }); + + Main.uiGroup.add_child(this.subMenu.actor); + this.section = new PopupMenu.PopupMenuSection(); + this.subMenu.addMenuItem(this.section); + + this.applicationsScrollBox = this._menuLayout._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this._menuLayout.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + this._menuLayout.subMenuManager.addMenu(this.subMenu); + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.applicationsScrollBox.style = 'max-height: 25em;'; + this.applicationsBox._delegate = this.applicationsBox; + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.section.actor.add_child(this.applicationsScrollBox); + + if(this.subMenu._keyPressId) + this.actor.disconnect(this.subMenu._keyPressId); + this.applicationsScrollBox.connect("key-press-event",(actor, event)=>{ + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Right: + case Clutter.KEY_Left: + this.subMenu.toggle(); + this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + case Clutter.KEY_Escape: + if(this.subMenu.isOpen){ + this.subMenu.toggle(); + this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + return Clutter.EVENT_STOP; + default: + return Clutter.EVENT_PROPAGATE; + } + }); + this.actor.connect("key-press-event",(actor, event)=>{ + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Escape: + if(this.subMenu.isOpen){ + this.subMenu.toggle(); + } + return Clutter.EVENT_STOP; + case Clutter.KEY_Left: + case Clutter.KEY_Right: + case Clutter.KEY_Return: + if(!this.subMenu.isOpen){ + let navigateFocus = true; + this.activate(event, navigateFocus); + this.subMenu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + return Clutter.EVENT_STOP; + } + else{ + return Clutter.EVENT_PROPAGATE; + } + default: + return Clutter.EVENT_PROPAGATE; + } + }); + this.updateStyle(); + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + + this.subMenu.actor.hide(); + if(customStyle){ + this.subMenu.actor.style_class = 'arc-menu-boxpointer'; + this.subMenu.actor.add_style_class_name('arc-menu'); + } + else + { + this.subMenu.actor.style_class = 'popup-menu-boxpointer'; + this.subMenu.actor.add_style_class_name('popup-menu'); + } + } + + displayAppList(){ + this._menuLayout.activeCategory = this._name; + } + + activate(event, navigateFocus = true) { + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, true); + this.subMenu.toggle(); + if(navigateFocus) + this.subMenu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + this._menuLayout.setActiveCategory(this, true); + } + + _onMotionEvent(actor, event) { + if (!this._menuLayout.navigatingCategory) { + this._menuLayout.navigatingCategory = this; + } + + if (this._isInTriangle(event.get_coords())){ + if(this._menuLayout.activeCategory !== this._name && this._menuLayout.navigatingCategory === this){ + let navigateFocus = false; + this.activate(event, navigateFocus); + } + return true; + } + this._menuLayout.navigatingCategory = this; + return true; + } +}); +// SubMenu Category item class +var CategorySubMenuItem = GObject.registerClass(class Arc_Menu_CategorySubMenuItem extends PopupMenu.PopupSubMenuMenuItem{ + _init(menuLayout, category) { + super._init('', true); + this.add_style_class_name("arcmenu-menu-item"); + this.add_style_class_name('margin-box'); + this._category = category; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + this._name = ""; + this.isSimpleMenuItem = false; + this._active = false; + this.applicationsMap = new Map(); + this.appList = []; + + let categoryIconType = this._settings.get_enum('category-icon-type'); + let [name, gicon, iconName, fallbackIconName] = Utils.getCategoryDetails(this._category, categoryIconType); + this._name = _(name); + if(gicon) + this.icon.gicon = gicon; + else if(iconName) + this.icon.icon_name = iconName; + else + this.icon.fallback_icon_name = fallbackIconName; + + this.label.text = this._name; + + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultCategoryIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + this.icon.icon_size = iconSize; + + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', (action) => { + this._menuLayout._blockActivateEvent = true; + this._menuLayout.onPan(action, this.menu.actor); + }); + panAction.connect('gesture-cancel',(action) => this._menuLayout.onPanEnd(action, this.menu.actor)); + panAction.connect('gesture-end', (action) => this._menuLayout.onPanEnd(action, this.menu.actor)); + this.menu.actor.add_action(panAction); + + this.menu.actor.style = 'max-height: 250px;'; + this.menu.actor.overlay_scrollbars = true; + this.menu.actor.style_class = 'popup-sub-menu ' + (this._menuLayout.disableFadeEffect ? '' : 'small-vfade'); + this.menu._needsScrollbar = () => this._needsScrollbar(); + + this.menu.connect('open-state-changed', () => { + if(!this.menu.isOpen){ + let scrollbar= this.menu.actor.get_vscroll_bar().get_adjustment(); + scrollbar.set_value(0); + } + }); + this.menu.box.style_class = 'margin-box'; + } + + setRecentlyInstalledIndicator(shouldShow){ + this.isRecentlyInstalled = shouldShow; + if(shouldShow){ + this._indicator = new St.Icon({ + icon_name: 'message-indicator-symbolic', + style_class: 'arc-menu-menu-item-indicator', + icon_size: INDICATOR_ICON_SIZE, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(this._indicator); + } + else if(this._indicator && this.actor.contains(this._indicator)) + this.actor.remove_child(this._indicator); + } + + _needsScrollbar() { + let topMenu = this.menu; + let [, topNaturalHeight] = topMenu.actor.get_preferred_height(-1); + let topThemeNode = topMenu.actor.get_theme_node(); + + let topMaxHeight = topThemeNode.get_max_height(); + let needsScrollbar = topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight; + if(needsScrollbar) + this.menu.actor.style = 'min-height:150px; max-height: 250px;'; + else + this.menu.actor.style = 'max-height: 250px;'; + + this.menu.actor.vscrollbar_policy = St.PolicyType.AUTOMATIC; + + if (needsScrollbar) + this.menu.actor.add_style_pseudo_class('scrolled'); + else + this.menu.actor.remove_style_pseudo_class('scrolled'); + + return needsScrollbar; + } + + loadMenu(){ + let children = this.menu.box.get_children(); + for (let i = 0; i < children.length; i++) { + let item = children[i]; + this.menu.box.remove_child(item); + } + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + for (let i = 0; i < appList.length; i++) { + let app = appList[i]; + let item = this.applicationsMap.get(app); + if(item.actor.get_parent()){ + item.actor.get_parent().remove_child(item.actor); + } + if (!item.actor.get_parent()) { + this.menu.box.add_child(item.actor); + } + } + } + + _setOpenState(open){ + if(this.isSimpleMenuItem && open){ + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, true); + } + else if(open) + this.loadMenu(); + + this.setSubmenuShown(open); + } +}); + +// Place Info class +var PlaceInfo = class Arc_Menu_PlaceInfo { + constructor(file, name, icon) { + this.file = file; + this.name = name ? name : this._getFileName(); + this.icon = icon ? icon : null; + this.gicon = icon ? null : this.getIcon(); + } + + launch(timestamp) { + let context = global.create_app_launch_context(timestamp, -1); + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + Main.notifyError(_('Failed to open “%s”').format(this._getFileName()), e.message); + reject(e); + } + }); + }); + } + + getIcon() { + try { + let info = this.file.query_info('standard::symbolic-icon', 0, null); + return info.get_symbolic_icon(); + + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + if (!this.file.is_native()) { + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + } else { + return new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + } + } + + _getFileName() { + try { + let info = this.file.query_info('standard::display-name', 0, null); + return info.get_display_name(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + return this.file.get_basename(); + } + } + } + + destroy(){ + } +}; +Signals.addSignalMethods(PlaceInfo.prototype); + +// Menu Place Shortcut item class +var PlaceMenuItem = GObject.registerClass(class Arc_Menu_PlaceMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, info, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._displayType = displayType; + this._info = info; + this._settings = menuLayout._settings; + this.isContainedInCategory = isContainedInCategory; + this.hasContextMenu = true; + + this.label = new St.Label({ + text: _(info.name), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.x_expand = this.y_expand = false; + this.x_align = this.y_align = Clutter.ActorAlign.CENTER; + } + else{ + this.add_child(this.label); + } + + this._changedId = this._info.connect('changed', this._propertiesChanged.bind(this)); + } + + createIcon(){ + let iconSizeEnum; + if(this.isContainedInCategory) + iconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + else + iconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + return new St.Icon({ + gicon: this._info.gicon ? this._info.gicon : this._info.icon, + icon_size: iconSize, + }); + } + + _onDestroy() { + if (this._changedId) { + this._info.disconnect(this._changedId); + this._changedId = null; + } + if(this._info) + this._info.destroy(); + super._onDestroy(); + } + + popupContextMenu(){ + if(this.tooltip) + this.tooltip.hide(); + if(!this._app && !this._path) + return; + + if(this.contextMenu === undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._path) + this.contextMenu.path = this._path; + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + activate(event) { + this._info.launch(event.get_time()); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _propertiesChanged(info) { + this._info = info; + this.createIcon(); + if(this.label) + this.label.text = info.name; + } +}); + +var SearchBox = GObject.registerClass({ +Signals: { + 'search-changed': { param_types: [GObject.TYPE_STRING] }, + 'entry-key-focus-in': { }, + 'entry-key-press': { param_types: [Clutter.Event.$gtype] }, +},}, +class Arc_Menu_SearchBox extends St.Entry { + _init(menuLayout) { + super._init({ + hint_text: _("Search…"), + track_hover: true, + can_focus: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + name: "ArcSearchEntry" + }); + this.searchResults = menuLayout.searchResults; + this._settings = menuLayout._settings; + this.triggerSearchChangeEvent = true; + + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.EXTRA_SMALL_ICON_SIZE); + + this._findIcon = new St.Icon({ + style_class: 'search-entry-icon', + icon_name: 'edit-find-symbolic', + icon_size: iconSize + }); + + this._clearIcon = new St.Icon({ + style_class: 'search-entry-icon', + icon_name: 'edit-clear-symbolic', + icon_size: iconSize + }); + + this.set_primary_icon(this._findIcon); + + this._text = this.get_clutter_text(); + this._textChangedId = this._text.connect('text-changed', this._onTextChanged.bind(this)); + this._keyPressId = this._text.connect('key-press-event', this._onKeyPress.bind(this)); + this._keyFocusInId = this._text.connect('key-focus-in', this._onKeyFocusIn.bind(this)); + this._keyFocusInId = this._text.connect('key-focus-out', this._onKeyFocusOut.bind(this)); + this._searchIconClickedId = this.connect('secondary-icon-clicked', () => this.clear()); + this.connect('destroy', this._onDestroy.bind(this)); + } + + updateStyle(removeBorder){ + let style = this.style; + this.style = style.replace("border-width: 0;", ""); + if(removeBorder) + this.style += 'border-width: 0;'; + } + + get entryBox(){ + return this; + } + + get actor(){ + return this; + } + + getText() { + return this.get_text(); + } + + setText(text) { + this.set_text(text); + } + + clearWithoutSearchChangeEvent(){ + this.triggerSearchChangeEvent = false; + this.set_text(''); + this.triggerSearchChangeEvent = true; + } + + hasKeyFocus() { + return this.contains(global.stage.get_key_focus()); + } + + clear() { + this.set_text(''); + } + + isEmpty() { + return this.get_text() == ''; + } + + _onKeyFocusOut(){ + if(!this.isEmpty()){ + this.add_style_pseudo_class('focus'); + return Clutter.EVENT_STOP; + } + } + + _onTextChanged() { + let searchString = this.get_text(); + if(!this.isEmpty()){ + if(!this.hasKeyFocus()) + this.grab_key_focus(); + if (!this.searchResults.getTopResult()?.has_style_pseudo_class("active")) + this.searchResults.getTopResult()?.add_style_pseudo_class("active") + this.add_style_pseudo_class('focus'); + this.set_secondary_icon(this._clearIcon); + } + else{ + if(!this.hasKeyFocus()) + this.remove_style_pseudo_class('focus'); + this.set_secondary_icon(null); + } + + if(this.triggerSearchChangeEvent) + this.emit('search-changed', searchString); + } + + _onKeyPress(actor, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Return || + symbol == Clutter.KEY_KP_Enter) { + if (!this.isEmpty()) { + if (this.searchResults.getTopResult()) { + this.searchResults.getTopResult().activate(event); + } + } + return Clutter.EVENT_STOP; + } + this.emit('entry-key-press', event); + return Clutter.EVENT_PROPAGATE; + } + + _onKeyFocusIn() { + this.add_style_pseudo_class('focus'); + this.emit('entry-key-focus-in'); + return Clutter.EVENT_PROPAGATE; + } + + _onDestroy() { + if (this._textChangedId) { + this._text.disconnect(this._textChangedId); + this._textChangedId = null; + } + if (this._keyPressId) { + this._text.disconnect(this._keyPressId); + this._keyPressId = null; + } + if (this._keyFocusInId) { + this._text.disconnect(this._keyFocusInId); + this._keyFocusInId = null; + } + if(this._searchIconClickedId){ + this.disconnect(this._searchIconClickedId); + this._searchIconClickedId = null; + } + } +}); + +/** + * This class is responsible for the appearance of the menu button. + */ +var MenuButtonWidget = class Arc_Menu_MenuButtonWidget{ + constructor() { + this.actor = new St.BoxLayout({ + style_class: 'panel-status-menu-box', + pack_start: false + }); + this._arrowIcon = PopupMenu.arrowIcon(St.Side.BOTTOM); + this._arrowIcon.add_style_class_name('arc-menu-arrow'); + + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + track_hover:true, + reactive: true, + }); + this._label = new St.Label({ + text: _("Applications"), + y_expand: true, + style_class: 'arc-menu-text', + y_align: Clutter.ActorAlign.CENTER, + }); + + this.actor.add_child(this._icon); + this.actor.add_child(this._label); + this.actor.add_child(this._arrowIcon); + } + + setActiveStylePseudoClass(enable){ + if(enable){ + this._arrowIcon.add_style_pseudo_class('active'); + this._icon.add_style_pseudo_class('active'); + this._label.add_style_pseudo_class('active'); + } + else{ + this._arrowIcon.remove_style_pseudo_class('active'); + this._icon.remove_style_pseudo_class('active'); + this._label.remove_style_pseudo_class('active'); + } + } + + updateArrowIconSide(side){ + let iconName; + switch (side) { + case St.Side.TOP: + iconName = 'pan-down-symbolic'; + break; + case St.Side.RIGHT: + iconName = 'pan-start-symbolic'; + break; + case St.Side.BOTTOM: + iconName = 'pan-up-symbolic'; + break; + case St.Side.LEFT: + iconName = 'pan-end-symbolic'; + break; + } + this._arrowIcon.icon_name = iconName; + } + + getPanelLabel() { + return this._label; + } + + getPanelIcon() { + return this._icon; + } + + showArrowIcon() { + if (!this.actor.contains(this._arrowIcon)) { + this.actor.add_child(this._arrowIcon); + } + } + + hideArrowIcon() { + if (this.actor.contains(this._arrowIcon)) { + this.actor.remove_child(this._arrowIcon); + } + } + + showPanelIcon() { + if (!this.actor.contains(this._icon)) { + this.actor.add_child(this._icon); + } + } + + hidePanelIcon() { + if (this.actor.contains(this._icon)) { + this.actor.remove_child(this._icon); + } + } + + showPanelText() { + if (!this.actor.contains(this._label)) { + this.actor.add_child(this._label); + } + } + + hidePanelText() { + this._label.style = ''; + if (this.actor.contains(this._label)) { + this.actor.remove_child(this._label); + } + } + + setPanelTextStyle(style){ + this._label.style = style; + } +}; + +var DashMenuButtonWidget = class Arc_Menu_DashMenuButtonWidget{ + constructor(menuButton, settings) { + this._menuButton = menuButton; + this._settings = settings; + this.actor = new St.Button({ + style_class: 'show-apps', + track_hover: true, + can_focus: true, + toggle_mode: false, + reactive: false + }); + this.actor._delegate = this; + this.icon = new imports.ui.iconGrid.BaseIcon(_("ArcMenu"), + { setSizeManually: true, + showLabel: false, + createIcon: this._createIcon.bind(this) }); + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + icon_size: 15, + track_hover:true, + reactive: true + }); + this.icon._delegate = this.actor; + this._labelText = _("ArcMenu"); + this.label = new St.Label({ style_class: 'dash-label' }); + this.label.hide(); + Main.layoutManager.addChrome(this.label); + this.label_actor = this.label; + this.actor.set_child(this.icon); + + this.child = this.actor; + } + showLabel() { + if (!this._labelText) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.actor.get_transformed_position(); + let node = this.label.get_theme_node(); + + let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1; + let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1; + + let labelWidth = this.label.get_width(); + let labelHeight = this.label.get_height(); + + let x, y, xOffset, yOffset; + + let position = this._menuButton._panel._settings.get_enum('dock-position'); + this._isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); + let labelOffset = node.get_length('-x-offset'); + switch (position) { + case St.Side.LEFT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = stageX + this.actor.get_width() + xOffset; + break; + case St.Side.RIGHT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = Math.round(stageX) - labelWidth - xOffset; + break; + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + case St.Side.BOTTOM: + yOffset = labelOffset; + y = stageY - labelHeight - yOffset; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + } + + // keep the label inside the screen border + // Only needed fot the x coordinate. + + // Leave a few pixel gap + let gap = 5; + let monitor = Main.layoutManager.findMonitorForActor(this.actor); + if (x - monitor.x < gap) + x += monitor.x - x + labelOffset; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; + + this.label.remove_all_transitions(); + this.label.set_position(x, y); + this.label.ease({ + opacity: 255, + duration: Dash.DASH_ITEM_LABEL_SHOW_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD + }); + } + hideLabel() { + this.label.ease({ + opacity: 0, + duration: Dash.DASH_ITEM_LABEL_HIDE_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => this.label.hide() + }); + } + _createIcon(size) { + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + track_hover:true, + icon_size: size, + reactive: true + }); + let path = this._settings.get_string('custom-menu-button-icon'); + let iconString = Utils.getMenuButtonIcon(this._settings, path); + this._icon.set_gicon(Gio.icon_new_for_string(iconString)); + + return this._icon; + } + getPanelIcon() { + return this._icon; + } +}; + +var WorldClocksSection = GObject.registerClass(class Arc_Menu_WorldClocksSection extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, null, null); + + this.x_expand = true; + this._clock = new imports.gi.GnomeDesktop.WallClock(); + this._clockNotifyId = 0; + + this._locations = []; + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._grid = new St.Widget({ style_class: 'world-clocks-grid', + x_expand: true, + layout_manager: layout }); + layout.hookup_style(this._grid); + + this.add_child(this._grid); + + this._clocksApp = null; + this._clocksProxy = new ClocksProxy( + Gio.DBus.session, + 'org.gnome.clocks', + '/org/gnome/clocks', + this._onProxyReady.bind(this), + null /* cancellable */, + Gio.DBusProxyFlags.DO_NOT_AUTO_START | Gio.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); + + this._clockSettings = new Gio.Settings({ + schema_id: 'org.gnome.shell.world-clocks', + }); + this.clocksChangedID = this._clockSettings.connect('changed', this._clocksChanged.bind(this)); + this._clocksChanged(); + + this._appSystem = Shell.AppSystem.get_default(); + this.syncID = this._appSystem.connect('installed-changed', + this._sync.bind(this)); + this._sync(); + } + + _onDestroy(){ + if(this.syncID){ + this._appSystem.disconnect(this.syncID); + this.syncID = null; + } + if(this.clocksChangedID){ + this._clockSettings.disconnect(this.clocksChangedID); + this.clocksChangedID = null; + } + if(this.clocksProxyID){ + this._clocksProxy.disconnect(this.clocksProxyID); + this.clocksProxyID = null; + } + if (this._clockNotifyId){ + this._clock.disconnect(this._clockNotifyId); + this._clockNotifyId = null; + } + } + + activate(event) { + super.activate(event); + if (this._clocksApp){ + this._clocksApp.activate(); + } + } + + _sync() { + this._clocksApp = this._appSystem.lookup_app('org.gnome.clocks.desktop'); + this.visible = this._clocksApp != null; + } + + _clocksChanged() { + this._grid.destroy_all_children(); + this._locations = []; + + let world = imports.gi.GWeather.Location.get_world(); + let clocks = this._clockSettings.get_value('locations').deep_unpack(); + for (let i = 0; i < clocks.length; i++) { + let l = world.deserialize(clocks[i]); + if (l && l.get_timezone() != null) + this._locations.push({ location: l }); + } + + this._locations.sort((a, b) => { + return a.location.get_timezone().get_offset() - + b.location.get_timezone().get_offset(); + }); + + let layout = this._grid.layout_manager; + let title = this._locations.length == 0 + ? _("Add world clocks…") + : _("World Clocks"); + let header = new St.Label({ x_align: Clutter.ActorAlign.START, + text: title }); + header.style = "font-weight: bold;"; + layout.attach(header, 0, 0, 2, 1); + this.label_actor = header; + + let localOffset = GLib.DateTime.new_now_local().get_utc_offset(); + + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i].location; + + let name = l.get_city_name() || l.get_name(); + let label = new St.Label({ text: name, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true }); + label.style = "font-weight: normal; font-size: 0.9em;"; + let time = new St.Label(); + time.style = "font-feature-settings: \"tnum\"; font-size: 1.2em;"; + let otherOffset = this._getTimeAtLocation(l).get_utc_offset(); + let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR; + let fmt = Math.trunc(offset) == offset ? '%s%.0f' : '%s%.1f'; + let prefix = offset >= 0 ? '+' : '-'; + let tz = new St.Label({ text: fmt.format(prefix, Math.abs(offset)), + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER }); + tz.style = "font-feature-settings: \"tnum\"; font-size: 0.9em;"; + if (this._grid.text_direction == Clutter.TextDirection.RTL) { + layout.attach(tz, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(label, 2, i + 1, 1, 1); + } else { + layout.attach(label, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(tz, 2, i + 1, 1, 1); + } + + this._locations[i].actor = time; + } + + if (this._grid.get_n_children() > 1) { + if (!this._clockNotifyId) { + this._clockNotifyId = + this._clock.connect('notify::clock', this._updateLabels.bind(this)); + } + this._updateLabels(); + } else { + if (this._clockNotifyId) + this._clock.disconnect(this._clockNotifyId); + this._clockNotifyId = 0; + } + } + + _getTimeAtLocation(location) { + let tz = GLib.TimeZone.new(location.get_timezone().get_tzid()); + return GLib.DateTime.new_now(tz); + } + + _updateLabels() { + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i]; + let now = this._getTimeAtLocation(l.location); + l.actor.text = Util.formatTime(now, { timeOnly: true }); + } + } + + _onProxyReady(proxy, error) { + if (error) { + log(`Failed to create GNOME Clocks proxy: ${error}`); + return; + } + + this.clocksProxyID = this._clocksProxy.connect('g-properties-changed', + this._onClocksPropertiesChanged.bind(this)); + this._onClocksPropertiesChanged(); + } + + _onClocksPropertiesChanged() { + if (this._clocksProxy.g_name_owner == null) + return; + + this._clockSettings.set_value('locations', + new GLib.Variant('av', this._clocksProxy.Locations)); + } +}); + +var WeatherSection = GObject.registerClass(class Arc_Menu_WeatherSection extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, null, null); + + this.x_expand = true; + this.x_align = Clutter.ActorAlign.FILL; + this._weatherClient = new imports.misc.weather.WeatherClient(); + + let box = new St.BoxLayout({ + vertical: true, + x_expand: true, + }); + + this.add_child(box); + + let titleBox = new St.BoxLayout({ }); + let label = new St.Label({ + x_align: Clutter.ActorAlign.START, + x_expand: true, + y_align: Clutter.ActorAlign.END, + text: _('Weather'), + }) + label.style = "font-weight: bold; padding-bottom: 5px;"; + titleBox.add_child(label); + box.add_child(titleBox); + + this._titleLocation = new St.Label({ + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.END, + }); + this._titleLocation.style = "font-weight: bold; padding-bottom: 5px;"; + titleBox.add_child(this._titleLocation); + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._forecastGrid = new St.Widget({ + style_class: 'weather-grid', + layout_manager: layout, + }); + layout.hookup_style(this._forecastGrid); + box.add_child(this._forecastGrid); + + this.syncID = this._weatherClient.connect('changed', this._sync.bind(this)); + this._sync(); + + } + _onDestroy(){ + if(this.syncID){ + this._weatherClient.disconnect(this.syncID); + this.syncID = null; + } + this._weatherClient = null; + } + vfunc_map() { + this._weatherClient.update(); + super.vfunc_map(); + } + + activate(event) { + super.activate(event); + this._weatherClient.activateApp(); + } + + _getInfos() { + let forecasts = this._weatherClient.info.get_forecast_list(); + + let now = GLib.DateTime.new_now_local(); + let current = GLib.DateTime.new_from_unix_local(0); + let infos = []; + for (let i = 0; i < forecasts.length; i++) { + const [valid, timestamp] = forecasts[i].get_value_update(); + if (!valid || timestamp === 0) + continue; // 0 means 'never updated' + + const datetime = GLib.DateTime.new_from_unix_local(timestamp); + if (now.difference(datetime) > 0) + continue; // Ignore earlier forecasts + + if (datetime.difference(current) < GLib.TIME_SPAN_HOUR) + continue; // Enforce a minimum interval of 1h + + if (infos.push(forecasts[i]) == 5) + break; // Use a maximum of five forecasts + + current = datetime; + } + return infos; + } + + _addForecasts() { + let layout = this._forecastGrid.layout_manager; + + let infos = this._getInfos(); + if (this._forecastGrid.text_direction == Clutter.TextDirection.RTL) + infos.reverse(); + + let col = 0; + infos.forEach(fc => { + const [valid_, timestamp] = fc.get_value_update(); + let timeStr = Util.formatTime(new Date(timestamp * 1000), { + timeOnly: true + }); + const [, tempValue] = fc.get_value_temp(imports.gi.GWeather.TemperatureUnit.DEFAULT); + const tempPrefix = tempValue >= 0 ? ' ' : ''; + + let time = new St.Label({ + text: timeStr, + x_align: Clutter.ActorAlign.CENTER, + }); + time.style = "font-size: 0.8em;" + let icon = new St.Icon({ + style_class: 'weather-forecast-icon', + icon_name: fc.get_symbolic_icon_name(), + x_align: Clutter.ActorAlign.CENTER, + x_expand: true, + }); + let temp = new St.Label({ + text: '%s%.0f°'.format(tempPrefix, tempValue), + x_align: Clutter.ActorAlign.CENTER, + }); + + temp.clutter_text.ellipsize = imports.gi.Pango.EllipsizeMode.NONE; + time.clutter_text.ellipsize = imports.gi.Pango.EllipsizeMode.NONE; + + layout.attach(time, col, 0, 1, 1); + layout.attach(icon, col, 1, 1, 1); + layout.attach(temp, col, 2, 1, 1); + col++; + }); + } + + _setStatusLabel(text) { + let layout = this._forecastGrid.layout_manager; + let label = new St.Label({ text }); + layout.attach(label, 0, 0, 1, 1); + } + + _updateForecasts() { + this._forecastGrid.destroy_all_children(); + + if (!this._weatherClient.hasLocation) { + this._setStatusLabel(_("Select a location…")); + return; + } + + let info = this._weatherClient.info; + let loc = info.get_location(); + if (loc.get_level() !== imports.gi.GWeather.LocationLevel.CITY && loc.has_coords()) { + let world = imports.gi.GWeather.Location.get_world(); + loc = world.find_nearest_city(...loc.get_coords()); + } + this._titleLocation.text = loc.get_name(); + + if (this._weatherClient.loading) { + this._setStatusLabel(_("Loading…")); + return; + } + + if (info.is_valid()) { + this._addForecasts(); + return; + } + + if (info.network_error()) + this._setStatusLabel(_("Go online for weather information")); + else + this._setStatusLabel(_("Weather information is currently unavailable")); + } + + _sync() { + this.visible = this._weatherClient.available; + + if (!this.visible) + return; + + this._titleLocation.visible = this._weatherClient.hasLocation; + + this._updateForecasts(); + } +}); + +function _isToday(date) { + let now = new Date(); + return now.getYear() == date.getYear() && + now.getMonth() == date.getMonth() && + now.getDate() == date.getDate(); +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js new file mode 100644 index 0000000..a0c1d16 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js @@ -0,0 +1,456 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.buttonPressEventID = global.stage.connect("button-press-event", () => { + if(this.arcMenu.isOpen && this.backButton.visible){ + let event = Clutter.get_current_event(); + if(event.get_button() === 8){ + this.backButton.activate(event); + } + } + }); + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'left-panel' + }); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true, + reactive:true + }); + this.leftBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ vertical: true }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBox.add_child(separator); + + this.backButton = new MW.BackMenuItem(this); + this.navigateBox.add_child(this.backButton.actor); + + this.viewProgramsButton = new MW.ViewAllPrograms(this); + this.navigateBox.add_child(this.viewProgramsButton.actor); + this.leftBox.add_child(this.navigateBox); + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 5px 10px 0px 10px;"; + this.leftBox.add_child(this.searchBox.actor); + } + + this.rightBox = new St.BoxLayout({ + vertical: true, + style_class: 'right-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.placesShortcuts = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this.bookmarksShorctus = false; + this.softwareShortcuts = false; + + if(!this._settings.get_boolean('disable-user-avatar')){ + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.rightBox.add_child(this.user.actor); + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.rightBox.add_child(separator); + } + + this.shortcutsBox = new St.BoxLayout({ + vertical: true + }); + + this.shortcutsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.rightBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //draw bottom right horizontal separator + logic to determine if should show + let shouldDraw = false; + if(this._settings.get_value('directory-shortcuts-list').deep_unpack().length > 0){ + this.placesShortcuts = true; + } + if(this._settings.get_value('application-shortcuts-list').deep_unpack().length > 0){ + this.softwareShortcuts = true; + } + + //check to see if should draw separator + if(this.placesShortcuts && (this._settings.get_boolean('show-external-devices') || this.softwareShortcuts || this._settings.get_boolean('show-bookmarks')) ) + shouldDraw = true; + if(shouldDraw){ + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //External Devices and Bookmarks Shortcuts + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this.shortcutsBox.add_child(this.externalDevicesBox); + + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + //create new section for Power, Lock, Logout, Suspend Buttons + this.actionsBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.END, + style: "spacing: 6px; padding: 0px;" + }); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + this.rightBox.add_child(this.actionsBox); + + this.extraCategoriesLinksBox = new St.BoxLayout({ + vertical: true + }); + this.extraCategoriesLinksBox.hide(); + this.extraCategoriesSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + + let extraCategoriesLinksLocation = this._settings.get_enum('arcmenu-extra-categories-links-location'); + if(extraCategoriesLinksLocation === Constants.MenuItemLocation.TOP) + this.leftBox.insert_child_below(this.extraCategoriesLinksBox, this.applicationsScrollBox); + else + this.navigateBox.insert_child_above(this.extraCategoriesLinksBox, this.navigateBox.get_child_at_index(0)); + this.extraCategoriesLinksBox.add_child(this.extraCategoriesSeparator); + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + _createExtraCategoriesLinks(){ + this.showExtraCategoriesLinksBox = false; + let extraCategories = this._settings.get_value("arcmenu-extra-categories-links").deep_unpack(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + + //Don't create extra categories quick links if + //the default menu view is the categories list + if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST) + return; + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + //If ArcMenu layout set to "Pinned Apps" default view and Extra Categories "Pinned Apps" is enabled, + //do not display "Pinned Apps" as an extra category -- Same for "Frequent Apps" + if(categoryEnum == Constants.CategoryType.PINNED_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.FREQUENT_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.ALL_PROGRAMS && shouldShow && defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS) + shouldShow = false; + if(shouldShow){ + let extraCategoryItem = this.categoryDirectories.get(categoryEnum); + if(!extraCategoryItem) + continue; + + this.showExtraCategoriesLinksBox = true; + if(extraCategoryItem.get_parent()) + extraCategoryItem.get_parent().remove_child(extraCategoryItem); + + this.extraCategoriesLinksBox.insert_child_below(extraCategoryItem, this.extraCategoriesSeparator); + } + } + if(this.showExtraCategoriesLinksBox) + this.extraCategoriesLinksBox.show(); + else + this.extraCategoriesLinksBox.hide(); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + this.hasPinnedApps = true; + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + //If ArcMenu layout set to "Pinned Apps" default view and Extra Categories "Pinned Apps" is enabled, + //do not display "Pinned Apps" as an extra category -- Same for "Frequent Apps" + if(categoryEnum == Constants.CategoryType.PINNED_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.FREQUENT_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + + this._createExtraCategoriesLinks(); + } + + displayPinnedApps(){ + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS){ + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + } + else if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else if(defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else if(defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + super.displayPinnedApps(); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayAllApps(showBackButton = true){ + super.displayAllApps(); + this.viewProgramsButton.actor.hide(); + + if(showBackButton){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + } + else{ + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.backButton.actor.hide(); + } + } + + displayCategories(){ + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS || defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else{ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + } + + super.displayCategories(); + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + this.displayPinnedApps(); + else if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST) + this.displayCategories(); + else if(defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + this.displayFrequentApps(); + else if(defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS) + this.displayAllApps(false); + } + + displayCategoryAppList(appList, category){ + super.displayCategoryAppList(appList, category); + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + } + + displayFrequentApps(){ + this._clearActorsFromBox(); + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + let appList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let isContainedInCategory = false; + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST, null, isContainedInCategory); + appList.push(item); + } + } + let activeMenuItemSet = false; + for (let i = 0; i < appList.length; i++) { + let item = appList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_child(item.actor); + if(!activeMenuItemSet){ + activeMenuItemSet = true; + this.activeMenuItem = item; + } + } + } + + displayRecentFiles(){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + super.displayRecentFiles(); + } + + _clearActorsFromBox(box){ + //keep track of the previous category for the back button. + this.previousCategoryType = this.activeCategoryType; + super._clearActorsFromBox(box); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(!searchBox.isEmpty()){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } + + destroy(){ + if(this.buttonPressEventID){ + global.stage.disconnect(this.buttonPressEventID); + this.buttonPressEventID = null; + } + super.destroy() + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js new file mode 100644 index 0000000..dce09de --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js @@ -0,0 +1,285 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 4, + RowSpacing: 4, + VerticalMainBox: true, + DefaultMenuWidth: 460, + DefaultIconGridStyle: 'LargeRectIconGrid', + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBoxStyle = "margin: 0px 0px 10px 0px; spacing: 0px; background-color: rgba(186, 196,201, 0.1); padding: 11px 5px;"+ + "border-color:rgba(186, 196,201, 0.2); border-bottom-width: 1px;"; + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: this.topBoxStyle + }); + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.style = "margin: 5px 15px 5px 15px;"; + this.topBox.add_child(this.searchBox.actor); + this.subMainBox.add_child(this.topBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + style: "padding-bottom: 10px;" + }); + this.applicationsScrollBox = this._createScrollBox({ + clip_to_allocation: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px;background-color:rgba(186, 196,201, 0.1) ; padding: 12px 5px;"+ + "border-color:rgba(186, 196,201, 0.2) ; border-top-width: 1px;"; + + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "margin: 0px 15px; spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.user.x_expand = true; + this.user.x_align = Clutter.ActorAlign.FILL; + this.actionsBox.add_child(this.user.actor); + + + let filesButton = new MW.ShortcutMenuItem(this, _("Files"), "system-file-manager", "org.gnome.Nautilus.desktop", Constants.DisplayType.BUTTON); + if(filesButton.shouldShow) + this.actionsBox.add_child(filesButton.actor); + + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + + this.leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(this.leaveButton.actor); + + this.backButton = this._createNavigationButtons(_("All Apps"), MW.BackButton) + this.allAppsButton = this._createNavigationButtons(_("Pinned"), MW.AllAppsButton) + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.IconGridSize = 42; + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + } + + setDefaultMenuView(){ + this.setGridLayout(Constants.DisplayType.GRID, 4, 4); + this.layoutProperties.IconGridSize = 42; + super.setDefaultMenuView(); + this.activeCategory = _("Pinned"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + + displayAllApps(){ + this.activeCategory = _("All Apps"); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + + this.setGridLayout(Constants.DisplayType.LIST, 1, 3); + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 4, 4, false); + } + + updateStyle(){ + super.updateStyle(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + const RoundBottomBorder = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + const RoundTopBorder = "border-radius: " + borderRadius + "px " + borderRadius + "px 0px 0px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + RoundBottomBorder; + this.topBox.style = this.topBoxStyle + RoundTopBorder; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + } + + setGridLayout(displayType, columns, spacing, setStyle = true){ + if(setStyle){ + this.applicationsGrid.x_align = displayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER; + displayType === Constants.DisplayType.LIST ? this.applicationsBox.add_style_class_name('margin-box') : this.applicationsBox.remove_style_class_name('margin-box'); + } + + this.applicationsGrid.layout_manager.column_spacing = spacing; + this.applicationsGrid.layout_manager.row_spacing = spacing; + this.layoutProperties.DisplayType = displayType; + } + + loadCategories() { + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this.layoutProperties.IconGridSize = 26; + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + displayPinnedApps() { + this._clearActorsFromBox(this.applicationsBox); + this.activeCategory = _("Pinned"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + this._hideNavigationButtons(); + + if(category === Constants.CategoryType.PINNED_APPS){ + this.subMainBox.insert_child_at_index(this.allAppsButton, 1); + } + else if(category === Constants.CategoryType.ALL_PROGRAMS){ + this.subMainBox.insert_child_at_index(this.backButton, 1); + } + } + + _hideNavigationButtons(){ + if(this.subMainBox.contains(this.backButton)) + this.subMainBox.remove_child(this.backButton); + if(this.subMainBox.contains(this.allAppsButton)) + this.subMainBox.remove_child(this.allAppsButton); + } + + _createNavigationButtons(buttonTitle, ButtonClass){ + let navButton = this.createLabelRow(buttonTitle); + navButton.remove_child(navButton._ornamentLabel); + navButton.label.y_align = Clutter.ActorAlign.CENTER; + navButton.style = 'padding: 0px 15px 10px 15px;' + navButton.add_child(new ButtonClass(this)); + return navButton; + } + + _onSearchBoxChanged(searchBox, searchString){ + this.applicationsBox.remove_style_class_name('margin-box'); + if(!searchBox.isEmpty()) + this._hideNavigationButtons(); + super._onSearchBoxChanged(searchBox, searchString); + } + + destroy(){ + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + this.leaveButton.destroy(); + this.backButton.destroy(); + this.allAppsButton.destroy(); + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js new file mode 100644 index 0000000..af9d2c4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js @@ -0,0 +1,1128 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, GMenu, Gtk, Shell, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const appSys = Shell.AppSystem.get_default(); +const ArcSearch = Me.imports.search; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MenuLayouts = Me.imports.menulayouts; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const { RecentFilesManager } = Me.imports.recentFilesManager; +const Utils = Me.imports.utils; + +//This class handles the core functionality of all the menu layouts. +//Each menu layout extends this class. +var BaseLayout = class { + constructor(menuButton, layoutProperties){ + this.menuButton = menuButton; + this._settings = menuButton._settings; + this.mainBox = menuButton.mainBox; + this.contextMenuManager = menuButton.contextMenuManager; + this.subMenuManager = menuButton.subMenuManager; + this.arcMenu = menuButton.arcMenu; + this.section = menuButton.section; + this.layout = this._settings.get_enum('menu-layout'); + this.layoutProperties = layoutProperties; + this._focusChild = null; + this.shouldLoadPinnedApps = true; + this.hasPinnedApps = false; + + if(this.layoutProperties.Search){ + this.searchResults = new ArcSearch.SearchResults(this); + this.searchBox = new MW.SearchBox(this); + this._searchBoxChangedId = this.searchBox.connect('search-changed', this._onSearchBoxChanged.bind(this)); + this._searchBoxKeyPressId = this.searchBox.connect('entry-key-press', this._onSearchBoxKeyPress.bind(this)); + } + + this._mainBoxKeyPressId = this.mainBox.connect('key-press-event', this._onMainBoxKeyPress.bind(this)); + + this._tree = new GMenu.Tree({ menu_basename: 'applications.menu' }); + this._treeChangedId = this._tree.connect('changed', () => this.reloadApplications()); + + this._gnomeFavoritesReloadID = AppFavorites.getAppFavorites().connect('changed', () => { + if(this.categoryDirectories){ + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FAVORITES); + if(categoryMenuItem) + this._loadGnomeFavorites(categoryMenuItem); + } + }); + + this.mainBox.vertical = this.layoutProperties.VerticalMainBox; + + this.createLayout(); + this.updateStyle(); + } + + createLayout(){ + this.disableFadeEffect = this._settings.get_boolean('disable-scrollview-fade-effect'); + this.activeCategoryType = -1; + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.applicationsGrid = new St.Widget({ + x_expand: true, + x_align: this.layoutProperties.DisplayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.applicationsGrid); + } + + setDefaultMenuView(){ + if(this.layoutProperties.Search){ + this.searchBox.clearWithoutSearchChangeEvent(); + this.searchResults.setTerms([]); + } + + this._clearActorsFromBox(); + this.resetScrollBarPosition(); + } + + getColumnsFromActor(actor){ + let gridIconWidth = this.getActorWidthFromStyleClass(actor.name); + return this.getBestFitColumns(gridIconWidth); + } + + getColumnsFromGridIconSizeSetting(){ + let gridIconWidth; + let iconSizeEnum = this._settings.get_enum("menu-item-grid-icon-size"); + + if(iconSizeEnum === Constants.GridIconSize.DEFAULT) + gridIconWidth = this.getActorWidthFromStyleClass(this.layoutProperties.DefaultIconGridStyle); + else{ + Constants.GridIconInfo.forEach((info) => { + if(iconSizeEnum === info.ENUM){ + gridIconWidth = info.SIZE; + return; + } + }); + } + return this.getBestFitColumns(gridIconWidth); + } + + getBestFitColumns(gridIconWidth){ + let width = this.layoutProperties.MenuWidth; + let spacing = this.layoutProperties.ColumnSpacing; + let columns = Math.floor(width / (gridIconWidth + spacing)); + return columns; + } + + getActorWidthFromStyleClass(name){ + let size; + + Constants.GridIconInfo.forEach((info) => { + if(name === info.NAME){ + size = info.SIZE; + return; + } + }); + return size; + } + + resetScrollBarPosition(){ + let appsScrollBoxAdj; + + if(this.applicationsScrollBox){ + appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.categoriesScrollBox){ + appsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.shortcutsScrollBox){ + appsScrollBoxAdj = this.shortcutsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.actionsScrollBox){ + appsScrollBoxAdj = this.actionsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + } + + reloadApplications(){ + //Don't reload applications if the menu is open. + //Instead, reload on menu-closed event. + //Prevents the menu from jumping to its default view + //when reloadApplications() is called. + if(this.arcMenu.isOpen){ + if(!this._menuClosedID){ + this._menuClosedID = this.arcMenu.connect('menu-closed', () => { + this.reloadApplications(); + if(this._menuClosedID){ + this.arcMenu.disconnect(this._menuClosedID); + this._menuClosedID = null; + } + }); + } + return; + } + + if(this.applicationsMap){ + this.applicationsMap.forEach((value,key,map)=>{ + value.destroy(); + }); + this.applicationsMap = null; + } + + if(this.categoryDirectories){ + this.categoryDirectories.forEach((value,key,map)=>{ + value.destroy(); + }); + this.categoryDirectories = null; + } + + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + if(this.layoutProperties.Search){ + this.searchBox.updateStyle(this._settings.get_boolean('disable-searchbox-border')) + customStyle ? this.searchResults.setStyle('arc-menu-status-text') : this.searchResults.setStyle(''); + if(customStyle){ + this.searchBox.remove_style_class_name('default-search-entry'); + this.searchBox.add_style_class_name('arc-search-entry'); + } + else{ + this.searchBox.remove_style_class_name('arc-search-entry'); + this.searchBox.add_style_class_name('default-search-entry'); + } + } + } + + loadCategories(displayType = Constants.DisplayType.LIST){ + this.applicationsMap = new Map(); + this._tree.load_sync(); + let root = this._tree.get_root_directory(); + let iter = root.iter(); + let nextType; + while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) { + if (nextType == GMenu.TreeItemType.DIRECTORY) { + let dir = iter.get_directory(); + if (!dir.get_is_nodisplay()) { + let categoryId = dir.get_menu_id(); + let categoryMenuItem; + if(displayType === Constants.DisplayType.SIMPLE_CATEGORY) + categoryMenuItem = new MW.SimpleMenuItem(this, dir); + else if(displayType === Constants.DisplayType.SUBMENU_CATEGORY) + categoryMenuItem = new MW.CategorySubMenuItem(this, dir); + else + categoryMenuItem = new MW.CategoryMenuItem(this, dir, displayType); + this.categoryDirectories.set(categoryId, categoryMenuItem); + let foundRecentlyInstallApp = this._loadCategory(categoryId, dir); + categoryMenuItem.setRecentlyInstalledIndicator(foundRecentlyInstallApp); + //Sort the App List Alphabetically + categoryMenuItem.appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + } + } + } + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.ALL_PROGRAMS); + if(categoryMenuItem){ + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + //Show Recently Installed Indicator on All Programs category + if(value.isRecentlyInstalled && !categoryMenuItem.isRecentlyInstalled) + categoryMenuItem.setRecentlyInstalledIndicator(true); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + categoryMenuItem.appList = appList; + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FAVORITES); + if(categoryMenuItem){ + this._loadGnomeFavorites(categoryMenuItem); + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FREQUENT_APPS); + if(categoryMenuItem){ + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()) + categoryMenuItem.appList.push(mostUsed[i]); + } + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this.hasPinnedApps = true; + categoryMenuItem.appList = categoryMenuItem.appList.concat(this.pinnedAppsArray); + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + if(categoryMenuItem){ + this._loadRecentFiles(categoryMenuItem); + } + + } + + _loadCategory(categoryId, dir, submenuItem) { + let iter = dir.iter(); + let nextType; + let foundRecentlyInstallApp = false; + let isLayoutSimple2 = this.layout === Constants.MenuLayout.SIMPLE_2; + while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) { + if (nextType == GMenu.TreeItemType.ENTRY) { + let entry = iter.get_entry(); + let id; + try { + id = entry.get_desktop_file_id(); + } catch (e) { + continue; + } + let app = appSys.lookup_app(id); + if (!app) + app = new Shell.App({ app_info: entry.get_app_info() }); + if (app.get_app_info().should_show()){ + let item = this.applicationsMap.get(app); + if (!item) { + let isContainedInCategory = true; + item = new MW.ApplicationMenuItem(this, app, this.layoutProperties.DisplayType, null, isContainedInCategory); + } + let disabled = this._settings.get_boolean("disable-recently-installed-apps") + if(!disabled && item.isRecentlyInstalled) + foundRecentlyInstallApp = true; + if(!submenuItem){ + let categoryMenuItem = this.categoryDirectories.get(categoryId); + categoryMenuItem.appList.push(app); + this.applicationsMap.set(app, item); + } + else{ + submenuItem.applicationsMap.set(app, item); + } + } + } + else if (nextType == GMenu.TreeItemType.DIRECTORY) { + let subdir = iter.get_directory(); + if (!subdir.get_is_nodisplay()){ + if(this._settings.get_boolean('enable-sub-menus') && this.layoutProperties.DisplayType === Constants.DisplayType.LIST && !isLayoutSimple2){ + let submenuItem = this.applicationsMap.get(subdir); + if (!submenuItem) { + submenuItem = new MW.CategorySubMenuItem(this, subdir); + submenuItem._setParent(this.arcMenu); + let categoryMenuItem = this.categoryDirectories.get(categoryId); + categoryMenuItem.appList.push(subdir); + this.applicationsMap.set(subdir, submenuItem); + } + let recentlyInstallApp = this._loadCategory(categoryId, subdir, submenuItem); + if(recentlyInstallApp) + foundRecentlyInstallApp = true; + submenuItem.setRecentlyInstalledIndicator(foundRecentlyInstallApp); + } + else{ + let recentlyInstallApp = this._loadCategory(categoryId, subdir); + if(recentlyInstallApp) + foundRecentlyInstallApp = true; + } + } + } + } + return foundRecentlyInstallApp; + } + + setRecentlyInstalledIndicator(){ + let disabled = this._settings.get_boolean("disable-recently-installed-apps") + if(!disabled){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.setRecentlyInstalledIndicator(false); + for(let i = 0; i < categoryMenuItem.appList.length; i++){ + let item = this.applicationsMap.get(categoryMenuItem.appList[i]); + if(!item) + continue; + if(item instanceof MW.CategorySubMenuItem){ + item.setRecentlyInstalledIndicator(false); + for(let menuItem of item.applicationsMap.values()){ + if(menuItem.isRecentlyInstalled){ + item.setRecentlyInstalledIndicator(true); + break; + } + } + } + if(item.isRecentlyInstalled){ + categoryMenuItem.setRecentlyInstalledIndicator(true); + break; + } + } + } + } + } + + displayCategories(categoriesBox){ + if(!categoriesBox){ + categoriesBox = this.applicationsBox; + } + this._clearActorsFromBox(categoriesBox); + + this._futureActiveItem = false; + + for(let categoryMenuItem of this.categoryDirectories.values()){ + if(categoryMenuItem.get_parent()) + continue; + categoriesBox.add_child(categoryMenuItem.actor); + if(!this._futureActiveItem){ + this._futureActiveItem = categoryMenuItem; + } + } + + this.activeMenuItem = this._futureActiveItem; + } + + _loadGnomeFavorites(categoryMenuItem){ + let appList = AppFavorites.getAppFavorites().getFavorites(); + + //Show Recently Installed Indicator on GNOME favorites category + for(let i = 0; i < appList.length; i++){ + let item = this.applicationsMap.get(appList[i]); + if(item && item.isRecentlyInstalled && !categoryMenuItem.isRecentlyInstalled) + categoryMenuItem.setRecentlyInstalledIndicator(true); + } + + categoryMenuItem.appList = appList; + if(this.activeCategoryType === Constants.CategoryType.FAVORITES) + categoryMenuItem.displayAppList(); + } + + _loadRecentFiles(){ + if(!this.recentFilesManager) + this.recentFilesManager = new RecentFilesManager(); + } + + displayRecentFiles(box = this.applicationsBox, callback){ + const homeRegExp = new RegExp('^(' + GLib.get_home_dir() + ')'); + this._clearActorsFromBox(box); + this._futureActiveItem = false; + + this.recentFilesManager.filterRecentFiles(recentFile => { + let file = Gio.File.new_for_uri(recentFile.get_uri()); + let filePath = file.get_path(); + let name = recentFile.get_display_name(); + let icon = Gio.content_type_get_symbolic_icon(recentFile.get_mime_type()).to_string(); + let isContainedInCategory = true; + + let placeMenuItem = this.createMenuItem([name, icon, filePath], Constants.DisplayType.LIST, isContainedInCategory); + placeMenuItem._path = file.get_parent()?.get_path() // can be null + placeMenuItem.style = "padding-right: 15px;"; + placeMenuItem.description = recentFile.get_uri_display().replace(homeRegExp, '~'); + placeMenuItem.fileUri = recentFile.get_uri(); + + placeMenuItem._removeBtn = new MW.ArcMenuButtonItem(this, null, 'edit-delete-symbolic'); + placeMenuItem._removeBtn.toggleMenuOnClick = false; + placeMenuItem._removeBtn.x_align = Clutter.ActorAlign.END; + placeMenuItem._removeBtn.x_expand = true; + placeMenuItem._removeBtn.add_style_class_name("arcmenu-small-button"); + placeMenuItem._removeBtn.setIconSize(14); + placeMenuItem._removeBtn.connect('activate', () => { + try { + let recentManager = this.recentFilesManager.getRecentManager(); + recentManager.remove_item(placeMenuItem.fileUri); + } catch(err) { + log(err); + } + + placeMenuItem.cancelPopupTimeout(); + placeMenuItem.contextMenu?.close(); + box.remove_child(placeMenuItem); + placeMenuItem.destroy(); + }); + + placeMenuItem.add_child(placeMenuItem._removeBtn); + box.add_child(placeMenuItem); + + if(!this._futureActiveItem){ + this._futureActiveItem = placeMenuItem; + this.activeMenuItem = this._futureActiveItem; + } + + if(callback) + callback(); + }); + } + + _displayPlaces() { + var SHORTCUT_TRANSLATIONS = [_("Home"), _("Documents"), _("Downloads"), _("Music"), _("Pictures"), _("Videos"), _("Computer"), _("Network")]; + let directoryShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + for (let i = 0; i < directoryShortcuts.length; i++) { + let directory = directoryShortcuts[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + if(placeMenuItem) + this.shortcutsBox.add_child(placeMenuItem.actor); + } + } + + loadExtraPinnedApps(pinnedAppsArray, separatorIndex){ + let pinnedApps = pinnedAppsArray; + //if the extraPinnedApps array is empty, create a default list of apps. + if(!pinnedApps.length || !Array.isArray(pinnedApps)){ + pinnedApps = this._createExtraPinnedAppsList(); + } + + for(let i = 0;i < pinnedApps.length; i += 3){ + if(i === separatorIndex * 3 && i !== 0) + this._addSeparator(); + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem([pinnedApps[i], pinnedApps[i + 1], pinnedApps[i + 2]], Constants.DisplayType.BUTTON, isContainedInCategory); + placeMenuItem.actor.x_expand = false; + placeMenuItem.actor.y_expand = false; + placeMenuItem.actor.y_align = Clutter.ActorAlign.CENTER; + placeMenuItem.actor.x_align = Clutter.ActorAlign.CENTER; + this.actionsBox.add_child(placeMenuItem.actor); + } + } + + createMenuItem(menuItemArray, displayType, isContainedInCategory){ + let placeInfo, placeMenuItem; + let command = menuItemArray[2]; + let app = Shell.AppSystem.get_default().lookup_app(command); + + if(command === "ArcMenu_Home"){ + let homePath = GLib.get_home_dir(); + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(homePath), _("Home")); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Computer"){ + placeInfo = new PlaceDisplay.RootInfo(); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Network"){ + placeInfo = new PlaceDisplay.PlaceInfo('network', Gio.File.new_for_uri('network:///'), _('Network'),'network-workgroup-symbolic'); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Software"){ + let software = Utils.findSoftwareManager(); + if(software) + placeMenuItem = new MW.ShortcutMenuItem(this, _("Software"), 'system-software-install-symbolic', software, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Trash"){ + placeMenuItem = new MW.ShortcutMenuItem(this, _("Trash"), '', "ArcMenu_Trash", displayType, isContainedInCategory); + } + else if(command === Constants.ArcMenuSettingsCommand || command === "ArcMenu_Suspend" || command === "ArcMenu_LogOut" || command === "ArcMenu_PowerOff" + || command === "ArcMenu_Lock" || command === "ArcMenu_Restart" || command === "ArcMenu_HybridSleep" || command === "ArcMenu_Hibernate" || app){ + + placeMenuItem = new MW.ShortcutMenuItem(this, menuItemArray[0], menuItemArray[1], menuItemArray[2], displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Recent"){ + let uri = "recent:///"; + placeInfo = new MW.PlaceInfo(Gio.File.new_for_uri(uri), _(menuItemArray[0])); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command.startsWith("ArcMenu_")){ + let path = command.replace("ArcMenu_",''); + + if(path === "Documents") + path = imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS; + else if(path === "Downloads") + path = imports.gi.GLib.UserDirectory.DIRECTORY_DOWNLOAD; + else if(path === "Music") + path = imports.gi.GLib.UserDirectory.DIRECTORY_MUSIC; + else if(path === "Pictures") + path = imports.gi.GLib.UserDirectory.DIRECTORY_PICTURES; + else if(path === "Videos") + path = imports.gi.GLib.UserDirectory.DIRECTORY_VIDEOS; + + path = GLib.get_user_special_dir(path); + if (path !== null){ + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _(menuItemArray[0])); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + } + else{ + let path = command; + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _(menuItemArray[0]), (menuItemArray[1] !== "ArcMenu_Folder") ? Gio.icon_new_for_string(menuItemArray[1]) : null); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + return placeMenuItem; + } + + loadPinnedApps(){ + let pinnedApps = this._settings.get_strv('pinned-app-list'); + + this.pinnedAppsArray = null; + this.pinnedAppsArray = []; + + let categoryMenuItem = this.categoryDirectories ? this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS) : null; + let isContainedInCategory = categoryMenuItem ? true : false; + + for(let i = 0; i < pinnedApps.length; i += 3){ + if(i === 0 && pinnedApps[0] === "ArcMenu_WebBrowser") + this._updatePinnedAppsWebBrowser(pinnedApps); + + let pinnedAppsMenuItem = new MW.PinnedAppsMenuItem(this, pinnedApps[i], pinnedApps[i + 1], pinnedApps[i + 2], this.layoutProperties.DisplayType, isContainedInCategory); + pinnedAppsMenuItem.connect('saveSettings', ()=> { + let array = []; + for(let i = 0; i < this.pinnedAppsArray.length; i++){ + array.push(this.pinnedAppsArray[i]._name); + array.push(this.pinnedAppsArray[i]._iconPath); + array.push(this.pinnedAppsArray[i]._command); + } + this._settings.set_strv('pinned-app-list',array); + }); + this.pinnedAppsArray.push(pinnedAppsMenuItem); + } + + if(categoryMenuItem){ + categoryMenuItem.appList = null; + categoryMenuItem.appList = []; + categoryMenuItem.appList = categoryMenuItem.appList.concat(this.pinnedAppsArray); + } + } + + _updatePinnedAppsWebBrowser(pinnedApps){ + //Find the Default Web Browser, if found add to pinned apps list, if not found delete the placeholder. + //Will only run if placeholder is found. Placeholder only found with default settings set. + if(pinnedApps[0] === "ArcMenu_WebBrowser"){ + let browserName = ''; + try{ + //user may not have xdg-utils package installed which will throw error + let [res, stdout, stderr, status] = GLib.spawn_command_line_sync("xdg-settings get default-web-browser"); + let webBrowser = String.fromCharCode(...stdout); + browserName = webBrowser.split(".desktop")[0]; + browserName += ".desktop"; + } + catch(error){ + global.log("ArcMenu Error - Failed to find default web browser. Removing placeholder pinned app.") + } + + this._app = appSys.lookup_app(browserName); + if(this._app){ + pinnedApps[0] = this._app.get_name(); + pinnedApps[1] = ''; + pinnedApps[2] = this._app.get_id(); + } + else{ + pinnedApps.splice(0,3); + } + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + } + } + + displayPinnedApps(){ + this._clearActorsFromBox(); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + placesAddSeparator(id){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this._sections[id].add_child(separator); + } + + _redisplayPlaces(id) { + if(this._sections[id].get_n_children() > 0){ + this.bookmarksShorctus = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this._sections[id].destroy_all_children(); + } + this._createPlaces(id); + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + if(this.placesManager.get('network').length > 0) + this.networkDevicesShorctus = true; + if(this.placesManager.get('devices').length > 0) + this.externalDevicesShorctus=true; + if(this.placesManager.get('bookmarks').length > 0) + this.bookmarksShorctus = true; + + if(this._settings.get_boolean('show-bookmarks')){ + if(id === 'bookmarks' && places.length > 0){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + //create a separator if bookmark and software shortcut are both shown + if(this.bookmarksShorctus && this.softwareShortcuts){ + this.placesAddSeparator(id); + } + } + } + if(this._settings.get_boolean('show-external-devices')){ + if(id === 'devices'){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + if((this.externalDevicesShorctus && !this.networkDevicesShorctus) && (this.bookmarksShorctus || this.softwareShortcuts)) + this.placesAddSeparator(id); + } + if(id === 'network'){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + if(this.networkDevicesShorctus && (this.bookmarksShorctus || this.softwareShortcuts)) + this.placesAddSeparator(id); + } + } + } + + setActiveCategory(category, setActive = true){ + this._futureActiveItem = category; + this.activeMenuItem = category; + } + + setFrequentAppsList(categoryMenuItem){ + categoryMenuItem.appList = []; + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()) + categoryMenuItem.appList.push(mostUsed[i]); + } + } + + _clearActorsFromBox(box){ + this.recentFilesManager?.cancelCurrentQueries(); + if(!box){ + box = this.applicationsBox; + this.activeCategoryType = -1; + } + let parent = box.get_parent(); + if(parent instanceof St.ScrollView){ + let scrollBoxAdj = parent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = box.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + box.remove_child(actor); + } + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _displayAppList(apps, category, grid){ + this.activeCategoryType = category; + grid.remove_all_children(); + let count = 0; + let top = -1; + let left = 0; + this._futureActiveItem = false; + let currentCharacter; + let alphabetizeAllPrograms = this._settings.get_boolean("alphabetize-all-programs") && this.layoutProperties.DisplayType === Constants.DisplayType.LIST; + let rtl = this.mainBox.get_text_direction() == Clutter.TextDirection.RTL; + let columns = -1; + + for (let i = 0; i < apps.length; i++) { + let app = apps[i]; + let item; + let shouldShow = true; + + if(category === Constants.CategoryType.PINNED_APPS || category === Constants.CategoryType.HOME_SCREEN){ + item = app; + if(!item.shouldShow) + shouldShow = false; + } + else{ + item = this.applicationsMap.get(app); + if (!item) { + item = new MW.ApplicationMenuItem(this, app, this.layoutProperties.DisplayType); + this.applicationsMap.set(app, item); + } + } + + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + + if(shouldShow){ + if(columns === -1){ + if(grid.layout_manager.forceGridColumns) + columns = grid.layout_manager.forceGridColumns; + else if(this.layoutProperties.DisplayType === Constants.DisplayType.GRID) + columns = this.getColumnsFromActor(item); + else + columns = 1; + grid.layout_manager.gridColumns = columns; + } + + if(!rtl && (count % columns === 0)){ + top++; + left = 0; + } + else if(rtl && (left === 0)){ + top++; + left = columns; + } + + if(alphabetizeAllPrograms && category === Constants.CategoryType.ALL_PROGRAMS){ + if(currentCharacter !== app.get_name().charAt(0).toLowerCase()){ + currentCharacter = app.get_name().charAt(0).toLowerCase(); + + let label = this._createLabelWithSeparator(currentCharacter.toUpperCase()); + grid.layout_manager.attach(label, left, top, 1, 1); + top++; + } + } + + grid.layout_manager.attach(item, left, top, 1, 1); + item.gridLocation = [left, top]; + + if(item instanceof MW.CategorySubMenuItem){ + top++; + grid.layout_manager.attach(item.menu.actor, left, top, 1, 1); + } + + if(!rtl) + left++; + else if(rtl) + left--; + count++; + + if(!this._futureActiveItem && grid === this.applicationsGrid){ + this._futureActiveItem = item; + } + } + } + if(this.applicationsBox && !this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.add_child(this.applicationsGrid); + if(this._futureActiveItem) + this.activeMenuItem = this._futureActiveItem; + } + + displayAllApps(){ + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + } + + get activeMenuItem() { + return this._activeMenuItem; + } + + set activeMenuItem(item) { + let itemChanged = item !== this._activeMenuItem; + if(itemChanged){ + this._activeMenuItem = item; + if(this.arcMenu.isOpen && item && this.layoutProperties.SupportsCategoryOnHover) + item.grab_key_focus(); + else if(this.arcMenu.isOpen) + this.mainBox.grab_key_focus(); + if(this.layout === Constants.MenuLayout.LAUNCHER && !this.layoutProperties.StandaloneRunner && item) + this.createActiveSearchItemPanel(item); + } + } + + _onSearchBoxChanged(searchBox, searchString) { + if(searchBox.isEmpty()){ + this.searchResults.hide(); + this.setDefaultMenuView(); + } + else{ + this._clearActorsFromBox(); + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.applicationsBox.add_child(this.searchResults); + this.searchResults.show(); + searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); + this.searchResults.setTerms(searchString.split(/\s+/)); + } + } + + _onSearchBoxKeyPress(searchBox, event) { + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Up: + case Clutter.KEY_Down: + case Clutter.KEY_Left: + case Clutter.KEY_Right: + let direction; + if (symbol === Clutter.KEY_Down || symbol === Clutter.KEY_Up) + return Clutter.EVENT_PROPAGATE; + if (symbol === Clutter.KEY_Right) + direction = St.DirectionType.RIGHT; + if (symbol === Clutter.KEY_Left) + direction = St.DirectionType.LEFT; + + let cursorPosition = this.searchBox.clutter_text.get_cursor_position(); + + if(cursorPosition === Constants.CaretPosition.END && symbol === Clutter.KEY_Right) + cursorPosition = Constants.CaretPosition.END; + else if(cursorPosition === Constants.CaretPosition.START && symbol === Clutter.KEY_Left) + cursorPosition = Constants.CaretPosition.START; + else + cursorPosition = Constants.CaretPosition.MIDDLE; + + if(cursorPosition === Constants.CaretPosition.END || cursorPosition === Constants.CaretPosition.START){ + let navigateActor = this.activeMenuItem; + if(this.searchResults.hasActiveResult()){ + navigateActor = this.searchResults.getTopResult(); + if(navigateActor.has_style_pseudo_class("active")){ + navigateActor.grab_key_focus(); + return this.mainBox.navigate_focus(navigateActor, direction, false); + } + navigateActor.grab_key_focus(); + return Clutter.EVENT_STOP; + } + if(!navigateActor) + return Clutter.EVENT_PROPAGATE; + return this.mainBox.navigate_focus(navigateActor, direction, false); + } + return Clutter.EVENT_PROPAGATE; + default: + return Clutter.EVENT_PROPAGATE; + } + } + + _onMainBoxKeyPress(actor, event) { + if (event.has_control_modifier()) { + if(this.searchBox) + this.searchBox.grab_key_focus(); + return Clutter.EVENT_PROPAGATE; + } + + let symbol = event.get_key_symbol(); + let unicode = Clutter.keysym_to_unicode(symbol); + + switch (symbol) { + case Clutter.KEY_BackSpace: + if(this.searchBox && !this.searchBox.hasKeyFocus() && !this.searchBox.isEmpty()){ + this.searchBox.grab_key_focus(); + let newText = this.searchBox.getText().slice(0, -1); + this.searchBox.setText(newText); + } + return Clutter.EVENT_PROPAGATE; + case Clutter.KEY_Up: + case Clutter.KEY_Down: + case Clutter.KEY_Left: + case Clutter.KEY_Right: + let direction; + if (symbol === Clutter.KEY_Down) + direction = St.DirectionType.DOWN; + if (symbol === Clutter.KEY_Right) + direction = St.DirectionType.RIGHT + if (symbol === Clutter.KEY_Up) + direction = St.DirectionType.UP; + if (symbol === Clutter.KEY_Left) + direction = St.DirectionType.LEFT; + + if(this.layoutProperties.Search && this.searchBox.hasKeyFocus() && this.searchResults.hasActiveResult() && this.searchResults.get_parent()){ + if(this.searchResults.getTopResult().has_style_pseudo_class("active")){ + this.searchResults.getTopResult().actor.grab_key_focus(); + return actor.navigate_focus(global.stage.key_focus, direction, false); + } + this.searchResults.getTopResult().actor.grab_key_focus(); + return Clutter.EVENT_STOP; + } + else if(global.stage.key_focus === this.mainBox && symbol === Clutter.KEY_Up){ + return actor.navigate_focus(global.stage.key_focus, direction, true); + } + else if(global.stage.key_focus === this.mainBox){ + this.activeMenuItem.grab_key_focus(); + return Clutter.EVENT_STOP; + } + + return actor.navigate_focus(global.stage.key_focus, direction, false); + case Clutter.KEY_Tab: + case Clutter.KEY_KP_Tab: + case Clutter.KEY_KP_Enter: + case Clutter.KEY_Return: + case Clutter.KEY_Escape: + return Clutter.EVENT_PROPAGATE; + default: + if (unicode !== 0 && this.searchBox) { + global.stage.set_key_focus(this.searchBox.clutter_text); + let synthEvent = event.copy(); + synthEvent.set_source(this.searchBox.clutter_text); + this.searchBox.clutter_text.event(synthEvent, false); + } + } + return Clutter.EVENT_PROPAGATE; + } + + destroy(){ + if(this.recentFilesManager){ + this.recentFilesManager.destroy(); + this.recentFilesManager = null; + } + + if(this._treeChangedId){ + this._tree.disconnect(this._treeChangedId); + this._treeChangedId = null; + this._tree = null; + } + + if(this.applicationsBox){ + if(this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.remove_child(this.applicationsGrid); + } + + if(this.network){ + this.network.destroy(); + this.networkMenuItem.destroy(); + } + + if(this.computer){ + this.computer.destroy(); + this.computerMenuItem.destroy(); + } + + if(this.placesManager){ + for(let id in this._sections){ + this._sections[id].get_children().forEach((child) =>{ + child.destroy(); + }); + }; + if(this.placeManagerUpdatedID){ + this.placesManager.disconnect(this.placeManagerUpdatedID); + this.placeManagerUpdatedID = null; + } + this.placesManager.destroy(); + this.placesManager = null + } + + if(this._searchBoxChangedId){ + this.searchBox?.disconnect(this._searchBoxChangedId); + this._searchBoxChangedId = null;; + } + if(this._searchBoxKeyPressId){ + this.searchBox?.disconnect(this._searchBoxKeyPressId); + this._searchBoxKeyPressId = null; + } + if(this._searchBoxKeyFocusInId){ + this.searchBox?.disconnect(this._searchBoxKeyFocusInId); + this._searchBoxKeyFocusInId = null; + } + + if(this.searchBox) + this.searchBox.destroy(); + + if(this.searchResults){ + this.searchResults.setTerms([]); + this.searchResults.destroy(); + this.searchResults = null; + } + + if (this._mainBoxKeyPressId) { + this.mainBox.disconnect(this._mainBoxKeyPressId); + this._mainBoxKeyPressId = null; + } + + if(this._gnomeFavoritesReloadID){ + AppFavorites.getAppFavorites().disconnect(this._gnomeFavoritesReloadID); + this._gnomeFavoritesReloadID = null; + } + + if(this.pinnedAppsArray){ + for(let i = 0; i < this.pinnedAppsArray.length; i++){ + this.pinnedAppsArray[i].destroy(); + } + this.pinnedAppsArray = null; + } + + if(this.applicationsMap){ + this.applicationsMap.forEach((value,key,map)=>{ + value.destroy(); + }); + this.applicationsMap = null; + } + + if(this.categoryDirectories){ + this.categoryDirectories.forEach((value,key,map)=>{ + value.destroy(); + }); + this.categoryDirectories = null; + } + + this.mainBox.destroy_all_children(); + } + + _createScrollBox(params){ + let scrollBox = new St.ScrollView(params); + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', (action) => { + this._blockActivateEvent = true; + this.onPan(action, scrollBox); + }); + panAction.connect('gesture-cancel',(action) => this.onPanEnd(action, scrollBox)); + panAction.connect('gesture-end', (action) => this.onPanEnd(action, scrollBox)); + scrollBox.add_action(panAction); + + scrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + scrollBox.clip_to_allocation = true; + + return scrollBox; + } + + _createLabelWithSeparator(headerLabel){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.HEADER_LABEL, Constants.SeparatorAlignment.HORIZONTAL, headerLabel); + return separator; + } + + createLabelRow(title){ + let labelRow = new PopupMenu.PopupMenuItem(_(title), { + hover: false, + can_focus: false + }); + labelRow.actor.add_style_pseudo_class = () => { return false;}; + labelRow.label.style = 'font-weight: bold;'; + return labelRow; + } + + _keyFocusIn(actor) { + if (this._focusChild == actor) + return; + this._focusChild = actor; + Utils.ensureActorVisibleInScrollView(actor); + } + + onPan(action, scrollbox) { + let [dist_, dx_, dy] = action.get_motion_delta(0); + let adjustment = scrollbox.get_vscroll_bar().get_adjustment(); + adjustment.value -= dy; + return false; + } + + onPanEnd(action, scrollbox) { + let velocity = -action.get_velocity(0)[2]; + let adjustment = scrollbox.get_vscroll_bar().get_adjustment(); + let endPanValue = adjustment.value + velocity * 2; + adjustment.value = endPanValue; + } +}; diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js new file mode 100644 index 0000000..fefdcd6 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js @@ -0,0 +1,206 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true, + style_class: 'right-panel-plus70' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus70 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'left-panel-small ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.leftBox.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + this.actionsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.actionsBox.style = "padding: 5px 0px 0px 0px;" + this.leftBox.add_child(this.actionsBox); + + //create new section for Power, Lock, Logout, Suspend Buttons + this.sessionBox = new St.BoxLayout({ + vertical: false, + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.END, + x_align: Clutter.ActorAlign.CENTER + }); + this.sessionBox.style = "spacing: 6px;"; + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.sessionBox.add_child(powerButton); + } + } + this.leftBox.add_child(this.sessionBox); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.loadCategories(); + this.loadPinnedApps(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + loadExtraPinnedApps(){ + this.actionsBox.destroy_all_children(); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + let pinnedApps = this._settings.get_strv('brisk-shortcuts-list'); + + for(let i = 0;i < pinnedApps.length; i += 3){ + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem([pinnedApps[i],pinnedApps[i+1], pinnedApps[i+2]], Constants.DisplayType.LIST, isContainedInCategory); + if(placeMenuItem){ + this.actionsBox.add_child(placeMenuItem.actor); + } + } + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js new file mode 100644 index 0000000..46107c5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js @@ -0,0 +1,184 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * Budgie.js Layout Created By: MagneFire https://gitlab.com/MagneFire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MAX, Constants.SeparatorAlignment.HORIZONTAL); + separator.style += "margin-bottom: 6px;"; + this.mainBox.add_child(separator); + } + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + vertical: true, + style_class: 'right-panel-plus70', + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus70 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + // Disable horizontal scrolling, hide vertical scrollbar, but allow vertical scrolling. + this.applicationsScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel-small ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + this.leftBox.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + if(this._settings.get_boolean('enable-activities-shortcut')){ + this.activitiesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.activities = new MW.ActivitiesMenuItem(this); + this.activitiesBox.add_child(this.activities.actor); + this.leftBox.add_child(this.activitiesBox); + } + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MAX, Constants.SeparatorAlignment.HORIZONTAL); + separator.style += "margin-top: 6px;"; + this.mainBox.add_child(separator); + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.actor.style = "padding-top: 8px; padding-bottom: 8px; margin: 0; spacing: 0;"; + categoryMenuItem._iconBin.visible = false; + } + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js new file mode 100644 index 0000000..e0d862c --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js @@ -0,0 +1,118 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 450, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START + }); + this.mainBox.add_child(this.subMainBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + reactive: true + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js new file mode 100644 index 0000000..79de6aa --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js @@ -0,0 +1,118 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + DefaultMenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.subMainBox= new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START + }); + this.mainBox.add_child(this.subMainBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + reactive:true + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;" + this.mainBox.add_child(this.searchBox.actor); + } + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js new file mode 100644 index 0000000..1b3f548 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js @@ -0,0 +1,376 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultMenuWidth: 650, + DefaultIconGridStyle: "MediumRectIconGrid", + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.style = "margin: 5px 15px 10px 15px;"; + + this.topBox.add_child(this.searchBox.actor); + this.mainBox.insert_child_at_index(this.topBox, 0); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + style: "padding-bottom: 10px;" + }); + this.applicationsScrollBox = this._createScrollBox({ + clip_to_allocation: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.arcMenu.box.style = "padding-bottom:0px;"; + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px; background-color:rgba(186, 196,201, 0.1); padding: 12px 25px;"+ + "border-color: rgba(186, 196,201, 0.2); border-top-width: 1px;"; + this.themeNodeBorderRadius = ""; + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + this.themeNodeBorderRadius + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true, + style: 'padding: 0px 25px;' + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 10, + row_spacing: 5, + column_homogeneous: true + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + layout.forceGridColumns = 2; + this.shortcutsBox.add_child(this.shortcutsGrid); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.actionsBox.add_child(this.user.actor); + + this.quickLinksBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER, + vertical: false, + style: 'spacing: 10px;' + }); + let path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD); + if (path !== null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Downloads")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.quickLinksBox.add_child(placeMenuItem.actor); + } + + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path !== null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.quickLinksBox.add_child(placeMenuItem.actor); + } + + let settingsButton = new MW.SettingsButton(this); + this.quickLinksBox.add_child(settingsButton.actor); + + this.leaveButton = new MW.LeaveButton(this); + this.quickLinksBox.add_child(this.leaveButton.actor); + + this.actionsBox.add_child(this.quickLinksBox); + + this.backButton = this._createNavigationButtons(_("All Apps"), MW.BackButton); + this.allAppsButton = this._createNavigationButtons(_("Pinned"), MW.AllAppsButton); + this.frequentAppsHeader = this._createNavigationButtons(_("Frequent"), null); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + + this.disableFrequentAppsID = this._settings.connect("changed::eleven-disable-frequent-apps", () => this.setDefaultMenuView()); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + } + + loadFrequentApps(){ + this.frequentAppsList = []; + + if(this._settings.get_boolean("eleven-disable-frequent-apps")) + return; + + let labelRow = this.createLabelRow(_("Frequent")); + this.applicationsBox.add_child(labelRow); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + + if(mostUsed.length < 1) + return; + + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + this.frequentAppsList.push(item); + } + } + + const MaxItems = 8; + if(this.frequentAppsList.length > MaxItems) + this.frequentAppsList.splice(MaxItems); + } + + setDefaultMenuView(){ + this.layoutProperties.IconGridSize = 34; + this.setGridLayout(Constants.DisplayType.GRID, 6, 0); + super.setDefaultMenuView(); + this.loadFrequentApps(); + this.activeCategory = _("Pinned"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + } + + displayAllApps(){ + this.activeCategory = _("All Apps"); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + + this.setGridLayout(Constants.DisplayType.LIST, 1, 5); + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 6, 0, false); + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + this.themeNodeBorderRadius; + + if(removeMenuArrow) + this.arcMenu.box.style = "padding-bottom:0px; margin:0px;"; + else + this.arcMenu.box.style = "padding-bottom:0px;"; + } + + setGridLayout(displayType, columns, spacing, setStyle = true){ + if(setStyle){ + this.applicationsGrid.x_align = displayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER; + displayType === Constants.DisplayType.LIST ? this.applicationsBox.add_style_class_name('margin-box') : this.applicationsBox.remove_style_class_name('margin-box'); + } + this.applicationsGrid.layout_manager.column_spacing = spacing; + this.applicationsGrid.layout_manager.row_spacing = spacing; + this.layoutProperties.DisplayType = displayType; + } + + loadCategories() { + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + displayPinnedApps() { + this._clearActorsFromBox(this.applicationsBox); + this.activeCategory = _("Pinned"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + + if(this.frequentAppsList.length > 0 && !this._settings.get_boolean("eleven-disable-frequent-apps")){ + this.activeCategory = _("Frequent"); + this.setGridLayout(Constants.DisplayType.GRID, 2, 0); + this._displayAppList(this.frequentAppsList, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 6, 0); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + } + else if(this.applicationsBox.contains(this.shortcutsBox)){ + this.applicationsBox.remove_child(this.shortcutsBox); + } + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + this._hideNavigationButtons(); + + if(category === Constants.CategoryType.PINNED_APPS){ + this.applicationsBox.insert_child_at_index(this.allAppsButton, 0); + } + else if(category === Constants.CategoryType.HOME_SCREEN){ + this.applicationsBox.insert_child_at_index(this.frequentAppsHeader, 2); + } + else if(category === Constants.CategoryType.ALL_PROGRAMS){ + this.mainBox.insert_child_at_index(this.backButton, 1); + } + } + + _hideNavigationButtons(){ + if(this.mainBox.contains(this.backButton)) + this.mainBox.remove_child(this.backButton); + } + + _createNavigationButtons(buttonTitle, ButtonClass){ + let navButton = this.createLabelRow(buttonTitle); + navButton.remove_child(navButton._ornamentLabel); + navButton.label.y_align = Clutter.ActorAlign.CENTER; + navButton.label.style = 'padding: 15px 0px;'; + navButton.style = 'padding: 0px 25px;' + if(ButtonClass) + navButton.add_child(new ButtonClass(this)); + return navButton; + } + + _onSearchBoxChanged(searchBox, searchString){ + this.applicationsBox.remove_style_class_name('margin-box'); + if(!searchBox.isEmpty()) + this._hideNavigationButtons(); + super._onSearchBoxChanged(searchBox, searchString); + } + + destroy(){ + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + this.backButton.destroy(); + this.allAppsButton.destroy(); + if(this.disableFrequentAppsID){ + this._settings.disconnect(this.disableFrequentAppsID); + this.disableFrequentAppsID = null; + } + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js new file mode 100644 index 0000000..8b66793 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js @@ -0,0 +1,161 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + this.activitiesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + let activities = new MW.ActivitiesMenuItem(this); + this.activitiesBox.add_child(activities.actor); + this.leftBox.add_child(this.activitiesBox); + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.actor.style = "padding-top: 8px; padding-bottom: 8px;"; + categoryMenuItem._iconBin.visible = false; + } + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js new file mode 100644 index 0000000..e298283 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js @@ -0,0 +1,337 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + PinnedAppsColumns: 1, + DefaultMenuWidth: 525, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.actionsBox.style = "margin: 0px 5px 0px 10px; spacing: 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.pinnedAppsButton = new MW.PinnedAppsButton(this); + this.pinnedAppsButton.actor.y_expand = true; + this.pinnedAppsButton.actor.y_align= Clutter.ActorAlign.START; + this.pinnedAppsButton.actor.margin = 5; + this.actionsBox.add_child(this.pinnedAppsButton.actor); + let userButton = new MW.UserMenuItem(this, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(userButton.actor); + let path = GLib.get_user_special_dir(imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path != null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(placeMenuItem.actor); + } + let settingsButton = new MW.SettingsButton(this); + settingsButton.actor.expand = false; + settingsButton.actor.margin = 5; + this.actionsBox.add_child(settingsButton.actor); + this.leaveButton = new MW.LeaveButton(this); + this.leaveButton.actor.expand = false; + this.leaveButton.actor.margin = 5; + this.actionsBox.add_child(this.leaveButton.actor); + + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + let userMenuBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.START, + vertical: false, + }) + this.user = new MW.UserMenuIcon(this, 55, true); + this.user.actor.x_align = Clutter.ActorAlign.CENTER; + this.user.actor.y_align = Clutter.ActorAlign.CENTER; + this.user.label.x_align = Clutter.ActorAlign.CENTER; + this.user.label.style = "margin-left: 10px;" + userMenuBox.add_child(this.user.actor); + userMenuBox.add_child(this.user.label); + this.subMainBox.add_child(userMenuBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 15px 10px 10px 10px;"; + this.subMainBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor( this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + + this._createPinnedAppsMenu(); + this.setDefaultMenuView(); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + super.loadPinnedApps(); + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + } + + _createPinnedAppsMenu(){ + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.pinnedAppsMenu = new PopupMenu.PopupMenu(this.dummyCursor, 0, St.Side.TOP); + this.pinnedAppsMenu.blockSourceEvents = true; + this.section = new PopupMenu.PopupMenuSection(); + this.pinnedAppsMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + let headerBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.leftPanelPopup.add_child(headerBox); + + this.backButton = new MW.BackMenuItem(this); + this.backButton.connect("activate", () => this.togglePinnedAppsMenu()); + headerBox.add_child(this.backButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + headerBox.add_child(separator); + headerBox.add_child(this.createLabelRow(_("Pinned Apps"))); + + this.pinnedAppsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + overlay_scrollbars: true, + reactive:true + }); + + this.leftPanelPopup.add_child(this.pinnedAppsScrollBox); + + this.pinnedAppsBox = new St.BoxLayout({ + vertical: true + }); + this.pinnedAppsScrollBox.add_actor(this.pinnedAppsBox); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 0, + row_spacing: 0 + }); + this.pinnedAppsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + layout_manager: layout + }); + layout.forceGridColumns = 1; + layout.hookup_style(this.pinnedAppsGrid); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor) - 1; + this.leftPanelPopup.style = `height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this.displayPinnedApps(); + this.subMenuManager.addMenu(this.pinnedAppsMenu); + this.pinnedAppsMenu.actor.hide(); + Main.uiGroup.add_child(this.pinnedAppsMenu.actor); + this.pinnedAppsMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.pinnedAppsButton.tooltip){ + this.pinnedAppsButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.pinnedAppsButton.active = false; + this.pinnedAppsButton.sync_hover(); + this.pinnedAppsButton.hovered = this.pinnedAppsButton.hover; + } + }); + } + + togglePinnedAppsMenu(){ + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.pinnedAppsMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.pinnedAppsMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + this.pinnedAppsButton.tooltip.hide(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let backgroundColor = themeNode.get_color('-arrow-background-color'); + let borderWidth = themeNode.get_length('-arrow-border-width'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + let drawBoxShadow = true; + if(backgroundColor?.alpha === 0){ + backgroundColor = themeNode.get_color('background-color'); + if(backgroundColor?.alpha === 0){ + drawBoxShadow = false; + } + } + + let styleProperties, shadowColor; + if(drawBoxShadow){ + shadowColor = backgroundColor.shade(.35); + backgroundColor = Utils.clutterColorToRGBA(backgroundColor); + shadowColor = Utils.clutterColorToRGBA(shadowColor); + styleProperties = "box-shadow: 3px 0px 2px " + shadowColor + "; background-color: " + backgroundColor + ";"; + } + + this.pinnedAppsMenu.actor.style = "-boxpointer-gap: 0px; -arrow-border-color: transparent; -arrow-border-width: 0px; width: 250px;" + +"-arrow-base: 0px; -arrow-rise: 0px; -arrow-background-color: transparent;" + +"border-radius: " + borderRadius + "px;" + styleProperties; + + this.arcMenu.actor.get_allocation_box(); + let [x, y] = this.arcMenu.actor.get_transformed_position(); + let rise = themeNode.get_length('-arrow-rise'); + + if(this.arcMenu._arrowSide === St.Side.TOP) + y += rise + 1; + else + y += 1; + + if(this.arcMenu._arrowSide === St.Side.LEFT) + x = x + (borderRadius * 2) + rise + 1; + else + x = x + (borderRadius * 2); + + this.dummyCursor.set_position(Math.round(x + borderWidth), Math.round(y + borderWidth)); + this.pinnedAppsMenu.toggle(); + if(this.pinnedAppsMenu.isOpen){ + this.activeMenuItem = this.backButton; + this.backButton.grab_key_focus(); + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + this.activeMenuItem = this.applicationsGrid.layout_manager.get_child_at(0, 0); + if(!this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.add_child(this.applicationsGrid); + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayPinnedApps() { + this._clearActorsFromBox(this.pinnedAppsBox); + this.layoutProperties.GridColumns = 1; + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.pinnedAppsGrid); + if(!this.pinnedAppsBox.contains(this.pinnedAppsGrid)) + this.pinnedAppsBox.add_child(this.pinnedAppsGrid); + this.updateStyle(); + this.layoutProperties.GridColumns = 5; + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js new file mode 100644 index 0000000..7dbeccc --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js @@ -0,0 +1,465 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const MORE_PROVIDERS_POP_UP = -1; +const MAX_VISIBLE_PROVIDERS = 4; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + SearchDisplayType: Constants.DisplayType.LIST, + DisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + MenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.activeResult = null; + this.searchProvidersBoxStyle = "padding: 0px 15px; margin-bottom: 10px; height: 50px; background-color: rgba(186, 196, 201, 0.1); border-color:rgba(186, 196, 201, 0.2); border-bottom-width: 1px;" + this.themeNodeBorderRadius = ""; + this.searchProvidersBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: this.searchProvidersBoxStyle + this.themeNodeBorderRadius + }); + this.searchProvidersBox.clip_to_allocation = true; + this.mainBox.add_child(this.searchProvidersBox); + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 10px;"; + this.searchTermsChangedID = this.searchResults.connect('have-results', () => { + this.searchResultsChangedEvent(); + }); + this.searchNoResultsID = this.searchResults.connect('no-results', () => { + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + }) + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.subMainBox.style = "width:750px; spacing: 8px;"; + + this.searchResultDetailsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + style: 'width: 415px; spacing: 20px;' + }); + + this.searchResultDetailsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.searchResultDetailsScrollBox.add_actor(this.searchResultDetailsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + this.mainBox.add_child(this.searchBox); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.arcMenu.box.style = "padding-top: 0px;"; + this.hasPinnedApps = true; + this.loadPinnedApps(); + this.loadCategories(); + + this.moreItem = this.createProviderMenuItem(_("More"), MORE_PROVIDERS_POP_UP); + let arrowIcon = PopupMenu.arrowIcon(St.Side.BOTTOM); + arrowIcon.y_expand = false; + this.moreItem.add_child(arrowIcon); + this._createMoreProvidersMenu(); + + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + super.loadPinnedApps(); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.FREQUENT_APPS, Constants.DisplayType.LIST); + this.categoryDirectories.set(Constants.CategoryType.FREQUENT_APPS, categoryMenuItem); + + super.loadCategories(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.moveProvidersMenuItems = []; + this.moreProvidersBox.remove_all_children(); + this.searchResults.setProvider(Constants.CategoryType.SEARCH_RESULTS); + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + this.displayPinnedApps(); + this.searchProvidersBox.remove_all_children(); + let allProvidersItem = this.createProviderMenuItem(_("All"), Constants.CategoryType.SEARCH_RESULTS); + this.searchProvidersBox.add_child(allProvidersItem); + let searchProviders = this.searchResults.getProviders(); + + let currentItems = 1; + for(let provider of searchProviders){ + provider = provider.appInfo ? provider : _("Applications"); + let item = this.createProviderMenuItem(provider, provider.appInfo ? null : Constants.CategoryType.ALL_PROGRAMS); + + if(currentItems < MAX_VISIBLE_PROVIDERS) + this.searchProvidersBox.add_child(item); + else{ + this.moveProvidersMenuItems.push(item); + item.moreIndex = currentItems - MAX_VISIBLE_PROVIDERS; + item.x_expand = true; + item.x_align = Clutter.ActorAlign.FILL; + this.moreProvidersBox.add_child(item); + } + + currentItems++; + } + + this.searchProvidersBox.add_child(this.moreItem); + + this.activeProvider = allProvidersItem; + this.activeProvider.add_style_class_name("active-item"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + createProviderMenuItem(provider, providerEnum){ + let providerName = provider.appInfo ? provider.appInfo.get_name() : provider; + + let providerMenuItem = new MW.ArcMenuPopupBaseMenuItem(this); + providerMenuItem.name = "arc-menu-launcher-button"; + providerMenuItem.x_expand = false; + providerMenuItem.remove_child(providerMenuItem._ornamentLabel); + providerMenuItem.x_align = Clutter.ActorAlign.START; + providerMenuItem.style = 'padding: 10px 14px; margin: 0px;'; + providerMenuItem.provider = provider; + let label = new St.Label({ + text: _(providerName), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER, + }); + providerMenuItem.label = label; + providerMenuItem.add_child(label); + + providerMenuItem.connect("activate", () => this.activateProviderMenuItem(providerMenuItem, providerEnum)); + return providerMenuItem; + } + + activateProviderMenuItem(providerMenuItem, providerEnum){ + if(providerEnum && providerEnum === MORE_PROVIDERS_POP_UP){ + this.moreItem.add_style_class_name("active-item"); + this.toggleMoreProvidersMenu(); + } + else{ + if(this.activeProvider) + this.activeProvider.remove_style_class_name("active-item"); + + if(this.moreProvidersMenu.isOpen) + this.moreProvidersMenu.toggle(); + + this.moreItem.remove_style_class_name("active-item"); + this.moreItem.active = false; + + let potentialMovedItem = this.searchProvidersBox.get_child_at_index(MAX_VISIBLE_PROVIDERS); + + if(potentialMovedItem.wasMoved) + this.moveProviderMenuItem(potentialMovedItem, this.searchProvidersBox, this.moreProvidersBox, true); + + if(providerMenuItem.get_parent() === this.moreProvidersBox) + this.moveProviderMenuItem(providerMenuItem, this.moreProvidersBox, this.searchProvidersBox, false); + + this.activeProvider = providerMenuItem; + providerMenuItem.add_style_class_name("active-item"); + + this.displayProviderPage(providerMenuItem.provider, providerEnum); + this.searchResults.setProvider(providerMenuItem.provider.appInfo ? providerMenuItem.provider.appInfo.get_id() : providerEnum); + + if(!this.searchBox.isEmpty()){ + this._clearActorsFromBox(); + let searchString = this.searchBox.get_text(); + searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); + this.searchResults.setTerms([]); + + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.applicationsBox.add_child(this.searchResults); + this.searchResults.setTerms(searchString.split(/\s+/)); + this.searchResults.highlightDefault(true); + this.activeProvider.grab_key_focus(); + } + } + } + + moveProviderMenuItem(menuItem, currentBox, newBox, wasMoved){ + let expand = wasMoved ? true : false; + let align = wasMoved ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.START; + let index = wasMoved ? menuItem.moreIndex : MAX_VISIBLE_PROVIDERS; + + currentBox.remove_child(menuItem); + newBox.insert_child_at_index(menuItem, index); + menuItem.x_expand = expand; + menuItem.x_align = align; + menuItem.wasMoved = !wasMoved; + } + + displayProviderPage(provider, providerEnum){ + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + if(providerEnum){ + if(providerEnum === Constants.CategoryType.SEARCH_RESULTS) + this.displayPinnedApps(); + if(providerEnum === Constants.CategoryType.ALL_PROGRAMS) + this.displayFrequentApps(); + return; + } + this._clearActorsFromBox(); + let providerName = provider.appInfo ? provider.appInfo.get_name() : provider; + let providerIcon = provider.appInfo ? provider.appInfo.get_icon() : Gio.icon_new_for_string(''); + + this.setSearchHintText(providerName); + + let providerBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + }); + let icon = new St.Icon({ + icon_size: 76, + gicon: providerIcon, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + }); + let label = new St.Label({ + text: _("Search") + " " + _(providerName), + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: false, + y_align: Clutter.ActorAlign.START, + }); + providerBox.add_child(icon); + providerBox.add_child(label); + this.applicationsBox.add_child(providerBox); + } + + _createMoreProvidersMenu(){ + this.moreProvidersMenu = new PopupMenu.PopupMenu(this.moreItem, 0.5, St.Side.TOP); + this.moreProvidersMenu.connect('open-state-changed', (menu, open) => { + if(!open) + this.moreItem.remove_style_class_name("active-item"); + }); + + this.section = new PopupMenu.PopupMenuSection(); + this.moreProvidersMenu.addMenuItem(this.section); + + this.moreProvidersBox = new St.BoxLayout({ + vertical: true + }); + + this.moreProvidersScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'vfade', + overlay_scrollbars: true, + reactive: true + }); + this.moreProvidersScrollBox._delegate = this.moreProvidersBoxScrollBox; + this.moreProvidersScrollBox.add_actor(this.moreProvidersBox); + this.moreProvidersScrollBox.clip_to_allocation = true; + + this.moreProvidersScrollBox.style = "max-height: 350px;"; + this.section.actor.add_child(this.moreProvidersScrollBox); + this.subMenuManager.addMenu(this.moreProvidersMenu); + this.moreProvidersMenu.actor.hide(); + Main.uiGroup.add_child(this.moreProvidersMenu.actor); + } + + toggleMoreProvidersMenu(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.moreProvidersMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.moreProvidersMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + + this.moreProvidersMenu.toggle(); + } + + displayFrequentApps(){ + this._clearActorsFromBox(); + this.setSearchHintText(_("Applications")); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FREQUENT_APPS); + let label = this.createLabelRow(_("Frequent Apps")); + this.applicationsBox.add_child(label); + this.layoutProperties.GridColumns = 5; + super._displayAppList(categoryMenuItem.appList, Constants.CategoryType.FREQUENT_APPS, this.applicationsGrid); + } + + setSearchHintText(providerName){ + this.searchBox.hint_text = _("Search") + " " + _(providerName) + "…"; + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: " + borderRadius + "px " + borderRadius + "px 0px 0px;"; + this.searchProvidersBox.style = this.searchProvidersBoxStyle + this.themeNodeBorderRadius; + if(removeMenuArrow) + this.arcMenu.box.style = "padding-top: 0px; margin: 0px;"; + else + this.arcMenu.box.style = "padding-top: 0px;"; + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + } + + displayPinnedApps() { + super._clearActorsFromBox(); + let label = this.createLabelRow(_("Pinned Apps")); + this.searchBox.hint_text = _("Search…"); + this.applicationsBox.add_child(label); + this.layoutProperties.GridColumns = 5; + super._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + searchResultsChangedEvent(){ + if(!this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.add_child(this.searchResultDetailsScrollBox); + if(this.activeResult === this.searchResults.getTopResult()) + return; + + this.activeResult = this.searchResults.getTopResult(); + if(!this.activeResult || this.activeResult === null){ + return; + } + + this.createActiveSearchItemPanel(this.searchResults.getTopResult()); + } + + createActiveSearchItemPanel(activeResult){ + if(!activeResult) + return; + if(!this.subMainBox.contains(this.searchResultDetailsScrollBox)) + return; + if(!activeResult.provider || activeResult === this.activeResultMenuItem) + return; + this.activeCategoryType = -1; + this.searchResultDetailsBox.destroy_all_children(); + + if(!activeResult.metaInfo) + return; + + let app = activeResult.app ? activeResult.app : null; + let path = activeResult._path ? activeResult._path : null; + + this.activeResultMenuItem = new MW.ApplicationMenuItem(this, app, Constants.DisplayType.GRID, activeResult.metaInfo); + this.activeResultMenuItem.name = "ExtraLargeIconGrid"; + this.activeResultMenuItem.provider = activeResult.provider; + this.activeResultMenuItem.resultsView = activeResult.resultsView; + this.activeResultMenuItem._path = path; + this.activeResultMenuItem.x_expand = false; + this.activeResultMenuItem.x_align = Clutter.ActorAlign.CENTER; + let iconSize = 76; + let icon = activeResult.metaInfo ?activeResult.metaInfo['createIcon'](iconSize) : app.create_icon_texture(iconSize); + this.activeResultMenuItem._iconBin.set_child(icon); + if(!this.activeResultMenuItem._iconBin.get_child()){ + let icon = new St.Icon({ + icon_size: iconSize, + gicon: activeResult.provider.appInfo.get_icon() + }); + this.activeResultMenuItem._iconBin.set_child(icon); + } + this.searchResultDetailsBox.add_child(this.activeResultMenuItem); + this.searchResultContextItems = new MW.ApplicationContextItems(this.activeResultMenuItem, app, this); + this.searchResultContextItems.path = path; + this.searchResultContextItems.rebuildItems(); + this.searchResultDetailsBox.add_child(this.searchResultContextItems); + } + + destroy(){ + this.arcMenu.box.style = null; + + if(this.searchTermsChangedID){ + this.searchResults.disconnect(this.searchTermsChangedID); + this.searchTermsChangedID = null; + } + + if(this.searchNoResultsID){ + this.searchResults.disconnect(this.searchNoResultsID); + this.searchNoResultsID = null; + } + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js new file mode 100644 index 0000000..3185f2d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js @@ -0,0 +1,250 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + //Stores the Pinned Icons on the left side + this.actionsScrollBox = new St.ScrollView({ + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'small-vfade' + }); + this.actionsScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); + this.actionsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsScrollBox.add_actor(this.actionsBox); + this.actionsScrollBox.clip_to_allocation = true; + + this.actionsScrollBox.style = "padding: 21px 0px; width: 62px; margin: 0px 10px 10px 20px; background-color:rgba(186, 196,201, 0.1); border-color:rgba(186, 196,201, 0.2); border-width: 1px; border-radius: 5px;"; + this.actionsBox.style = "spacing: 10px;"; + //check if custom ArcMenu is enabled + if( this._settings.get_boolean('enable-custom-arc-menu')) + this.actionsBox.add_style_class_name('arc-menu'); + + this.mainBox.add_child(this.actionsScrollBox); + this.rightMenuBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.rightMenuBox); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 20px 10px 8px;"; + this.rightMenuBox.add_child(this.searchBox.actor); + } + else + this.rightMenuBox.style = "margin-top: 10px;"; + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.rightMenuBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + + this.categoriesScrollBox.add_actor( this.categoriesBox); + this.categoriesScrollBox.clip_to_allocation = true; + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 20px 10px 8px;"; + this.rightMenuBox.add_child(this.searchBox.actor); + } + this.loadCategories(); + this.loadPinnedApps(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + _addSeparator(){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + loadExtraPinnedApps(){ + this.actionsBox.destroy_all_children(); + super.loadExtraPinnedApps(this._settings.get_strv('mint-pinned-app-list'), this._settings.get_int('mint-separator-index')); + } + + _createExtraPinnedAppsList(){ + let pinnedApps = []; + //Find the Default Web Browser, if found add to pinned apps list, if not found delete the placeholder. + //Will only run if placeholder is found. Placeholder only found with default settings set. + let browserName = ''; + try{ + //user may not have xdg-utils package installed which will throw error + let [res, stdout, stderr, status] = GLib.spawn_command_line_sync("xdg-settings get default-web-browser"); + let webBrowser = String.fromCharCode(...stdout); + browserName = webBrowser.split(".desktop")[0]; + browserName += ".desktop"; + } + catch(error){ + global.log("ArcMenu Error - Failed to find default web browser. Removing placeholder pinned app.") + } + this._app = appSys.lookup_app(browserName); + if(this._app){ + let appIcon = this._app.create_icon_texture(25); + let iconName = ''; + if(appIcon.icon_name) + iconName = appIcon.icon_name; + else if(appIcon.gicon) + iconName = appIcon.gicon.to_string(); + pinnedApps.push(this._app.get_name(), iconName, this._app.get_id()); + } + else{ + pinnedApps.push(_("Home"), "ArcMenu_Home", "ArcMenu_Home"); + } + pinnedApps.push(_("Terminal"), "utilities-terminal", "org.gnome.Terminal.desktop"); + pinnedApps.push(_("Settings"), "emblem-system-symbolic", "gnome-control-center.desktop"); + + let software = Utils.findSoftwareManager(); + if(software) + pinnedApps.push(_("Software"), 'system-software-install-symbolic', software); + else + pinnedApps.push(_("Documents"), "ArcMenu_Documents", "ArcMenu_Documents"); + + pinnedApps.push(_("Files"), "system-file-manager", "org.gnome.Nautilus.desktop"); + pinnedApps.push(_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"); + pinnedApps.push(_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"); + pinnedApps.push(_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"); + + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('mint-pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + return pinnedApps; + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js new file mode 100644 index 0000000..2135cc5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js @@ -0,0 +1,453 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 450, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START + }); + this.leftTopBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + vertical: false, + y_align: Clutter.ActorAlign.CENTER, + style: "padding-left: 10px; margin-left: 0.4em" + }); + this.rightTopBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + style_class: 'popup-menu-item', + style: "padding: 0px; margin: 0px; spacing: 0px;" + }); + + this.user = new MW.UserMenuIcon(this, 55, true); + this.user.actor.x_expand = false; + this.user.actor.y_expand = true; + this.user.actor.x_align = Clutter.ActorAlign.CENTER; + this.user.actor.y_align = Clutter.ActorAlign.CENTER; + this.leftTopBox.add_child(this.user.actor); + this.rightTopBox.add_child(this.user.label); + this.user.label.style = "padding-left: 0.4em; margin: 0px 10px 0px 15px; font-weight: bold;"; + this.user.label.y_expand = false; + this.user.label.x_expand = true; + this.user.label.x_align = Clutter.ActorAlign.START; + this.rightTopBox.add_child(this.searchBox.actor); + + this.topBox.add_child(this.leftTopBox); + this.topBox.add_child(this.rightTopBox); + + this.searchBarLocation = this._settings.get_enum('searchbar-default-top-location'); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? 'margin-box' : 'margin-box small-vfade', + overlay_scrollbars: true, + reactive:true, + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBoxContainer = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START + }); + this.navigateBox = new St.BoxLayout({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + style: "spacing: 6px;", + }); + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_homogeneous: true, + column_spacing: 10, + row_spacing: 10 + }); + this.grid = new St.Widget({ + layout_manager: layout + }); + layout.hookup_style(this.grid); + this.navigateBox.add_child(this.grid); + + this.pinnedAppsButton = new MW.PlasmaMenuItem(this, _("Pinned Apps"), Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'); + this.pinnedAppsButton.connect("activate", () => this.displayPinnedApps() ); + this.grid.layout_manager.attach(this.pinnedAppsButton, 0, 0, 1, 1); + this.pinnedAppsButton.set_style_pseudo_class("active-item"); + + this.applicationsButton = new MW.PlasmaMenuItem(this, _("Applications"), 'preferences-desktop-apps-symbolic'); + this.applicationsButton.connect("activate", () => this.displayCategories() ); + this.grid.layout_manager.attach(this.applicationsButton, 1, 0, 1, 1); + + this.computerButton = new MW.PlasmaMenuItem(this, _("Computer"), 'computer-symbolic'); + this.computerButton.connect("activate", () => this.displayComputerCategory() ); + this.grid.layout_manager.attach(this.computerButton, 2, 0, 1, 1); + + this.leaveButton = new MW.PlasmaMenuItem(this, _("Leave"), 'system-shutdown-symbolic'); + this.leaveButton.connect("activate", () => this.displayPowerItems() ); + this.grid.layout_manager.attach(this.leaveButton, 3, 0, 1, 1); + + this.categoryHeader = new MW.PlasmaCategoryHeader(this); + this.categoryHeader.add_style_class_name('margin-box'); + + if(this.searchBarLocation === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 3px 10px 5px 10px;"; + this.topBox.style = 'padding-top: 0.5em;' + + this.navigateBoxContainer.add_child(this.navigateBox); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBoxContainer.add_child(separator); + this.navigateBoxContainer.y_expand = false; + this.navigateBoxContainer.y_align = Clutter.ActorAlign.START; + this.mainBox.add_child(this.navigateBoxContainer); + this.mainBox.add_child(this.applicationsScrollBox); + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + + this.mainBox.add_child(this.topBox); + } + else if(this.searchBarLocation === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 3px 10px 10px 10px;"; + + this.mainBox.add_child(this.topBox); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + this.mainBox.add_child(this.applicationsScrollBox); + this.navigateBoxContainer.y_expand = true; + this.navigateBoxContainer.y_align = Clutter.ActorAlign.END; + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBoxContainer.add_child(separator); + this.navigateBoxContainer.add_child(this.navigateBox); + this.mainBox.add_child(this.navigateBoxContainer); + } + + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcutsList = this._settings.get_value('application-shortcuts-list').deep_unpack(); + this.applicationShortcuts = []; + for(let i = 0; i < applicationShortcutsList.length; i++){ + let applicationName = applicationShortcutsList[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcutsList[i][1], applicationShortcutsList[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.applicationShortcuts.push(shortcutMenuItem.actor); + } + + let directoryShortcutsList = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + this._loadPlaces(directoryShortcutsList); + + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + this.updateWidth(); + this._createPowerItems(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setFrequentAppsList(categoryMenuItem){ + categoryMenuItem.appList = []; + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + categoryMenuItem.appList.push(mostUsed[i]); + let item = this.applicationsMap.get(mostUsed[i]); + if (!item) { + item = new MW.ApplicationMenuItem(this, mostUsed[i], this.layoutProperties.DisplayType); + this.applicationsMap.set(mostUsed[i], item); + } + } + } + } + + _clearActorsFromBox(box){ + this.categoryHeader.setActiveCategory(null); + if(this.mainBox.contains(this.categoryHeader)) + this.mainBox.remove_child(this.categoryHeader); + super._clearActorsFromBox(box); + } + + clearActiveItem(){ + this.pinnedAppsButton.setActive(false); + this.computerButton.setActive(false); + this.applicationsButton.setActive(false); + this.leaveButton.setActive(false); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum === Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayComputerCategory(){ + this._clearActorsFromBox(this.applicationsBox); + this.applicationsBox.add_child(this.createLabelRow(_("Application Shortcuts"))); + for(let i = 0; i < this.applicationShortcuts.length; i++){ + this.applicationsBox.add_child(this.applicationShortcuts[i]); + } + this.applicationsBox.add_child(this.createLabelRow(_("Places"))); + for(let i = 0; i < this.directoryShortcuts.length; i++){ + this.applicationsBox.add_child(this.directoryShortcuts[i]); + } + this.applicationsBox.add_child(this.externalDevicesBox); + this.activeMenuItem = this.applicationShortcuts[0]; + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + + if(id === 'bookmarks' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Bookmarks"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'devices' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Devices"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'network' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Network"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + } + + displayPinnedApps(){ + this.activeCategoryType = Constants.CategoryType.PINNED_APPS; + super.displayPinnedApps(); + } + + _loadPlaces(directoryShortcutsList) { + this.directoryShortcuts = []; + for (let i = 0; i < directoryShortcutsList.length; i++) { + let isContainedInCategory = false; + let directory = directoryShortcutsList[i]; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + this.directoryShortcuts.push(placeMenuItem); + } + } + + _createPowerItems(){ + this.lock = new MW.PowerMenuItem(this, Constants.PowerType.LOCK); + this.logOut = new MW.PowerMenuItem(this, Constants.PowerType.LOGOUT); + Utils.canHybridSleep((canHybridSleep, needsAuth) => { + if(canHybridSleep){ + this.sleep = new MW.PowerMenuItem(this, Constants.PowerType.HYBRID_SLEEP); + } + }); + + + Utils.canHibernate((canHibernate, needsAuth) => { + if(canHibernate){ + this.hibernate = new MW.PowerMenuItem(this, Constants.PowerType.HIBERNATE); + } + }); + this.suspend = new MW.PowerMenuItem(this, Constants.PowerType.SUSPEND); + this.restart = new MW.PowerMenuItem(this, Constants.PowerType.RESTART); + this.powerOff = new MW.PowerMenuItem(this, Constants.PowerType.POWER_OFF); + } + + displayPowerItems(){ + this._clearActorsFromBox(this.applicationsBox); + this.applicationsBox.add_child(this.createLabelRow(_("Session"))); + this.applicationsBox.add_child(this.lock); + this.applicationsBox.add_child(this.logOut); + this.applicationsBox.add_child(this.createLabelRow(_("System"))); + this.applicationsBox.add_child(this.suspend); + if(this.sleep) + this.applicationsBox.insert_child_at_index(this.sleep, 4); + + if(this.hibernate) + this.applicationsBox.insert_child_at_index(this.hibernate, 5); + this.applicationsBox.add_child(this.restart); + this.applicationsBox.add_child(this.powerOff); + this.activeMenuItem = this.lock; + } + + displayCategories(){ + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + this._clearActorsFromBox(this.applicationsBox); + + this.categoryHeader.setActiveCategory(null); + this._insertCategoryHeader(); + + let isActiveMenuItemSet = false; + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.applicationsBox.add_child(categoryMenuItem.actor); + if(!isActiveMenuItemSet){ + isActiveMenuItemSet = true; + this.activeMenuItem = categoryMenuItem; + } + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.clearActiveItem(); + this.pinnedAppsButton.set_style_pseudo_class("active-item"); + this.displayPinnedApps(); + } + + _insertCategoryHeader(){ + if(this.mainBox.contains(this.categoryHeader)) + this.mainBox.remove_child(this.categoryHeader); + if(this.searchBarLocation === Constants.SearchbarLocation.BOTTOM) + this.mainBox.insert_child_at_index(this.categoryHeader, 1); + else + this.mainBox.insert_child_at_index(this.categoryHeader, 2); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._insertCategoryHeader(); + this.categoryHeader.setActiveCategory(this.activeCategory); + this._displayAppList(appList, category, this.applicationsGrid); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + this._insertCategoryHeader(); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.categoryHeader.setActiveCategory(this.activeCategory); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(!searchBox.isEmpty()){ + this.clearActiveItem(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } + + destroy(){ + if(this.sleep) + this.sleep.destroy(); + if(this.hibernate) + this.hibernate.destroy(); + + this.lock.destroy(); + this.logOut.destroy(); + this.suspend.destroy(); + this.restart.destroy(); + this.powerOff.destroy(); + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js new file mode 100644 index 0000000..2630ef5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js @@ -0,0 +1,395 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 410, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + SupportsCategoryOnHover: true, + DefaultCategoryIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.ravenPositionChangedID = this._settings.connect('changed::raven-position', () => this._updatePosition()); + + this.dummyCursor = new St.Widget({ width: 1, height: 0, opacity: 0}); + Main.uiGroup.add_child(this.dummyCursor); + this.updateLocation(); + + //store old ArcMenu variables + this.oldSourceActor = this.arcMenu.sourceActor; + this.oldFocusActor = this.arcMenu.focusActor; + this.oldArrowAlignment = this.arcMenu.actor._arrowAlignment; + + this.arcMenu.sourceActor = this.dummyCursor; + this.arcMenu.focusActor = this.dummyCursor; + this.arcMenu._boxPointer.setPosition(this.dummyCursor, 0); + this.arcMenu.close(); + this.arcMenu._boxPointer.hide(); + + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen) + this.activeCategory = _("Pinned Apps"); + else + this.activeCategory = _("All Programs"); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px; -boxpointer-gap: 0px; -arrow-border-radius: 0px"; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + this.actionsBoxContainer = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + + this.actionsBox = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + this.actionsBoxContainer.add_child(this.actionsBox); + this.actionsBox.style = "spacing: 5px;"; + this.actionsBoxContainerStyle = "margin: 0px 0px 0px 0px; spacing: 10px; background-color: rgba(186, 196,201, 0.1); padding: 5px 5px;"+ + "border-color: rgba(186, 196,201, 0.2);"; + + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + //Sub Main Box -- stores left and right box + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.subMainBox.add_child(this.topBox); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 25px 10px 10px 10px;"; + this.topBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + x_align: Clutter.ActorAlign.FILL, + vertical: true, + style: "padding-bottom: 10px;" + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.weatherBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END, + vertical: true + }); + + this._weatherItem = new MW.WeatherSection(this); + this._weatherItem.style = "border-radius:4px; padding: 10px; margin: 0px 25px 25px 25px;"; + this._clocksItem = new MW.WorldClocksSection(this); + this._clocksItem.x_expand = true; + this._clocksItem.x_align = Clutter.ActorAlign.FILL; + this._clocksItem.style = "border-radius:4px; padding: 10px; margin: 0px 25px 25px 25px;"; + + this.weatherBox.add_child(this._clocksItem); + this.weatherBox.add_child(this._weatherItem); + + this.appShortcuts = []; + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + + this.shortcutsBox.add_child(this.shortcutsGrid); + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.GRID); + this.appShortcuts.push(shortcutMenuItem); + } + + this.updateWidth(); + this._updatePosition(); + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.weatherBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _updatePosition(){ + let ravenPosition = this._settings.get_enum('raven-position'); + if(this.mainBox.contains(this.actionsBoxContainer)){ + this.mainBox.remove_child(this.actionsBoxContainer); + } + if(ravenPosition === Constants.RavenPosition.LEFT){ + this.mainBox.insert_child_at_index(this.actionsBoxContainer, 0); + this.actionsBoxContainer.style = "border-right-width: 1px;" + this.actionsBoxContainerStyle; + } + else if(ravenPosition === Constants.RavenPosition.RIGHT){ + this.mainBox.insert_child_at_index(this.actionsBoxContainer, 1); + this.actionsBoxContainer.style = "border-left-width: 1px;" + this.actionsBoxContainerStyle; + } + } + + updateLocation(){ + let ravenPosition = this._settings.get_enum('raven-position'); + + let alignment = ravenPosition === Constants.RavenPosition.LEFT ? 0 : 1; + this.arcMenu._boxPointer.setSourceAlignment(alignment); + this.arcMenu._arrowAlignment = alignment; + + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let monitorWorkArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + + let positionX = ravenPosition === Constants.RavenPosition.LEFT ? monitorWorkArea.x : monitorWorkArea.x + monitorWorkArea.width - 1; + let positionY = this.arcMenu._arrowSide === St.Side.BOTTOM ? monitorWorkArea.y + monitorWorkArea.height : monitorWorkArea.y; + + this.dummyCursor.set_position(positionX, positionY); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + let screenHeight = monitorWorkArea.height; + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderWidth = themeNode.get_length('-arrow-border-width'); + + let height = Math.round((screenHeight - borderWidth * 2) / scaleFactor); + this.mainBox.style = `height: ${height}px;`; + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen){ + this.activeCategory = _("Pinned Apps"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + else{ + this.activeCategory = _("All Programs"); + let isGridLayout = true; + this.displayAllApps(isGridLayout); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + } + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + updateStyle(){ + super.updateStyle(); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px; -boxpointer-gap: 0px; -arrow-border-radius: 0px;"; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + this.updateLocation(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.HOME_SCREEN, Constants.DisplayType.BUTTON); + this.categoryDirectories.set(Constants.CategoryType.HOME_SCREEN, categoryMenuItem); + this.hasPinnedApps = true; + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum == Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.BUTTON); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.BUTTON); + this.displayCategories(); + } + + displayCategories(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.actionsBox.add_child(categoryMenuItem.actor); + } + } + + displayPinnedApps() { + if(this.activeCategoryType === Constants.CategoryType.HOME_SCREEN) + this._clearActorsFromBox(this.applicationsBox); + else + this._clearActorsFromBox(); + this.activeCategory = _("Pinned Apps"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + this.activeCategory = _("Shortcuts"); + this._displayAppList(this.appShortcuts, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + let actors = this.weatherBox.get_children(); + for (let i = 0; i < actors.length; i++) { + this.weatherBox.remove_child(actors[i]); + } + if(this._settings.get_boolean('enable-clock-widget-raven')){ + this.weatherBox.add_child(this._clocksItem); + } + if(this._settings.get_boolean('enable-weather-widget-raven')){ + this.weatherBox.add_child(this._weatherItem); + } + if(!this.subMainBox.contains(this.weatherBox)) + this.subMainBox.add_child(this.weatherBox); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + let label = this._createLabelWithSeparator(_("Recent Files")); + label.actor.style += "padding-left: 10px;"; + this.applicationsBox.insert_child_at_index(label, 0); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.applicationsBox.add_style_class_name('margin-box'); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _clearActorsFromBox(box) { + if(this.subMainBox.contains(this.weatherBox)){ + this.subMainBox.remove_child(this.weatherBox); + } + + this.applicationsBox.remove_style_class_name('margin-box'); + super._clearActorsFromBox(box); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + let label = this._createLabelWithSeparator(this.activeCategory); + + if(grid === this.applicationsGrid){ + label.actor.style += "padding-left: 10px;"; + this.applicationsBox.insert_child_at_index(label.actor, 0); + } + else{ + label.actor.style += "padding-left: 10px; padding-top: 20px;"; + this.applicationsBox.insert_child_at_index(label.actor, 2); + } + } + + destroy(){ + if(this._clocksItem) + this._clocksItem.destroy(); + if(this._weatherItem) + this._weatherItem.destroy(); + + if(this.ravenPositionChangedID){ + this._settings.disconnect(this.ravenPositionChangedID); + this.ravenPositionChangedID = null; + } + + this.arcMenu.actor.style = null; + this.arcMenu.box.style = null; + this.arcMenu.sourceActor = this.oldSourceActor; + this.arcMenu.focusActor = this.oldFocusActor; + this.arcMenu._boxPointer.setPosition(this.oldSourceActor, this.oldArrowAlignment); + this.arcMenu.close(); + this.arcMenu._boxPointer.hide(); + Main.uiGroup.remove_child(this.dummyCursor); + this.dummyCursor.destroy(); + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js new file mode 100644 index 0000000..d0cb17d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js @@ -0,0 +1,229 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 450, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP) + this.subMainBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.subMainBox.add_child(this.searchBox.actor); + } + + this.rightBox = new St.BoxLayout({ + y_align: Clutter.ActorAlign.FILL, + y_expand: true, + vertical: true, + style_class: 'right-panel margin-box' + }); + + this.placesShortcuts = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this.bookmarksShorctus = false; + this.softwareShortcuts = false; + + if(!this._settings.get_boolean('disable-user-avatar')){ + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.rightBox.add_child(this.user.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.rightBox.add_child(separator); + } + + this.shortcutsBox = new St.BoxLayout({ + vertical: true + }); + + this.shortcutsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.rightBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //draw bottom right horizontal separator + logic to determine if should show + let shouldDraw = false; + if(this._settings.get_value('directory-shortcuts-list').deep_unpack().length>0){ + this.placesShortcuts=true; + } + if(this._settings.get_value('application-shortcuts-list').deep_unpack().length>0){ + this.softwareShortcuts = true; + } + + //check to see if should draw separator + if(this.placesShortcuts && (this._settings.get_boolean('show-external-devices') || this.softwareShortcuts || this._settings.get_boolean('show-bookmarks')) ) + shouldDraw=true; + if(shouldDraw){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //External Devices and Bookmarks Shortcuts + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this.shortcutsBox.add_child(this.externalDevicesBox); + + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + //create new section for Power, Lock, Logout, Suspend Buttons + this.actionsBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.END, + style: "spacing: 6px;" + }); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + this.rightBox.add_child(this.actionsBox); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.mainBox.add_child(horizonalFlip ? this.rightBox : this.subMainBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.mainBox.add_child(verticalSeparator); + this.mainBox.add_child(horizonalFlip ? this.subMainBox: this.rightBox); + horizonalFlip ? this.rightBox.style += "margin-right: 0px" : this.rightBox.style += "margin-left: 0px" + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js new file mode 100644 index 0000000..7386301 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js @@ -0,0 +1,208 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PanelMenu = imports.ui.panelMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton, isStandalone) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + StandaloneRunner: isStandalone + }); + } + + createLayout(){ + super.createLayout(); + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.updateLocation(); + + //store old ArcMenu variables + this.oldSourceActor = this.arcMenu.sourceActor; + this.oldFocusActor = this.arcMenu.focusActor; + this.oldArrowAlignment = this.arcMenu.actor._arrowAlignment; + + this.arcMenu.sourceActor = this.dummyCursor; + this.arcMenu.focusActor = this.dummyCursor; + this.arcMenu._boxPointer.setPosition(this.dummyCursor, 0.5); + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: false, + style: "margin: 5px 0px 0px 0px;" + }); + + this.searchBox.style = "margin: 0px 0px 0px 16px;"; + this.runnerTweaksButton = new MW.RunnerTweaksButton(this); + this.runnerTweaksButton.actor.x_expand = false; + this.runnerTweaksButton.actor.y_expand = true; + this.runnerTweaksButton.actor.y_align = this.searchBox.y_align = Clutter.ActorAlign.CENTER; + this.runnerTweaksButton.actor.x_align = Clutter.ActorAlign.CENTER; + this.runnerTweaksButton.actor.style = "margin: 0px 6px;"; + + this.topBox.add_child(this.searchBox.actor); + this.topBox.add_child(this.runnerTweaksButton); + this.mainBox.add_child(this.topBox); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: false, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + reactive:true + }); + + this.mainBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style: "margin: 5px 6px 0px 16px;" + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.activeMenuItem = null; + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + this.activeMenuItem = null; + super.setDefaultMenuView(); + if(this._settings.get_boolean("runner-show-frequent-apps")) + this.displayFrequentApps(); + } + + displayFrequentApps(){ + let labelRow = this.createLabelRow(_("Frequent Apps")); + this.applicationsBox.add_child(labelRow); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + let appList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + appList.push(item); + } + } + let activeMenuItemSet = false; + for (let i = 0; i < appList.length; i++) { + let item = appList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_actor(item.actor); + if(!activeMenuItemSet){ + activeMenuItemSet = true; + this.activeMenuItem = item; + } + } + } + + /** + * if button is hidden, menu should appear on current monitor, unless preference is to always show on primary monitor + * @returns index of monitor where menu should appear + */ + _getMonitorIndexForPlacement() { + if (this.layoutProperties.StandaloneRunner) { + return this._settings.get_boolean('runner-hotkey-open-primary-monitor') ? Main.layoutManager.primaryMonitor.index : Main.layoutManager.currentMonitor.index; + } + else if (this._settings.get_enum('menu-button-appearance') === Constants.MenuButtonAppearance.NONE) + return this._settings.get_boolean('hotkey-open-primary-monitor') ? Main.layoutManager.primaryMonitor.index : Main.layoutManager.currentMonitor.index; + else + return Main.layoutManager.findIndexForActor(this.menuButton); + } + + updateLocation(){ + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px;"; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = 0.5; + + let rect = Main.layoutManager.getWorkAreaForMonitor(this._getMonitorIndexForPlacement()); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY = rect.y + (this._settings.get_boolean('runner-use-theme-gap') ? this.rise : 0); + if(this._settings.get_enum('runner-position') == 1) + positionY = Math.round(rect.y + (rect.height / 2) - 125); + this.dummyCursor.set_position(positionX, positionY); + + if(!this.topBox) + return; + + this._runnerWidth = this._settings.get_int("runner-menu-width"); + this._runnerHeight = this._settings.get_int("runner-menu-height"); + this._runnerFontSize = this._settings.get_int("runner-font-size"); + this.mainBox.style = `max-height: ${this._runnerHeight}px;`; + if(this._runnerFontSize > 0){ + this.mainBox.style += `font-size: ${this._runnerFontSize}pt;` + this.searchBox.style += `font-size: ${this._runnerFontSize}pt;` + } + else{ + this.searchBox.style = "margin: 0px 0px 0px 16px;"; + } + this.topBox.style = `width: ${this._runnerWidth}px; margin: 5px 0px 0px 0px;`; + this.applicationsScrollBox.style = `width: ${this._runnerWidth}px;`; + } + + updateStyle(){ + super.updateStyle(); + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px;"; + } + + loadCategories(){ + } + + destroy(){ + this.arcMenu.actor.style = null; + this.arcMenu.sourceActor = this.oldSourceActor; + this.arcMenu.focusActor = this.oldFocusActor; + this.arcMenu._boxPointer.setPosition(this.oldSourceActor, this.oldArrowAlignment); + Main.uiGroup.remove_child(this.dummyCursor); + this.dummyCursor.destroy(); + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js new file mode 100644 index 0000000..0e971e4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js @@ -0,0 +1,159 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GMenu, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.mainBox.style = null; + this.mainBox.style_class = 'margin-box'; + this.section = this.menuButton.section; + let actors = this.section.actor.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + this.section.actor.remove_child(actor); + } + this.section.actor.add_child(this.mainBox); + + this.loadPinnedApps(); + this.loadCategories(); + this._display(); + } + + setDefaultMenuView(){ + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + _display() { + this.displayCategories(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + updateStyle(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.updateStyle(); + } + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.SimpleMenuItem(this, categoryEnum); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.SIMPLE_CATEGORY); + } + + displayCategories(){ + super.displayCategories(this.mainBox); + } + + displayPinnedApps() { + this._clearActorsFromBox(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, categoryMenuItem); + } + } + + _clearActorsFromBox(box) { + let parent = this.applicationsGrid.get_parent(); + if(!parent) + return; + let scrollViewParent = parent.get_parent(); + + if(scrollViewParent && scrollViewParent instanceof St.ScrollView){ + let scrollBoxAdj = scrollViewParent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = parent.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + parent.remove_child(actor); + } + } + + displayCategoryAppList(appList, category, categoryMenuItem){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, categoryMenuItem); + } + + displayRecentFiles(){ + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + let children = categoryMenuItem.applicationsBox.get_children(); + for (let i = 0; i < children.length; i++) { + let actor = children[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + categoryMenuItem.applicationsBox.remove_child(actor); + } + super.displayRecentFiles(categoryMenuItem.applicationsBox); + } + + _displayAppList(apps, category, categoryMenuItem) { + super._displayAppList(apps, category, this.applicationsGrid); + if(!categoryMenuItem.applicationsBox.contains(this.applicationsGrid)) + categoryMenuItem.applicationsBox.add_child(this.applicationsGrid); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js new file mode 100644 index 0000000..ec5b2cf --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js @@ -0,0 +1,179 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + this.mainBox.style = null; + this.mainBox.style_class = 'margin-box'; + this.loadPinnedApps(); + this.loadCategories(); + this._display(); + this.arcMenu.actor.style = 'max-height: ' + (this.arcMenu.actor.height + 250) + 'px;'; + } + + setDefaultMenuView(){ + this.activeMenuItem = this.categoryDirectories.values().next().value; + let actors = this.mainBox.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + } + } + + _display() { + this.displayCategories(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategorySubMenuItem(this, categoryEnum); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.SUBMENU_CATEGORY); + + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem._setParent(this.arcMenu); + categoryMenuItem.isSimpleMenuItem = true; + } + } + + displayCategories(){ + this._clearActorsFromBox(); + let isActiveMenuItemSet = false; + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.arcMenu.addMenuItem(categoryMenuItem); + if(!isActiveMenuItemSet){ + isActiveMenuItemSet = true; + this.activeMenuItem = categoryMenuItem; + } + } + } + + _clearActorsFromBox(box) { + let parent = this.applicationsGrid.get_parent(); + if(!parent) + return; + let scrollViewParent = parent.get_parent(); + + if(scrollViewParent && scrollViewParent instanceof St.ScrollView){ + let scrollBoxAdj = scrollViewParent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = parent.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + parent.remove_child(actor); + } + super._clearActorsFromBox(this.mainBox); + } + + displayCategoryAppList(appList, category, categoryMenuItem){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, categoryMenuItem); + } + + displayRecentFiles(){ + this._clearActorsFromBox(); + this.applicationsGrid.remove_all_children(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + + let children = categoryMenuItem.menu.box.get_children(); + for (let i = 0; i < children.length; i++) { + let actor = children[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + categoryMenuItem.menu.box.remove_child(actor); + } + super.displayRecentFiles(categoryMenuItem.menu.box, () => categoryMenuItem._needsScrollbar()); + if(!categoryMenuItem.menu.box.contains(this.applicationsGrid)) + categoryMenuItem.menu.box.add_child(this.applicationsGrid); + + } + + displayPinnedApps() { + this._clearActorsFromBox(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, categoryMenuItem); + } + } + + _displayAppList(apps, category, categoryMenuItem) { + super._displayAppList(apps, category, this.applicationsGrid); + let box = categoryMenuItem.menu.box; + if(!box.contains(this.applicationsGrid)) + box.add_child(this.applicationsGrid); + } + + destroy(){ + this.arcMenu.actor.style = null; + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js new file mode 100644 index 0000000..9d279ee --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js @@ -0,0 +1,290 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * tognee Layout Created By: tognee https://gitlab.com/tognee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 290, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + // The "Left Box" + // Contains the app list and the searchbar + this.appBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: true, + y_align: Clutter.ActorAlign.FILL, + }); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true, + reactive:true + }); + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.appBox.add_child(this.searchBox.actor); + } + this.appBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ vertical: true }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.backButton = new MW.BackMenuItem(this); + this.navigateBox.add_child(new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL)); + this.navigateBox.add_child(this.backButton.actor); + this.appBox.add_child(this.navigateBox); + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.appBox.add_child(this.searchBox.actor); + } + + // The "Right Box" + // Contains some useful shortcuts + this.quickBox = new St.BoxLayout({ + vertical: true, + style: "margin: 0px 1px;", + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + this.subMainBox.add_child(horizonalFlip ? this.appBox : this.quickBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.quickBox : this.appBox); + + this.placesShortcuts= this._settings.get_value('directory-shortcuts-list').deep_unpack().length>0; + this.softwareShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack().length>0; + + this.shortcutsBox = new St.BoxLayout({ + vertical: true, + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + style: "spacing: 5px; padding-bottom: 5px;" + }); + + this.shortcutsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + }); + this.shortcutsScrollBox.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.EXTERNAL); + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.quickBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //check to see if should draw separator + if(this.placesShortcuts && this.softwareShortcuts){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.LONG, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let isContainedInCategory = false; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.BUTTON, isContainedInCategory); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + // Bottom Section for Power etc... + this.actionsScrollBox = new St.ScrollView({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.END, + x_align: Clutter.ActorAlign.CENTER + }); + this.actionsScrollBox.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.EXTERNAL); + this.actionsScrollBox.clip_to_allocation = true; + + //create new section for Leave Button + this.actionsBox = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.CENTER, + style: "spacing: 3px;" + }); + this.actionsScrollBox.add_actor(this.actionsBox); + + let leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(leaveButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.LONG, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.insert_child_at_index(separator, 0); + this.quickBox.add_child(this.actionsScrollBox); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 175px minimum limit for the menu width + menuWidth = Math.max(175, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _displayPlaces() { + let directoryShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + for (let i = 0; i < directoryShortcuts.length; i++) { + let directory = directoryShortcuts[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.BUTTON, isContainedInCategory); + this.shortcutsBox.add_child(placeMenuItem.actor); + } + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayPinnedApps(){ + super.displayPinnedApps(); + this.activeCategoryType = Constants.CategoryType.PINNED_APPS; + this.navigateBox.show(); + } + + displayAllApps(){ + this.navigateBox.hide(); + super.displayAllApps() + } + + displayCategories(){ + super.displayCategories(); + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + this.navigateBox.hide(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let defaultMenuView = this._settings.get_enum('default-menu-view-tognee'); + + if(defaultMenuView === Constants.DefaultMenuViewTognee.CATEGORIES_LIST) + this.displayCategories(); + else if(defaultMenuView === Constants.DefaultMenuViewTognee.ALL_PROGRAMS) + this.displayAllApps(); + } + + displayCategoryAppList(appList, category){ + super.displayCategoryAppList(appList, category); + this.navigateBox.show(); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.navigateBox.show(); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(searchBox.isEmpty()){ + this.navigateBox.hide(); + } + else if(!searchBox.isEmpty()){ + this.navigateBox.show(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js new file mode 100644 index 0000000..290a169 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js @@ -0,0 +1,1286 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Prefs = Me.imports.prefs; +const PW = Me.imports.prefsWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var TweaksPage = GObject.registerClass({ + Signals: { + 'response': { param_types: [GObject.TYPE_INT] }, + }, +}, class Arc_Menu_TweaksPage extends Gtk.Box { + _init(settings, layoutName) { + this._settings = settings; + this.addResponse = false; + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.layoutNameLabel = new Gtk.Label({ + label: "" + _(layoutName) + "", + use_markup: true, + xalign: 0, + hexpand: true, + halign: Gtk.Align.CENTER + }) + + let backButton = new PW.Button({ + icon_name: 'go-previous-symbolic', + title: _("Back"), + icon_first: true, + }); + backButton.halign = Gtk.Align.START; + backButton.connect('clicked', ()=> { + this.emit('response', -20); + }); + this.headerBox = new Gtk.Grid({ + hexpand: true, + halign: Gtk.Align.FILL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + }); + + this.headerBox.attach(backButton, 0, 0, 1, 1); + this.headerBox.attach(this.layoutNameLabel, 0, 0, 1, 1); + this.mainScrollWindow = new Gtk.ScrolledWindow(); + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.append(this.headerBox); + this.mainScrollWindow.set_child(this.mainBox); + this.mainScrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.append(this.mainScrollWindow); + this._createLayout(); + } + + setActiveLayout(menuLayout, layoutName){ + if(layoutName) + this.layoutNameLabel.label = "" + _(layoutName) + ""; + let children = [...this.mainBox]; + for(let child of children){ + this.mainBox.remove(child); + } + this._createLayout(menuLayout); + } + + _createLayout(menuLayout) { + if(!menuLayout) + menuLayout = this._settings.get_enum('menu-layout'); + + if(menuLayout == Constants.MenuLayout.ARCMENU) + this._loadArcMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.BRISK) + this._loadBriskMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.WHISKER) + this._loadWhiskerMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.GNOME_MENU) + this._loadGnomeMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.MINT) + this._loadMintMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.ELEMENTARY) + this._loadElementaryTweaks(); + else if(menuLayout == Constants.MenuLayout.GNOME_OVERVIEW) + this._loadGnomeOverviewTweaks(); + else if(menuLayout == Constants.MenuLayout.SIMPLE) + this._loadPlaceHolderTweaks(); + else if(menuLayout == Constants.MenuLayout.SIMPLE_2) + this._loadPlaceHolderTweaks(); + else if(menuLayout == Constants.MenuLayout.REDMOND) + this._loadRedmondMenuTweaks() + else if(menuLayout == Constants.MenuLayout.UNITY) + this._loadUnityTweaks(); + else if(menuLayout == Constants.MenuLayout.RAVEN) + this._loadRavenTweaks(); + else if(menuLayout == Constants.MenuLayout.BUDGIE) + this._loadBudgieMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.INSIDER) + this._loadInsiderMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.RUNNER) + this._loadRunnerMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.CHROMEBOOK) + this._loadChromebookTweaks(); + else if(menuLayout == Constants.MenuLayout.TOGNEE) + this._loadTogneeMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.PLASMA) + this._loadPlasmaMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.WINDOWS) + this._loadWindowsTweaks(); + else if(menuLayout == Constants.MenuLayout.ELEVEN) + this._loadElevenTweaks(); + else + this._loadPlaceHolderTweaks(); + } + + _createActivateOnHoverRow(){ + let activateOnHoverRow = new PW.FrameBoxRow(); + let activateOnHoverLabel = new Gtk.Label({ + label: _("Category Activation"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let activateOnHoverCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + activateOnHoverCombo.append_text(_("Mouse Click")); + activateOnHoverCombo.append_text(_("Mouse Hover")); + if(this._settings.get_boolean('activate-on-hover')) + activateOnHoverCombo.set_active(1); + else + activateOnHoverCombo.set_active(0); + activateOnHoverCombo.connect('changed', (widget) => { + if(widget.get_active()==0) + this._settings.set_boolean('activate-on-hover',false); + if(widget.get_active()==1) + this._settings.set_boolean('activate-on-hover',true); + }); + + activateOnHoverRow.add(activateOnHoverLabel); + activateOnHoverRow.add(activateOnHoverCombo); + return activateOnHoverRow; + } + _createAvatarShapeRow(){ + let avatarStyleRow = new PW.FrameBoxRow(); + let avatarStyleLabel = new Gtk.Label({ + label: _('Avatar Icon Shape'), + xalign:0, + hexpand: true, + }); + let avatarStyleCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + avatarStyleCombo.append_text(_("Circular")); + avatarStyleCombo.append_text(_("Square")); + avatarStyleCombo.set_active(this._settings.get_enum('avatar-style')); + avatarStyleCombo.connect('changed', (widget) => { + this._settings.set_enum('avatar-style', widget.get_active()); + this._settings.set_boolean('reload-theme', true); + }); + avatarStyleRow.add(avatarStyleLabel); + avatarStyleRow.add(avatarStyleCombo); + return avatarStyleRow; + } + _createSearchBarLocationRow(bottomDefault){ + let searchBarLocationSetting = bottomDefault ? 'searchbar-default-bottom-location' : 'searchbar-default-top-location'; + + let searchbarLocationRow = new PW.FrameBoxRow(); + let searchbarLocationLabel = new Gtk.Label({ + label: _("Searchbar Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let searchbarLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + searchbarLocationCombo.append_text(_("Bottom")); + searchbarLocationCombo.append_text(_("Top")); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting )); + searchbarLocationCombo.connect('changed', (widget) => { + this._settings.set_enum(searchBarLocationSetting , widget.get_active()); + }); + + searchbarLocationRow.add(searchbarLocationLabel); + searchbarLocationRow.add(searchbarLocationCombo); + return searchbarLocationRow; + } + _createFlipHorizontalRow(){ + let horizontalFlipRow = new PW.FrameBoxRow(); + let horizontalFlipLabel = new Gtk.Label({ + label: _("Flip Layout Horizontally"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let horizontalFlipSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + horizontalFlipSwitch.set_active(this._settings.get_boolean('enable-horizontal-flip')); + horizontalFlipSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-horizontal-flip', widget.get_active()); + }); + horizontalFlipRow.add(horizontalFlipLabel); + horizontalFlipRow.add(horizontalFlipSwitch); + return horizontalFlipRow; + } + _disableAvatarRow(){ + let disableAvatarRow = new PW.FrameBoxRow(); + let disableAvatarLabel = new Gtk.Label({ + label: _('Disable User Avatar'), + xalign:0, + hexpand: true, + }); + let disableAvatarSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + disableAvatarSwitch.set_active(this._settings.get_boolean('disable-user-avatar')); + disableAvatarSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('disable-user-avatar', widget.get_active()); + }); + disableAvatarRow.add(disableAvatarLabel); + disableAvatarRow.add(disableAvatarSwitch); + return disableAvatarRow; + } + + _loadElevenTweaks(){ + let elevenTweaksFrame = new PW.FrameBox(); + let disableFrequentAppsRow = new PW.FrameBoxRow(); + let disableFrequentAppsLabel = new Gtk.Label({ + label: _("Disable Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let disableFrequentAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + disableFrequentAppsSwitch.set_active(this._settings.get_boolean('eleven-disable-frequent-apps')); + disableFrequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('eleven-disable-frequent-apps', widget.get_active()); + }); + disableFrequentAppsRow.add(disableFrequentAppsLabel); + disableFrequentAppsRow.add(disableFrequentAppsSwitch); + elevenTweaksFrame.add(disableFrequentAppsRow); + this.mainBox.append(elevenTweaksFrame); + } + + _loadGnomeOverviewTweaks(){ + let gnomeOverviewTweaksFrame = new PW.FrameBox(); + let appsGridRow = new PW.FrameBoxRow(); + let appsGridLabel = new Gtk.Label({ + label: _("Show Applications Grid"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let appsGridSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + appsGridSwitch.set_active(this._settings.get_boolean('gnome-dash-show-applications')); + appsGridSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('gnome-dash-show-applications', widget.get_active()); + }); + appsGridRow.add(appsGridLabel); + appsGridRow.add(appsGridSwitch); + gnomeOverviewTweaksFrame.add(appsGridRow); + this.mainBox.append(gnomeOverviewTweaksFrame); + } + + _loadWindowsTweaks(){ + let windowsTweaksFrame = new PW.FrameBox(); + let frequentAppsRow = new PW.FrameBoxRow(); + let frequentAppsLabel = new Gtk.Label({ + label: _("Disable Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let frequentAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + frequentAppsSwitch.set_active(this._settings.get_boolean('windows-disable-frequent-apps')); + frequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('windows-disable-frequent-apps', widget.get_active()); + }); + frequentAppsRow.add(frequentAppsLabel); + frequentAppsRow.add(frequentAppsSwitch); + windowsTweaksFrame.add(frequentAppsRow); + + let pinnedAppsRow = new PW.FrameBoxRow(); + let pinnedAppsLabel = new Gtk.Label({ + label: _("Disable Pinned Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let pinnedAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + pinnedAppsSwitch.set_active(this._settings.get_boolean('windows-disable-pinned-apps')); + pinnedAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('windows-disable-pinned-apps', widget.get_active()); + }); + pinnedAppsRow.add(pinnedAppsLabel); + pinnedAppsRow.add(pinnedAppsSwitch); + windowsTweaksFrame.add(pinnedAppsRow); + + this.mainBox.append(windowsTweaksFrame); + } + + _loadPlasmaMenuTweaks(){ + let plasmaMenuTweaksFrame = new PW.FrameBox(); + + let searchBarLocationSetting = 'searchbar-default-top-location'; + + let searchbarLocationRow = new PW.FrameBoxRow(); + let searchbarLocationLabel = new Gtk.Label({ + label: _("Searchbar Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let searchbarLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + searchbarLocationCombo.append_text(_("Bottom")); + searchbarLocationCombo.append_text(_("Top")); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting)); + searchbarLocationCombo.connect('changed', (widget) => { + this._settings.set_enum(searchBarLocationSetting , widget.get_active()); + }); + + searchbarLocationRow.add(searchbarLocationLabel); + searchbarLocationRow.add(searchbarLocationCombo); + plasmaMenuTweaksFrame.add(searchbarLocationRow); + + let hoverRow = new PW.FrameBoxRow(); + let hoverLabel = new Gtk.Label({ + label: _("Activate on Hover"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hoverSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + hoverSwitch.set_active(this._settings.get_boolean('plasma-enable-hover')); + hoverSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('plasma-enable-hover', widget.get_active()); + }); + hoverRow.add(hoverLabel); + hoverRow.add(hoverSwitch); + plasmaMenuTweaksFrame.add(hoverRow); + + let foregroundColorRow = new PW.FrameBoxRow(); + let foregroundColorLabel = new Gtk.Label({ + label: _('Selected Button Border Color'), + xalign:0, + hexpand: true, + }); + let foregroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + let color = new Gdk.RGBA(); + color.parse(this._settings.get_string('plasma-selected-color')); + foregroundColorChooser.set_rgba(color); + foregroundColorChooser.connect('color-set', ()=>{ + this._settings.set_string('plasma-selected-color', foregroundColorChooser.get_rgba().to_string()); + this._settings.set_boolean('reload-theme', true); + }); + foregroundColorRow.add(foregroundColorLabel); + foregroundColorRow.add(foregroundColorChooser); + plasmaMenuTweaksFrame.add(foregroundColorRow); + + let backgroundColorRow = new PW.FrameBoxRow(); + let backgroundColorLabel = new Gtk.Label({ + label: _('Selected Button Background Color'), + xalign:0, + hexpand: true, + }); + let backgroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this._settings.get_string('plasma-selected-background-color')); + backgroundColorChooser.set_rgba(color); + backgroundColorChooser.connect('color-set', ()=>{ + this._settings.set_string('plasma-selected-background-color',backgroundColorChooser.get_rgba().to_string()); + this._settings.set_boolean('reload-theme', true); + }); + backgroundColorRow.add(backgroundColorLabel); + backgroundColorRow.add(backgroundColorChooser); + plasmaMenuTweaksFrame.add(backgroundColorRow); + + this.mainBox.append(plasmaMenuTweaksFrame); + + let resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + halign: Gtk.Align.START, + hexpand: true + }); + resetButton.set_sensitive(true); + resetButton.connect('clicked', ()=> { + let foregroundColor = this._settings.get_default_value('plasma-selected-color').unpack(); + let backgroundColor = this._settings.get_default_value('plasma-selected-background-color').unpack(); + let hoverEnabled = this._settings.get_default_value('plasma-enable-hover').unpack(); + let showDescriptions = this._settings.get_default_value('apps-show-extra-details').unpack(); + this._settings.reset('searchbar-default-top-location'); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting)); + hoverSwitch.set_active(hoverEnabled); + color.parse(foregroundColor); + foregroundColorChooser.set_rgba(color); + color.parse(backgroundColor); + backgroundColorChooser.set_rgba(color); + descriptionsSwitch.set_active(showDescriptions); + this._settings.reset('plasma-selected-color'); + this._settings.reset('plasma-selected-background-color'); + this._settings.reset('plasma-enable-hover'); + this._settings.reset('apps-show-extra-details'); + this._settings.set_boolean('reload-theme', true); + }); + this.mainBox.append(resetButton); + } + _loadBriskMenuTweaks(){ + let briskMenuTweaksFrame = new PW.FrameBox(); + briskMenuTweaksFrame.add(this._createActivateOnHoverRow()); + briskMenuTweaksFrame.add(this._createSearchBarLocationRow()); + briskMenuTweaksFrame.add(this._createFlipHorizontalRow()); + let pinnedAppsFrame = new PW.FrameBox(); + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow(); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_max_content_height(100); + pinnedAppsScrollWindow.set_min_content_height(100); + + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('brisk-shortcuts-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('brisk-shortcuts-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Brisk Menu Shortcuts") + "", + use_markup: true, + xalign: 0 + }); + + this.mainBox.append(briskMenuTweaksFrame); + this.mainBox.append(pinnedAppsHeaderLabel); + this.mainBox.append(pinnedAppsScrollWindow); + this.mainBox.append(savePinnedAppsButton); + } + _loadChromebookTweaks(){ + let chromeBookTweaksFrame = new PW.FrameBox(); + chromeBookTweaksFrame.add(this._createSearchBarLocationRow()); + this.mainBox.append(chromeBookTweaksFrame); + } + _loadElementaryTweaks(){ + let elementaryTweaksFrame = new PW.FrameBox(); + elementaryTweaksFrame.add(this._createSearchBarLocationRow()); + this.mainBox.append(elementaryTweaksFrame); + } + _loadBudgieMenuTweaks(){ + let budgieMenuTweaksFrame = new PW.FrameBox(); + budgieMenuTweaksFrame.add(this._createActivateOnHoverRow()); + budgieMenuTweaksFrame.add(this._createSearchBarLocationRow()); + budgieMenuTweaksFrame.add(this._createFlipHorizontalRow()); + + let enableActivitiesRow = new PW.FrameBoxRow(); + let enableActivitiesLabel = new Gtk.Label({ + label: _('Enable Activities Overview Shortcut'), + xalign:0, + hexpand: true, + }); + let enableActivitiesSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + enableActivitiesSwitch.set_active(this._settings.get_boolean('enable-activities-shortcut')); + enableActivitiesSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-activities-shortcut', widget.get_active()); + }); + enableActivitiesRow.add(enableActivitiesLabel); + enableActivitiesRow.add(enableActivitiesSwitch); + budgieMenuTweaksFrame.add(enableActivitiesRow); + + this.mainBox.append(budgieMenuTweaksFrame); + } + _loadRunnerMenuTweaks(){ + let runnerMenuTweaksFrame = new PW.FrameBox(); + let runnerPositionRow = new PW.FrameBoxRow(); + let runnerPositionLabel = new Gtk.Label({ + label: _('Position'), + xalign:0, + hexpand: true, + }); + let runnerPositionCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + runnerPositionCombo.append_text(_("Top")); + runnerPositionCombo.append_text(_("Centered")); + runnerPositionCombo.set_active(this._settings.get_enum('runner-position')); + runnerPositionCombo.connect('changed', (widget) => { + this._settings.set_enum('runner-position', widget.get_active()); + }); + runnerPositionRow.add(runnerPositionLabel); + runnerPositionRow.add(runnerPositionCombo); + runnerMenuTweaksFrame.add(runnerPositionRow); + + let runnerWidthRow = new PW.FrameBoxRow(); + let runnerWidthLabel = new Gtk.Label({ + label: _("Width"), + use_markup: true, + hexpand: true, + xalign: 0 + }); + let runnerWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: 1000, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + runnerWidthScale.add_mark(500, Gtk.PositionType.TOP, _("Default")); + runnerWidthScale.set_value(this._settings.get_int('runner-menu-width')); + runnerWidthScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-menu-width', widget.get_value()); + }); + runnerWidthRow.add(runnerWidthLabel); + runnerWidthRow.add(runnerWidthScale); + runnerMenuTweaksFrame.add(runnerWidthRow); + + let runnerHeightRow = new PW.FrameBoxRow(); + let runnerHeightLabel = new Gtk.Label({ + label: _("Height"), + use_markup: true, + hexpand: true, + xalign: 0 + }); + let runnerHeightScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: 1000, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + runnerHeightScale.add_mark(400, Gtk.PositionType.TOP, _("Default")); + runnerHeightScale.set_value(this._settings.get_int('runner-menu-height')); + runnerHeightScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-menu-height', widget.get_value()); + }); + + runnerHeightRow.add(runnerHeightLabel); + runnerHeightRow.add(runnerHeightScale); + runnerMenuTweaksFrame.add(runnerHeightRow); + + let runnerFontSizeRow = new PW.FrameBoxRow(); + let runnerFontSizeLabel = new Gtk.Label({ + label: _("Font Size"), + hexpand: true, + use_markup: true, + xalign: 0 + }); + let runnerFontSizeScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 30, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + + runnerFontSizeScale.add_mark(0, Gtk.PositionType.TOP, _("Default")); + runnerFontSizeScale.set_value(this._settings.get_int('runner-font-size')); + runnerFontSizeScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-font-size', widget.get_value()); + }); + runnerFontSizeRow.add(runnerFontSizeLabel); + runnerFontSizeRow.add(runnerFontSizeScale); + runnerMenuTweaksFrame.add(runnerFontSizeRow); + + let frequentAppsRow = new PW.FrameBoxRow(); + let frequentAppsLabel = new Gtk.Label({ + label: _("Show Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let frequentAppsSwitch = new Gtk.Switch(); + if(this._settings.get_boolean('runner-show-frequent-apps')) + frequentAppsSwitch.set_active(true); + frequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('runner-show-frequent-apps', widget.get_active()); + }); + frequentAppsRow.add(frequentAppsLabel); + frequentAppsRow.add(frequentAppsSwitch); + runnerMenuTweaksFrame.add(frequentAppsRow); + + let inheritThemeGapRow = new PW.FrameBoxRow(); + let inheritThemeGapLabel = new Gtk.Label({ + label: _("Inherit Shell Theme Popup Gap"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let inheritThemeGapSwitch = new Gtk.Switch(); + if(this._settings.get_boolean('runner-use-theme-gap')) + inheritThemeGapSwitch.set_active(true); + inheritThemeGapSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('runner-use-theme-gap', widget.get_active()); + }); + inheritThemeGapRow.add(inheritThemeGapLabel); + inheritThemeGapRow.add(inheritThemeGapSwitch); + runnerMenuTweaksFrame.add(inheritThemeGapRow); + + this.mainBox.append(runnerMenuTweaksFrame); + } + _loadUnityTweaks(){ + let pinnedAppsFrame = new PW.FrameBox(); + let generalTweaksFrame = new PW.FrameBox(); + let homeScreenRow = new PW.FrameBoxRow(); + let homeScreenLabel = new Gtk.Label({ + label: _('Default View'), + xalign:0, + hexpand: true, + }); + let homeScreenCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + homeScreenCombo.append_text(_("Home Screen")); + homeScreenCombo.append_text(_("All Programs")); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + homeScreenCombo.set_active(homeScreen ? 0 : 1); + homeScreenCombo.connect('changed', (widget) => { + let enable = widget.get_active() ==0 ? true : false; + this._settings.set_boolean('enable-unity-homescreen', enable); + }); + homeScreenRow.add(homeScreenLabel); + homeScreenRow.add(homeScreenCombo); + generalTweaksFrame.add(homeScreenRow); + this.mainBox.append(generalTweaksFrame); + + let widgetFrame = this._createWidgetsRows(Constants.MenuLayout.UNITY); + this.mainBox.append(widgetFrame); + + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + pinnedAppsScrollWindow.set_min_content_height(400); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('unity-pinned-app-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('unity-pinned-app-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Unity Layout Buttons") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsHeaderLabel); + this.mainBox.append(pinnedAppsScrollWindow); + this.mainBox.append(savePinnedAppsButton); + + let pinnedAppsSeparatorHeaderLabel = new Gtk.Label({ + label: "" + _("Button Separator Position") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsSeparatorHeaderLabel); + + let pinnedAppsSeparatorFrame = new PW.FrameBox(); + let pinnedAppsSeparatorRow = new PW.FrameBoxRow(); + let pinnedAppsSeparatorLabel = new Gtk.Label({ + label: _("Separator Position"), + use_markup: true, + xalign: 0 + }); + let pinnedAppsSeparatorScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 7, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true + }); + pinnedAppsSeparatorScale.add_mark(0, Gtk.PositionType.BOTTOM, _("None")); + pinnedAppsSeparatorScale.set_value(this._settings.get_int('unity-separator-index')); + pinnedAppsSeparatorScale.connect('value-changed', (widget) => { + this._settings.set_int('unity-separator-index', widget.get_value()); + }); + + let infoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + infoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _('Adjust the position of the separator in the button panel'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorLabel); + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorScale); + pinnedAppsSeparatorRow.add(infoButton); + pinnedAppsSeparatorFrame.add(pinnedAppsSeparatorRow); + this.mainBox.append(pinnedAppsSeparatorFrame); + } + _loadRavenTweaks(){ + let generalTweaksFrame = new PW.FrameBox(); + let homeScreenRow = new PW.FrameBoxRow(); + let homeScreenLabel = new Gtk.Label({ + label: _('Default View'), + xalign:0, + hexpand: true, + }); + let homeScreenCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + homeScreenCombo.append_text(_("Home Screen")); + homeScreenCombo.append_text(_("All Programs")); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + homeScreenCombo.set_active(homeScreen ? 0 : 1); + homeScreenCombo.connect('changed', (widget) => { + let enable = widget.get_active() ==0 ? true : false; + this._settings.set_boolean('enable-unity-homescreen', enable); + }); + homeScreenRow.add(homeScreenLabel); + homeScreenRow.add(homeScreenCombo); + generalTweaksFrame.add(homeScreenRow); + this.mainBox.append(generalTweaksFrame); + + let ravenPositionRow = new PW.FrameBoxRow(); + let ravenPositionLabel = new Gtk.Label({ + label: _('Position on Monitor'), + xalign:0, + hexpand: true, + }); + let ravenPositionCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + ravenPositionCombo.append_text(_("Left")); + ravenPositionCombo.append_text(_("Right")); + let ravenPosition = this._settings.get_enum('raven-position'); + ravenPositionCombo.set_active(ravenPosition); + ravenPositionCombo.connect('changed', (widget) => { + this._settings.set_enum('raven-position', widget.get_active()); + }); + ravenPositionRow.add(ravenPositionLabel); + ravenPositionRow.add(ravenPositionCombo); + generalTweaksFrame.add(ravenPositionRow); + generalTweaksFrame.add(this._createActivateOnHoverRow()); + let widgetFrame = this._createWidgetsRows(Constants.MenuLayout.RAVEN); + this.mainBox.append(widgetFrame); + } + _loadMintMenuTweaks(){ + let mintMenuTweaksFrame = new PW.FrameBox(); + mintMenuTweaksFrame.add(this._createActivateOnHoverRow()); + mintMenuTweaksFrame.add(this._createSearchBarLocationRow()); + mintMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(mintMenuTweaksFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Mint Layout Shortcuts") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsHeaderLabel); + + let pinnedAppsFrame = new PW.FrameBox(); + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow(); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_min_content_height(400); + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('mint-pinned-app-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('mint-pinned-app-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + this.mainBox.append(pinnedAppsScrollWindow); + + this.mainBox.append(savePinnedAppsButton); + + let pinnedAppsSeparatorHeaderLabel = new Gtk.Label({ + label: "" + _("Shortcut Separator Position") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsSeparatorHeaderLabel); + + let pinnedAppsSeparatorFrame = new PW.FrameBox(); + let pinnedAppsSeparatorRow = new PW.FrameBoxRow(); + let pinnedAppsSeparatorLabel = new Gtk.Label({ + label: _("Separator Position"), + use_markup: true, + xalign: 0 + }); + let pinnedAppsSeparatorScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 7, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + }); + pinnedAppsSeparatorScale.add_mark(0, Gtk.PositionType.BOTTOM, _("None")); + pinnedAppsSeparatorScale.set_value(this._settings.get_int('mint-separator-index')); + pinnedAppsSeparatorScale.connect('value-changed', (widget) => { + this._settings.set_int('mint-separator-index', widget.get_value()); + }); + + let infoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + infoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _('Adjust the position of the separator in the button panel'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorLabel); + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorScale); + pinnedAppsSeparatorRow.add(infoButton); + pinnedAppsSeparatorFrame.add(pinnedAppsSeparatorRow); + this.mainBox.append(pinnedAppsSeparatorFrame); + } + _loadPinnedApps(array,frame, savePinnedAppsButton, scrollWindow) { + for(let i = 0; i < array.length; i += 3) { + let frameRow = new PW.FrameBoxDragRow(scrollWindow); + frameRow._name = array[i]; + frameRow._icon = Prefs.getIconPath([array[i], array[i+1], array[i+2]]); + frameRow._cmd = array[i+2]; + frameRow.saveButton = savePinnedAppsButton; + frameRow.hasEditButton = true; + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + let arcMenuImage = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + + let arcMenuImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + arcMenuImageBox.append(dragImage); + arcMenuImageBox.append(arcMenuImage); + frameRow.add(arcMenuImageBox); + + let frameLabel = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true + }); + + frameLabel.label = _(frameRow._name); + frameRow.add(frameLabel); + + Prefs.checkIfValidShortcut(frameRow, frameLabel, arcMenuImage); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: frame, + buttons: [savePinnedAppsButton], + modifyButton: true, + changeButton: true + }); + + buttonBox.connect('change', ()=> { + let dialog = new Prefs.AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.OTHER); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + let icon = Prefs.getIconPath(newPinnedApps); + arcMenuImage.gicon = Gio.icon_new_for_string(iconString ? iconString : icon); + dialog.destroy(); + frame.show(); + savePinnedAppsButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new Prefs.AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.OTHER, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + arcMenuImage.gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + dialog.destroy(); + frame.show(); + savePinnedAppsButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + frameRow.add(buttonBox); + frame.add(frameRow); + } + } + _loadWhiskerMenuTweaks(){ + let whiskerMenuTweaksFrame = new PW.FrameBox(); + whiskerMenuTweaksFrame.add(this._createActivateOnHoverRow()); + whiskerMenuTweaksFrame.add(this._createAvatarShapeRow()); + whiskerMenuTweaksFrame.add(this._createSearchBarLocationRow()); + whiskerMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(whiskerMenuTweaksFrame); + } + _loadRedmondMenuTweaks(){ + let redmondMenuTweaksFrame = new PW.FrameBox(); + redmondMenuTweaksFrame.add(this._createSearchBarLocationRow()); + + redmondMenuTweaksFrame.add(this._createFlipHorizontalRow()); + redmondMenuTweaksFrame.add(this._createAvatarShapeRow()); + redmondMenuTweaksFrame.add(this._disableAvatarRow()); + + let placesFrame = new PW.FrameBox(); + let externalDeviceRow = new PW.FrameBoxRow(); + let externalDeviceLabel = new Gtk.Label({ + label: _("External Devices"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let externalDeviceButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-external-devices')) + externalDeviceButton.set_active(true); + externalDeviceButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-external-devices', widget.get_active()); + }); + externalDeviceRow.add(externalDeviceLabel); + externalDeviceRow.add(externalDeviceButton); + + placesFrame.add(externalDeviceRow); + + let bookmarksRow = new PW.FrameBoxRow(); + let bookmarksLabel = new Gtk.Label({ + label: _("Bookmarks"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let bookmarksButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-bookmarks')) + bookmarksButton.set_active(true); + bookmarksButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-bookmarks', widget.get_active()); + }); + bookmarksRow.add(bookmarksLabel); + bookmarksRow.add(bookmarksButton); + + placesFrame.add(bookmarksRow); + this.mainBox.append(redmondMenuTweaksFrame); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Shortcuts") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + this.mainBox.append(placesFrame); + + } + _loadInsiderMenuTweaks(){ + let insiderMenuTweaksFrame = new PW.FrameBox(); + insiderMenuTweaksFrame.add(this._createAvatarShapeRow()); + this.mainBox.append(insiderMenuTweaksFrame); + } + _loadGnomeMenuTweaks(){ + let gnomeMenuTweaksFrame = new PW.FrameBox(); + gnomeMenuTweaksFrame.add(this._createActivateOnHoverRow()); + gnomeMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(gnomeMenuTweaksFrame); + } + _loadPlaceHolderTweaks(){ + let placeHolderFrame = new PW.FrameBox(); + let placeHolderRow = new PW.FrameBoxRow(); + let placeHolderLabel = new Gtk.Label({ + label: _("Nothing Yet!"), + use_markup: true, + halign: Gtk.Align.CENTER, + hexpand: true + }); + placeHolderRow.add(placeHolderLabel); + placeHolderFrame.add(placeHolderRow); + this.mainBox.append(placeHolderFrame); + } + _loadTogneeMenuTweaks(){ + let togneeMenuTweaksFrame = new PW.FrameBox(); + let searchBarBottomDefault = true; + let defaultLeftBoxRow = new PW.FrameBoxRow(); + let defaultLeftBoxLabel = new Gtk.Label({ + label: _("Default View"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let defaultLeftBoxCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END + }); + defaultLeftBoxCombo.append_text(_("Categories List")); + defaultLeftBoxCombo.append_text(_("All Programs")); + defaultLeftBoxCombo.set_active(this._settings.get_enum('default-menu-view-tognee')); + defaultLeftBoxCombo.connect('changed', (widget) => { + this._settings.set_enum('default-menu-view-tognee', widget.get_active()); + }); + + defaultLeftBoxRow.add(defaultLeftBoxLabel); + defaultLeftBoxRow.add(defaultLeftBoxCombo); + togneeMenuTweaksFrame.add(defaultLeftBoxRow); + togneeMenuTweaksFrame.add(this._createSearchBarLocationRow(searchBarBottomDefault)); + togneeMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(togneeMenuTweaksFrame); + } + _loadArcMenuTweaks(){ + let arcMenuTweaksFrame = new PW.FrameBox(); + let defaultLeftBoxRow = new PW.FrameBoxRow(); + let defaultLeftBoxLabel = new Gtk.Label({ + label: _("Default View"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let defaultLeftBoxCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + defaultLeftBoxCombo.append_text(_("Pinned Apps")); + defaultLeftBoxCombo.append_text(_("Categories List")); + defaultLeftBoxCombo.append_text(_("Frequent Apps")); + defaultLeftBoxCombo.append_text(_("All Programs")); + defaultLeftBoxCombo.set_active(this._settings.get_enum('default-menu-view')); + defaultLeftBoxCombo.connect('changed', (widget) => { + this._settings.set_enum('default-menu-view', widget.get_active()); + }); + + defaultLeftBoxRow.add(defaultLeftBoxLabel); + defaultLeftBoxRow.add(defaultLeftBoxCombo); + arcMenuTweaksFrame.add(defaultLeftBoxRow); + + let searchBarBottomDefault = true; + arcMenuTweaksFrame.add(this._createSearchBarLocationRow(searchBarBottomDefault)); + arcMenuTweaksFrame.add(this._createFlipHorizontalRow()); + arcMenuTweaksFrame.add(this._createAvatarShapeRow()); + arcMenuTweaksFrame.add(this._disableAvatarRow()); + + let placesFrame = new PW.FrameBox(); + let externalDeviceRow = new PW.FrameBoxRow(); + let externalDeviceLabel = new Gtk.Label({ + label: _("External Devices"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let externalDeviceButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-external-devices')) + externalDeviceButton.set_active(true); + externalDeviceButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-external-devices', widget.get_active()); + }); + externalDeviceRow.add(externalDeviceLabel); + externalDeviceRow.add(externalDeviceButton); + + placesFrame.add(externalDeviceRow); + + let bookmarksRow = new PW.FrameBoxRow(); + let bookmarksLabel = new Gtk.Label({ + label: _("Bookmarks"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let bookmarksButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-bookmarks')) + bookmarksButton.set_active(true); + bookmarksButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-bookmarks', widget.get_active()); + }); + bookmarksRow.add(bookmarksLabel); + bookmarksRow.add(bookmarksButton); + + placesFrame.add(bookmarksRow); + this.mainBox.append(arcMenuTweaksFrame); + + let extraCategoriesFrame = new PW.FrameBox(); + let extraCategoriesRow = new PW.FrameBoxRow(); + let extraCategoriesButtonRow = new PW.FrameBoxRow(); + let extraCategoriesLocationRow = new PW.FrameBoxRow(); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Shortcuts") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + this.mainBox.append(placesFrame); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Categories Quick Links") + "" + + "\n" + '' + _("Display quick links of extra categories on the home page") + "" + + "\n" + '' + _("See Customize Menu -> Extra Categories") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + let extraCategoriesLinksBox = new Prefs.MenuSettingsCategoriesPage(this._settings, "arcmenu-extra-categories-links"); + extraCategoriesLinksBox.categoriesFrame.unparent(); + extraCategoriesLinksBox.buttonRow.unparent(); + extraCategoriesRow.add(extraCategoriesLinksBox.categoriesFrame); + extraCategoriesLinksBox.categoriesFrame.hexpand = true; + extraCategoriesLinksBox.categoriesFrame.halign = Gtk.Align.FILL; + extraCategoriesButtonRow.add(extraCategoriesLinksBox.buttonRow); + extraCategoriesFrame.add(extraCategoriesRow); + extraCategoriesFrame.add(extraCategoriesButtonRow); + + this.mainBox.append(extraCategoriesFrame); + + let extraCategoriesLocationFrame = new PW.FrameBox(); + let extraCategoriesLocationLabel = new Gtk.Label({ + label: _("Quick Links Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let extraCategoriesLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + extraCategoriesLocationCombo.append_text(_("Bottom")); + extraCategoriesLocationCombo.append_text(_("Top")); + extraCategoriesLocationCombo.set_active(this._settings.get_enum('arcmenu-extra-categories-links-location')); + extraCategoriesLocationCombo.connect('changed', (widget) => { + this._settings.set_enum('arcmenu-extra-categories-links-location' , widget.get_active()); + }); + + extraCategoriesLocationRow.add(extraCategoriesLocationLabel); + extraCategoriesLocationRow.add(extraCategoriesLocationCombo); + extraCategoriesLocationFrame.add(extraCategoriesLocationRow); + this.mainBox.append(extraCategoriesLocationFrame); + } + _createWidgetsRows(layout){ + let weatherWidgetSetting = 'enable-weather-widget-raven'; + let clockWidgetSetting = 'enable-clock-widget-raven'; + if(layout == Constants.MenuLayout.RAVEN){ + weatherWidgetSetting = 'enable-weather-widget-raven'; + clockWidgetSetting = 'enable-clock-widget-raven'; + } + else{ + weatherWidgetSetting = 'enable-weather-widget-unity'; + clockWidgetSetting = 'enable-clock-widget-unity'; + } + + let widgetFrame = new PW.FrameBox(); + let weatherWidgetRow = new PW.FrameBoxRow(); + let weatherWidgetLabel = new Gtk.Label({ + label: _("Enable Weather Widget"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let weatherWidgetSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + weatherWidgetSwitch.set_active(this._settings.get_boolean(weatherWidgetSetting)); + weatherWidgetSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(weatherWidgetSetting, widget.get_active()); + }); + + weatherWidgetRow.add(weatherWidgetLabel); + weatherWidgetRow.add(weatherWidgetSwitch); + widgetFrame.add(weatherWidgetRow); + + let clockWidgetRow = new PW.FrameBoxRow(); + let clockWidgetLabel = new Gtk.Label({ + label: _("Enable Clock Widget"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let clockWidgetSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + clockWidgetSwitch.set_active(this._settings.get_boolean(clockWidgetSetting)); + clockWidgetSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(clockWidgetSetting, widget.get_active()); + }); + + clockWidgetRow.add(clockWidgetLabel); + clockWidgetRow.add(clockWidgetSwitch); + widgetFrame.add(clockWidgetRow); + + return widgetFrame; + } +}); diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js new file mode 100644 index 0000000..b29a5bb --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js @@ -0,0 +1,445 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + VerticalMainBox: true, + DefaultMenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen) + this.activeCategory = _("Pinned Apps"); + else + this.activeCategory = _("All Programs"); + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: 'padding-bottom: 10px; padding-right: 15px;' + }); + + this.mainBox.add_child(this.topBox); + this.categoriesButton = new MW.CategoriesButton(this); + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.actor.y_align = Clutter.ActorAlign.CENTER; + this.searchBox.actor.y_expand = true; + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 15px 0px 15px;"; + this.topBox.add_child(this.searchBox.actor); + this.topBox.add_child(this.categoriesButton.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style: "padding-bottom: 10px;" + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.arcMenu.box.style = "padding-bottom:0px;"; + + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px;background-color:rgba(186, 196,201, 0.1) ; padding: 5px 5px;"+ + "border-color:rgba(186, 196,201, 0.2) ; border-top-width: 1px;"; + this.themeNodeBorderRadius = ""; + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + this.themeNodeBorderRadius + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.widgetBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END, + vertical: false, + style_class: 'datemenu-displays-box' + }); + + this.widgetBox.style = "margin: 0px; spacing: 10px; padding: 10px 50px;"; + this._weatherItem = new MW.WeatherSection(this); + this._weatherItem.style = "border-radius:4px; width: 350px; padding: 10px; margin: 0px"; + this._clocksItem = new MW.WorldClocksSection(this); + this._clocksItem.style = "border-radius:4px; padding: 10px; margin: 0px"; + + this.appShortcuts = []; + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + + this.shortcutsBox.add_child(this.shortcutsGrid); + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let isContainedInCategory = false; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.GRID, isContainedInCategory); + this.appShortcuts.push(shortcutMenuItem); + } + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this._createCategoriesMenu(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _addSeparator(){ + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.ALWAYS_SHOW, Constants.SeparatorAlignment.VERTICAL); + this.actionsBox.add_child(verticalSeparator); + } + + loadExtraPinnedApps(){ + this.actionsContainerBox.remove_child(this.actionsBox); + this.actionsBox.destroy_all_children(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px; padding: 5px 0px;"; + this.actionsContainerBox.add_child(this.actionsBox); + + super.loadExtraPinnedApps(this._settings.get_strv('unity-pinned-app-list'), this._settings.get_int('unity-separator-index')); + } + + _createExtraPinnedAppsList(){ + let pinnedApps = []; + pinnedApps.push(_("Home"), "ArcMenu_Home", "ArcMenu_Home"); + pinnedApps.push(_("Documents"), "ArcMenu_Documents", "ArcMenu_Documents"); + pinnedApps.push(_("Downloads"), "ArcMenu_Downloads", "ArcMenu_Downloads"); + + let software = Utils.findSoftwareManager(); + if(software) + pinnedApps.push(_("Software"), 'system-software-install-symbolic', software); + else + pinnedApps.push(_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"); + + pinnedApps.push(_("Files"), "system-file-manager", "org.gnome.Nautilus.desktop"); + pinnedApps.push(_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"); + pinnedApps.push(_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"); + pinnedApps.push(_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"); + + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('unity-pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + return pinnedApps; + } + + _createCategoriesMenu(){ + this.categoriesMenu = new PopupMenu.PopupMenu(this.categoriesButton.actor, 0.5, St.Side.TOP); + this.categoriesMenu.blockSourceEvents = true; + this.categoriesMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.categoriesButton.tooltip){ + this.categoriesButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.categoriesButton.active = false; + this.categoriesButton.sync_hover(); + this.categoriesButton.hovered = this.categoriesButton.hover; + } + }); + this.section = new PopupMenu.PopupMenuSection(); + this.categoriesMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + overlay_scrollbars: true, + reactive:true + }); + this.leftPanelPopup.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + this.categoriesScrollBox.clip_to_allocation = true; + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(350 / scaleFactor); + this.leftPanelPopup.style = `max-height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this._displayCategories(); + this.subMenuManager.addMenu(this.categoriesMenu); + this.categoriesMenu.actor.hide(); + Main.uiGroup.add_child(this.categoriesMenu.actor); + } + + toggleCategoriesMenu(){ + let appsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.categoriesMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.categoriesMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + this.categoriesButton.tooltip.hide(); + + this.categoriesMenu.toggle(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen){ + this.activeCategory = _("Pinned Apps"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + else{ + this.activeCategory = _("All Programs"); + let isGridLayout = true; + this.displayAllApps(isGridLayout); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + } + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + this.themeNodeBorderRadius; + + if(removeMenuArrow) + this.arcMenu.box.style = "padding-bottom:0px; margin:0px;"; + else + this.arcMenu.box.style = "padding-bottom:0px;"; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.HOME_SCREEN, Constants.DisplayType.LIST); + this.categoryDirectories.set(Constants.CategoryType.HOME_SCREEN, categoryMenuItem); + this.hasPinnedApps = true; + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum == Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + _displayCategories(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.categoriesBox.add_actor(categoryMenuItem.actor); + } + } + + displayPinnedApps() { + if(this.activeCategoryType === Constants.CategoryType.HOME_SCREEN) + this._clearActorsFromBox(this.applicationsBox); + else + this._clearActorsFromBox(); + this.subMainBox.remove_child(this.actionsContainerBox); + this.activeCategory = _("Pinned Apps"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + this.activeCategory = _("Shortcuts"); + this._displayAppList(this.appShortcuts, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + this.widgetBox.remove_all_children(); + if(this._settings.get_boolean('enable-clock-widget-unity')) + this.widgetBox.add_child(this._clocksItem); + if(this._settings.get_boolean('enable-weather-widget-unity')) + this.widgetBox.add_child(this._weatherItem); + if(!this.subMainBox.contains(this.widgetBox)) + this.subMainBox.add_child(this.widgetBox); + this.subMainBox.add_child(this.actionsContainerBox); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + let label = this._createLabelWithSeparator(_("Recent Files")); + this.applicationsBox.insert_child_at_index(label, 0); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.applicationsBox.add_style_class_name('margin-box'); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _clearActorsFromBox(box) { + if(this.categoriesMenu.isOpen) + this.categoriesMenu.toggle(); + if(this.subMainBox.contains(this.widgetBox)){ + this.subMainBox.remove_child(this.widgetBox); + } + this.applicationsBox.remove_style_class_name('margin-box'); + super._clearActorsFromBox(box); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + let label = this._createLabelWithSeparator(this.activeCategory); + if(grid === this.applicationsGrid) + this.applicationsBox.insert_child_at_index(label.actor, 0); + else + this.applicationsBox.insert_child_at_index(label.actor, 2); + } + + destroy(){ + if(this._clocksItem) + this._clocksItem.destroy(); + if(this._weatherItem) + this._weatherItem.destroy(); + + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + + super.destroy(); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js new file mode 100644 index 0000000..ab4958e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js @@ -0,0 +1,187 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + this.actionsBox.style = "spacing: 6px; margin: 0px 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.user.actor.x_expand = true; + this.user.actor.x_align = Clutter.ActorAlign.FILL; + this.actionsBox.add_child(this.user.actor); + + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + else{ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + } + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js new file mode 100644 index 0000000..047bd63 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js @@ -0,0 +1,465 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + SearchDisplayType: Constants.DisplayType.LIST, + DisplayType: Constants.DisplayType.LIST, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 300, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.actionsBox.style = "margin: 0px 5px 0px 10px; spacing: 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.extrasButton = new MW.ExtrasButton(this); + this.extrasButton.actor.y_expand = true; + this.extrasButton.actor.y_align= Clutter.ActorAlign.START; + this.actionsBox.add_child(this.extrasButton.actor); + let userButton = new MW.UserMenuItem(this, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(userButton.actor); + let path = GLib.get_user_special_dir(imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path != null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.actionsBox.add_child(placeMenuItem.actor); + } + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + this.leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(this.leaveButton.actor); + + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.pinnedAppsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade' + }); + + this.pinnedAppsBox = new St.BoxLayout({ + vertical: true, + x_expand: true + }); + this.pinnedAppsScrollBox.add_actor(this.pinnedAppsBox); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 10, + row_spacing: 10 + }); + this.pinnedAppsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.pinnedAppsGrid); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 15px 10px 0px 10px;"; + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + this.subMainBox.add_child(this.searchBox.actor); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcutsList = this._settings.get_value('application-shortcuts-list').deep_unpack(); + this.applicationShortcuts = []; + for(let i = 0; i < applicationShortcutsList.length; i++){ + let applicationName = applicationShortcutsList[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcutsList[i][1], applicationShortcutsList[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.applicationShortcuts.push(shortcutMenuItem.actor); + } + + let directoryShortcutsList = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + this._loadPlaces(directoryShortcutsList); + + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + + this._createExtrasMenu(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.pinnedAppsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView){ + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + this.pinnedAppsGrid.layout_manager.forceGridColumns = this.getColumnsFromGridIconSizeSetting(); + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + + if(id === 'bookmarks' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Bookmarks"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'devices' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Devices"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'network' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Network"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + } + + _loadPlaces(directoryShortcutsList) { + this.directoryShortcuts = []; + for (let i = 0; i < directoryShortcutsList.length; i++) { + let directory = directoryShortcutsList[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + this.directoryShortcuts.push(placeMenuItem); + } + } + + _createExtrasMenu(){ + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.extrasMenu = new PopupMenu.PopupMenu(this.dummyCursor, 0, St.Side.TOP); + this.section = new PopupMenu.PopupMenuSection(); + this.extrasMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + let headerBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.leftPanelPopup.add_child(headerBox); + + this.backButton = new MW.BackMenuItem(this); + this.backButton.connect("activate", () => this.toggleExtrasMenu()); + headerBox.add_child(this.backButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + headerBox.add_child(separator); + + this.computerScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + reactive:true, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + }); + + this.leftPanelPopup.add_child(this.computerScrollBox); + + this.computerBox = new St.BoxLayout({ + vertical: true + }); + this.computerScrollBox.add_actor(this.computerBox); + + this.computerBox.add_child(this.createLabelRow(_("Application Shortcuts"))); + for(let i = 0; i < this.applicationShortcuts.length; i++){ + this.computerBox.add_child(this.applicationShortcuts[i]); + } + this.computerBox.add_child(this.createLabelRow(_("Places"))); + for(let i = 0; i < this.directoryShortcuts.length; i++){ + this.computerBox.add_child(this.directoryShortcuts[i]); + } + this.computerBox.add_child(this.externalDevicesBox); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor) - 1; + this.leftPanelPopup.style = `height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this.subMenuManager.addMenu(this.extrasMenu); + this.extrasMenu.actor.hide(); + Main.uiGroup.add_child(this.extrasMenu.actor); + this.extrasMenu.connect('open-state-changed', (menu, open) => { + if(!open){ + this.extrasButton.active = false; + this.extrasButton.sync_hover(); + this.extrasButton.hovered = this.extrasButton.hover; + } + else{ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.extrasButton.tooltip){ + this.extrasButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + }); + } + + toggleExtrasMenu(){ + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.extrasMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.extrasMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + this.extrasButton.tooltip.hide(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let backgroundColor = themeNode.get_color('-arrow-background-color'); + let borderWidth = themeNode.get_length('-arrow-border-width'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + let drawBoxShadow = true; + if(backgroundColor?.alpha === 0){ + backgroundColor = themeNode.get_color('background-color'); + if(backgroundColor?.alpha === 0){ + drawBoxShadow = false; + } + } + + let styleProperties, shadowColor; + if(drawBoxShadow){ + shadowColor = backgroundColor.shade(.35); + backgroundColor = Utils.clutterColorToRGBA(backgroundColor); + shadowColor = Utils.clutterColorToRGBA(shadowColor); + styleProperties = "box-shadow: 3px 0px 2px " + shadowColor + "; background-color: " + backgroundColor + ";"; + } + + this.extrasMenu.actor.style = "-boxpointer-gap: 0px; -arrow-border-color: transparent; -arrow-border-width: 0px; width: 250px;" + +"-arrow-base:0px; -arrow-rise: 0px; -arrow-background-color: transparent;" + +"border-radius: " + borderRadius + "px;" + styleProperties; + + this.arcMenu.actor.get_allocation_box(); + let [x, y] = this.arcMenu.actor.get_transformed_position(); + let rise = themeNode.get_length('-arrow-rise'); + + if(this.arcMenu._arrowSide === St.Side.TOP) + y += rise + 1; + else + y += 1; + + if(this.arcMenu._arrowSide === St.Side.LEFT) + x = x + (borderRadius * 2) + rise + 1; + else + x = x + (borderRadius * 2); + + this.dummyCursor.set_position(Math.round(x + borderWidth), Math.round(y + borderWidth)); + this.extrasMenu.toggle(); + if(this.extrasMenu.isOpen){ + this.activeMenuItem = this.backButton; + this.backButton.grab_key_focus(); + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + + this.displayAllApps(); + if(!this._settings.get_boolean('windows-disable-pinned-apps')){ + if(!this.mainBox.contains(this.pinnedAppsScrollBox)) + this.mainBox.add_child(this.pinnedAppsScrollBox); + this.displayPinnedApps(); + } + + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + + displayAllApps(){ + this._clearActorsFromBox(); + let label = this._createLabelWithSeparator(_("Frequent")); + this.activeMenuItemSet = false; + + if(!this._settings.get_boolean('windows-disable-frequent-apps')){ + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + this.frequentAppsList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + this.frequentAppsList.push(item); + } + } + const MaxItems = 8; + if(this.frequentAppsList.length > 0){ + this.applicationsBox.add_child(label.actor); + for (let i = 0; i < this.frequentAppsList.length && i < MaxItems; i++) { + let item = this.frequentAppsList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_child(item.actor); + if(!this.activeMenuItemSet){ + this._frequentActiveItem = item; + this.activeMenuItemSet = true; + } + } + } + } + + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + + if(this.activeMenuItemSet) + this.activeMenuItem = this._frequentActiveItem; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayPinnedApps() { + super._clearActorsFromBox(this.pinnedAppsBox); + this.pinnedAppsGrid.remove_all_children(); + let label = this.createLabelRow(_("Pinned Apps")); + label.remove_child(label._ornamentLabel); + this.pinnedAppsBox.add_child(label); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.HOME_SCREEN, this.pinnedAppsGrid); + if(!this.pinnedAppsBox.contains(this.pinnedAppsGrid)) + this.pinnedAppsBox.add_child(this.pinnedAppsGrid); + + if(this.activeMenuItemSet) + this.activeMenuItem = this._frequentActiveItem; + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/metadata.json b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/metadata.json new file mode 100644 index 0000000..f6d4800 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/metadata.json @@ -0,0 +1,15 @@ +{ + "_generated": "Generated by SweetTooth, do not edit", + "description": "Application menu for GNOME Shell\n\nFeatures include: various menu layouts, built in GNOME search, quick access to system shortcuts, and much more!\n\nCommon solutions for ERROR message:\n - Restart your GNOME session after updating ArcMenu.\n - Install one of the following packages: 'gir1.2-gmenu-3.0' or 'gnome-menus'\n\nGeneral Help:\n - Visit https://gitlab.com/arcmenu/ArcMenu/-/wikis/home\n\nPlease report all bugs or issues at https://gitlab.com/arcmenu/ArcMenu", + "extension-id": "arcmenu", + "gettext-domain": "arcmenu", + "name": "ArcMenu", + "settings-schema": "org.gnome.shell.extensions.arcmenu", + "shell-version": [ + "40", + "41" + ], + "url": "https://gitlab.com/arcmenu/ArcMenu", + "uuid": "arcmenu@arcmenu.com", + "version": 27 +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js new file mode 100644 index 0000000..4e58333 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js @@ -0,0 +1,764 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: This file leverages the work from places-menu extension + * (https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/tree/master/extensions/places-menu) + * and Dash to Dock extension 'location.js' file to implement a trash shortcut + * (https://github.com/micheleg/dash-to-dock/blob/master/locations.js) + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {St, Gio, GLib, Shell } = imports.gi; +const Clutter = imports.gi.Clutter; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const GObject = imports.gi.GObject; +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const ShellMountOperation = imports.ui.shellMountOperation; +const Signals = imports.signals; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; +const Hostname1Iface = ' \ + \ + \ + \ +'; +const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface); + +var PlaceMenuItem = GObject.registerClass(class Arc_Menu_PlaceMenuItem2 extends MW.ArcMenuPopupBaseMenuItem{ + _init(menuLayout, info) { + super._init(menuLayout); + this._info = info; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ text: info.name, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER }); + + this.add_child(this.label); + + if (info.isRemovable()) { + this.style = "padding-right: 15px;"; + this._ejectButton = new MW.ArcMenuButtonItem(this._menuLayout, null, 'media-eject-symbolic'); + this._ejectButton.add_style_class_name("arcmenu-small-button") + this._ejectButton.setIconSize(14); + this._ejectButton.x_align = Clutter.ActorAlign.END; + this._ejectButton.x_expand = true; + this._ejectButton.connect('activate', info.eject.bind(info)); + this.add_child(this._ejectButton); + } + + this._changedId = info.connect('changed', + this._propertiesChanged.bind(this)); + this.actor.connect('destroy',()=>{ + if (this._changedId) { + this._info.disconnect(this._changedId); + this._changedId = 0; + } + }); + + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + let defaultIconSize = this._menuLayout.layoutProperties.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: this._info.icon, + icon_size: iconSize + }); + } + + activate(event) { + this._info.launch(event.get_time()); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _propertiesChanged(info) { + this._info = info; + this._iconBin.set_child(this.createIcon()); + this.label.text = info.name; + } +}); + +var PlaceInfo = class Arc_Menu_PlaceInfo2 { + constructor() { + this._init.apply(this, arguments); + } + + _init(kind, file, name, icon) { + this.kind = kind; + this.file = file; + this.name = name || this._getFileName(); + this.icon = icon ? new Gio.ThemedIcon({ name: icon }) : this.getIcon(); + } + + destroy() { + } + + isRemovable() { + return false; + } + + async _ensureMountAndLaunch(context, tryMount) { + try { + await this._launchDefaultForUri(this.file.get_uri(), context, null); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) { + Main.notifyError(_('Failed to launch “%s”').format(this.name), e.message); + return; + } + + let source = { + get_icon: () => this.icon + }; + let op = new ShellMountOperation.ShellMountOperation(source); + try { + await this._mountEnclosingVolume(0, op.mountOp, null); + + if (tryMount) + this._ensureMountAndLaunch(context, false); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED)) + Main.notifyError(_('Failed to mount volume for “%s”').format(this.name), e.message); + } finally { + op.close(); + } + } + } + + launch(timestamp) { + let launchContext = global.create_app_launch_context(timestamp, -1); + this._ensureMountAndLaunch(launchContext, true); + } + + getIcon() { + this.file.query_info_async('standard::symbolic-icon', 0, 0, null, + (file, result) => { + try { + let info = file.query_info_finish(result); + this.icon = info.get_symbolic_icon(); + this.emit('changed'); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) + return; + throw e; + } + }); + + // return a generic icon for this kind for now, until we have the + // icon from the query info above + switch (this.kind) { + case 'network': + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + case 'devices': + return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); + case 'special': + case 'bookmarks': + default: + if (!this.file.is_native()) + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + else + return new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + + _getFileName() { + try { + let info = this.file.query_info('standard::display-name', 0, null); + return info.get_display_name(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) + return this.file.get_basename(); + throw e; + } + } + + _launchDefaultForUri(uri, context, cancel) { + return new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(uri, context, cancel, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + } + + _mountEnclosingVolume(flags, mountOp, cancel) { + return new Promise((resolve, reject) => { + this.file.mount_enclosing_volume(flags, mountOp, cancel, (o, res) => { + try { + this.file.mount_enclosing_volume_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + } +} +Signals.addSignalMethods(PlaceInfo.prototype); + +var RootInfo = class Arc_Menu_RootInfo extends PlaceInfo { + _init() { + super._init('devices', Gio.File.new_for_path('/'), _('Computer')); + + let busName = 'org.freedesktop.hostname1'; + let objPath = '/org/freedesktop/hostname1'; + new Hostname1(Gio.DBus.system, busName, objPath, (obj, error) => { + if (error) + return; + + this._proxy = obj; + this._proxyID = this._proxy.connect('g-properties-changed', + this._propertiesChanged.bind(this)); + this._propertiesChanged(obj); + }); + + } + + getIcon() { + return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); + } + + _propertiesChanged(proxy) { + // GDBusProxy will emit a g-properties-changed when hostname1 goes down + // ignore it + if (proxy.g_name_owner) { + this.name = proxy.PrettyHostname || _('Computer'); + this.emit('changed'); + } + } + + destroy() { + if (this._proxyID) { + this._proxy.disconnect(this._proxyID); + this._proxy = 0; + } + if (this._proxy) { + this._proxy.run_dispose(); + this._proxy = null; + } + super.destroy(); + } +}; + + +var PlaceDeviceInfo = class Arc_Menu_PlaceDeviceInfo extends PlaceInfo { + _init(kind, mount) { + this._mount = mount; + super._init(kind, mount.get_root(), mount.get_name()); + } + + getIcon() { + return this._mount.get_symbolic_icon(); + } + + isRemovable() { + return this._mount.can_eject(); + } + + eject() { + let unmountArgs = [ + Gio.MountUnmountFlags.NONE, + (new ShellMountOperation.ShellMountOperation(this._mount)).mountOp, + null // Gio.Cancellable + ]; + + if (this._mount.can_eject()) + this._mount.eject_with_operation(...unmountArgs, + this._ejectFinish.bind(this)); + else + this._mount.unmount_with_operation(...unmountArgs, + this._unmountFinish.bind(this)); + } + + _ejectFinish(mount, result) { + try { + mount.eject_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } + } + + _unmountFinish(mount, result) { + try { + mount.unmount_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } + } + + _reportFailure(exception) { + let msg = _('Ejecting drive “%s” failed:').format(this._mount.get_name()); + Main.notifyError(msg, exception.message); + } +}; + +var PlaceVolumeInfo = class Arc_Menu_PlaceVolumeInfo extends PlaceInfo { + _init(kind, volume) { + this._volume = volume; + super._init(kind, volume.get_activation_root(), volume.get_name()); + } + + launch(timestamp) { + if (this.file) { + super.launch(timestamp); + return; + } + + this._volume.mount(0, null, null, (volume, result) => { + volume.mount_finish(result); + + let mount = volume.get_mount(); + this.file = mount.get_root(); + super.launch(timestamp); + }); + } + + getIcon() { + return this._volume.get_symbolic_icon(); + } +}; + +const DefaultDirectories = [ + GLib.UserDirectory.DIRECTORY_DOCUMENTS, + GLib.UserDirectory.DIRECTORY_PICTURES, + GLib.UserDirectory.DIRECTORY_MUSIC, + GLib.UserDirectory.DIRECTORY_DOWNLOAD, + GLib.UserDirectory.DIRECTORY_VIDEOS, +]; + +var PlacesManager = class Arc_Menu_PlacesManager { + constructor() { + this._places = { + special: [], + devices: [], + bookmarks: [], + network: [], + }; + + this._settings = new Gio.Settings({ schema_id: BACKGROUND_SCHEMA }); + this._showDesktopIconsChangedId = + this._settings.connect('changed::show-desktop-icons', + this._updateSpecials.bind(this)); + this._updateSpecials(); + + /* + * Show devices, code more or less ported from nautilus-places-sidebar.c + */ + this._volumeMonitor = Gio.VolumeMonitor.get(); + this._connectVolumeMonitorSignals(); + this._updateMounts(); + + this._bookmarksFile = this._findBookmarksFile(); + this._bookmarkTimeoutId = 0; + this._monitor = null; + + if (this._bookmarksFile) { + this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null); + this._monitor.connect('changed', () => { + if (this._bookmarkTimeoutId > 0) + return; + /* Defensive event compression */ + this._bookmarkTimeoutId = GLib.timeout_add( + GLib.PRIORITY_DEFAULT, 100, () => { + this._bookmarkTimeoutId = 0; + this._reloadBookmarks(); + return false; + }); + }); + + this._reloadBookmarks(); + } + } + + _connectVolumeMonitorSignals() { + const signals = [ + 'volume-added', + 'volume-removed', + 'volume-changed', + 'mount-added', + 'mount-removed', + 'mount-changed', + 'drive-connected', + 'drive-disconnected', + 'drive-changed' + ]; + + this._volumeMonitorSignals = []; + let func = this._updateMounts.bind(this); + for (let i = 0; i < signals.length; i++) { + let id = this._volumeMonitor.connect(signals[i], func); + this._volumeMonitorSignals.push(id); + } + } + + destroy() { + if (this._settings) + this._settings.disconnect(this._showDesktopIconsChangedId); + this._settings = null; + + for (let i = 0; i < this._volumeMonitorSignals.length; i++) + this._volumeMonitor.disconnect(this._volumeMonitorSignals[i]); + + if (this._monitor) + this._monitor.cancel(); + if (this._bookmarkTimeoutId) + GLib.source_remove(this._bookmarkTimeoutId); + } + + _updateSpecials() { + this._places.special.forEach(p => p.destroy()); + this._places.special = []; + + let homePath = GLib.get_home_dir(); + + this._places.special.push(new PlaceInfo('special', + Gio.File.new_for_path(homePath), + _('Home'))); + + let specials = []; + let dirs = DefaultDirectories.slice(); + + if (this._settings.get_boolean('show-desktop-icons')) + dirs.push(GLib.UserDirectory.DIRECTORY_DESKTOP); + + for (let i = 0; i < dirs.length; i++) { + let specialPath = GLib.get_user_special_dir(dirs[i]); + if (specialPath == null || specialPath == homePath) + continue; + + let file = Gio.File.new_for_path(specialPath), info; + try { + info = new PlaceInfo('special', file); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + continue; + throw e; + } + + specials.push(info); + } + + specials.sort((a, b) => GLib.utf8_collate(a.name, b.name)); + this._places.special = this._places.special.concat(specials); + + this.emit('special-updated'); + } + + _updateMounts() { + let networkMounts = []; + let networkVolumes = []; + + this._places.devices.forEach(p => p.destroy()); + this._places.devices = []; + this._places.network.forEach(p => p.destroy()); + this._places.network = []; + + /* Add standard places */ + // this._places.devices.push(new RootInfo()); + /* this._places.network.push(new PlaceInfo('network', + Gio.File.new_for_uri('network:///'), + _('Network'), + 'network-workgroup-symbolic'));*/ + + /* first go through all connected drives */ + let drives = this._volumeMonitor.get_connected_drives(); + for (let i = 0; i < drives.length; i++) { + let volumes = drives[i].get_volumes(); + + for (let j = 0; j < volumes.length; j++) { + let identifier = volumes[j].get_identifier('class'); + if (identifier && identifier.includes('network')) { + networkVolumes.push(volumes[j]); + } else { + let mount = volumes[j].get_mount(); + if (mount != null) + this._addMount('devices', mount); + } + } + } + + /* add all volumes that is not associated with a drive */ + let volumes = this._volumeMonitor.get_volumes(); + for (let i = 0; i < volumes.length; i++) { + if (volumes[i].get_drive() != null) + continue; + + let identifier = volumes[i].get_identifier('class'); + if (identifier && identifier.includes('network')) { + networkVolumes.push(volumes[i]); + } else { + let mount = volumes[i].get_mount(); + if (mount != null) + this._addMount('devices', mount); + } + } + + /* add mounts that have no volume (/etc/mtab mounts, ftp, sftp,...) */ + let mounts = this._volumeMonitor.get_mounts(); + for (let i = 0; i < mounts.length; i++) { + if (mounts[i].is_shadowed()) + continue; + + if (mounts[i].get_volume()) + continue; + + let root = mounts[i].get_default_location(); + if (!root.is_native()) { + networkMounts.push(mounts[i]); + continue; + } + this._addMount('devices', mounts[i]); + } + + for (let i = 0; i < networkVolumes.length; i++) { + let mount = networkVolumes[i].get_mount(); + if (mount) { + networkMounts.push(mount); + continue; + } + this._addVolume('network', networkVolumes[i]); + } + + for (let i = 0; i < networkMounts.length; i++) { + this._addMount('network', networkMounts[i]); + } + + this.emit('devices-updated'); + this.emit('network-updated'); + } + + _findBookmarksFile() { + let paths = [ + GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']), + GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']), + ]; + + for (let i = 0; i < paths.length; i++) { + if (GLib.file_test(paths[i], GLib.FileTest.EXISTS)) + return Gio.File.new_for_path(paths[i]); + } + + return null; + } + + _reloadBookmarks() { + + this._bookmarks = []; + + let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path()); + let lines = content.split('\n'); + + let bookmarks = []; + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; + let components = line.split(' '); + let bookmark = components[0]; + + if (!bookmark) + continue; + + let file = Gio.File.new_for_uri(bookmark); + if (file.is_native() && !file.query_exists(null)) + continue; + + let duplicate = false; + for (let i = 0; i < this._places.special.length; i++) { + if (file.equal(this._places.special[i].file)) { + duplicate = true; + break; + } + } + if (duplicate) + continue; + for (let i = 0; i < bookmarks.length; i++) { + if (file.equal(bookmarks[i].file)) { + duplicate = true; + break; + } + } + if (duplicate) + continue; + + let label = null; + if (components.length > 1) + label = components.slice(1).join(' '); + + bookmarks.push(new PlaceInfo('bookmarks', file, label)); + } + + this._places.bookmarks = bookmarks; + + this.emit('bookmarks-updated'); + } + + _addMount(kind, mount) { + let devItem; + + try { + devItem = new PlaceDeviceInfo(kind, mount); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + return; + throw e; + } + + this._places[kind].push(devItem); + } + + _addVolume(kind, volume) { + let volItem; + + try { + volItem = new PlaceVolumeInfo(kind, volume); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + return; + throw e; + } + + this._places[kind].push(volItem); + } + + get(kind) { + return this._places[kind]; + } +}; +Signals.addSignalMethods(PlacesManager.prototype); + +//Trash can class implemented from Dash to Dock https://github.com/micheleg/dash-to-dock/blob/master/locations.js +var Trash = class Arc_Menu_Trash { + constructor(menuItem) { + this._menuItem = menuItem; + let trashPath = GLib.get_home_dir() + '/.local/share/Trash/files/'; + this._file = Gio.file_new_for_path(trashPath); + try { + this._monitor = this._file.monitor_directory(0, null); + this._signalId = this._monitor.connect( + 'changed', + this._onTrashChange.bind(this) + ); + } catch (e) { + log(`Impossible to monitor trash: ${e}`); + } + this._lastEmpty = true; + this._empty = true; + this._schedUpdateId = 0; + this._updateTrash(); + } + + destroy() { + if (this._monitor) { + this._monitor.disconnect(this._signalId); + this._monitor.run_dispose(); + } + this._file.run_dispose(); + } + + _onTrashChange() { + if (this._schedUpdateId) { + GLib.source_remove(this._schedUpdateId); + } + this._schedUpdateId = GLib.timeout_add( + GLib.PRIORITY_DEFAULT, 500, () => { + this._schedUpdateId = 0; + this._updateTrash(); + return GLib.SOURCE_REMOVE; + }); + } + + _updateTrash() { + try { + let children = this._file.enumerate_children('*', 0, null); + this._empty = children.next_file(null) == null; + children.close(null); + } catch (e) { + log(`Impossible to enumerate trash children: ${e}`) + return; + } + + this._ensureApp(); + } + + _ensureApp() { + if (this._trashApp == null || + this._lastEmpty != this._empty) { + let trashKeys = new GLib.KeyFile(); + trashKeys.set_string('Desktop Entry', 'Name', _('Trash')); + trashKeys.set_string('Desktop Entry', 'Id', 'ArcMenu_Trash'); + trashKeys.set_string('Desktop Entry', 'Icon', + this._empty ? 'user-trash-symbolic' : 'user-trash-full-symbolic'); + trashKeys.set_string('Desktop Entry', 'Type', 'Application'); + trashKeys.set_string('Desktop Entry', 'Exec', 'gio open trash:///'); + trashKeys.set_string('Desktop Entry', 'StartupNotify', 'false'); + trashKeys.set_string('Desktop Entry', 'XdtdUri', 'trash:///'); + if (!this._empty) { + trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash;'); + trashKeys.set_string('Desktop Action empty-trash', 'Name', _('Empty Trash')); + trashKeys.set_string('Desktop Action empty-trash', 'Exec', + 'dbus-send --print-reply --dest=org.gnome.Nautilus /org/gnome/Nautilus org.gnome.Nautilus.FileOperations.EmptyTrash'); + } + else{ + trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash-inactive;'); + trashKeys.set_string('Desktop Action empty-trash-inactive', 'Name', _('Empty Trash')); + } + + let trashAppInfo = Gio.DesktopAppInfo.new_from_keyfile(trashKeys); + this._trashApp = new Shell.App({appInfo: trashAppInfo}); + this._lastEmpty = this._empty; + + this._menuItem._app = this._trashApp; + if(this._menuItem.contextMenu) + this._menuItem.contextMenu._app = this._trashApp; + let trashIcon = this._trashApp.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(this._menuItem._iconBin && trashIcon) + this._menuItem.iconName = trashIcon.gicon.to_string(); + this._menuItem._updateIcon(); + this.emit('changed'); + } + } + + getApp() { + this._ensureApp(); + return this._trashApp; + } +} +Signals.addSignalMethods(Trash.prototype); diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefs.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefs.js new file mode 100644 index 0000000..916491b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefs.js @@ -0,0 +1,6786 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const ByteArray = imports.byteArray; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const LayoutTweaks = Me.imports.menulayouts.tweaks; +const PW = Me.imports.prefsWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const SCHEMA_PATH = '/org/gnome/shell/extensions/arcmenu/'; +const GSET = 'gnome-shell-extension-tool'; + +var MenuSettingsPinnedAppsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsPinnedAppsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + + this.pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.pinnedAppsScrollWindow.set_min_content_height(300); + this.pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + this.frame = new PW.FrameBox(); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + halign: Gtk.Align.END, + vexpand: false, + valign: Gtk.Align.END + }); + this._loadPinnedApps(this._settings.get_strv('pinned-app-list')); + this.pinnedAppsScrollWindow.set_child(this.frame); + this.mainBox.append(this.pinnedAppsScrollWindow); + + let addPinnedAppsFrame = new PW.FrameBox(); + let addPinnedAppsFrameRow = new PW.FrameBoxRow(); + let addPinnedAppsFrameLabel = new Gtk.Label({ + label: _("Add More Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addPinnedAppsButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addPinnedAppsButton.connect('clicked', ()=> { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.DEFAULT); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array = []; + for(let i = 0; i < newPinnedApps.length; i++){ + array.push(newPinnedApps[i]._name); + array.push(newPinnedApps[i]._icon); + array.push(newPinnedApps[i]._cmd); + } + this._loadPinnedApps(array); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addPinnedAppsFrameRow.add(addPinnedAppsFrameLabel); + addPinnedAppsFrameRow.add(addPinnedAppsButton); + addPinnedAppsFrame.add(addPinnedAppsFrameRow); + this.mainBox.append(addPinnedAppsFrame); + + let addCustomAppFrame = new PW.FrameBox(); + let addCustomAppFrameRow = new PW.FrameBoxRow(); + let addCustomAppFrameLabel = new Gtk.Label({ + label: _("Add Custom Shortcut"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addCustomAppButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addCustomAppButton.connect('clicked', ()=> { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DEFAULT); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps(newPinnedApps); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let x = 0; x < this.frame.count; x++) { + array.push(this.frame.get_index(x)._name); + array.push(this.frame.get_index(x)._icon); + array.push(this.frame.get_index(x)._cmd); + } + this._settings.set_strv('pinned-app-list',array); + this.saveButton.set_sensitive(false); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + _loadPinnedApps(array) { + for(let i = 0; i < array.length; i += 3) { + let frameRow = new PW.FrameBoxDragRow(this.pinnedAppsScrollWindow); + let iconString; + frameRow._name = array[i]; + frameRow._icon = array[i + 1]; + frameRow._cmd = array[i + 2]; + frameRow.saveButton = this.saveButton; + if(frameRow._icon === "ArcMenu_ArcMenuIcon"){ + frameRow._icon = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + } + iconString = frameRow._icon; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString); + let arcMenuImage = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + + let arcMenuImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + arcMenuImageBox.append(dragImage); + arcMenuImageBox.append(arcMenuImage); + frameRow.add(arcMenuImageBox); + + let frameLabel = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true + }); + + frameLabel.label = _(frameRow._name); + + checkIfValidShortcut(frameRow, frameLabel, arcMenuImage); + + frameRow.add(frameLabel); + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.frame, + buttons: [this.saveButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DEFAULT, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)) + arcMenuImage.gicon = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon(); + else + arcMenuImage.gicon = Gio.icon_new_for_string(frameRow._icon); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + frameRow.add(buttonBox); + this.frame.add(frameRow); + } + } +}); + +var AddAppsToPinnedListWindow = GObject.registerClass( + class Arc_Menu_AddAppsToPinnedListWindow extends PW.DialogWindow { + _init(settings, parent, dialogType) { + this._settings = settings; + this._dialogType = dialogType; + if(this._dialogType == Constants.DiaglogType.DEFAULT) + super._init(_('Add to your Pinned Apps'), parent); + else if(this._dialogType == Constants.DiaglogType.OTHER) + super._init(_('Change Selected Pinned App'), parent); + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS) + super._init(_('Select Application Shortcuts'), parent); + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + super._init(_('Select Directory Shortcuts'), parent); + this.newPinnedAppsArray=[]; + this.addResponse = false; + } + + _createLayout(vbox) { + let searchBar = new Gtk.SearchEntry({ + placeholder_text: _("Search…") + }); + searchBar.connect('search-changed', ()=> { + this._loadCategories(); + let applist = Gio.app_info_get_all(); + + let pattern = searchBar.text; + let searchResults = []; + let res = []; + for (let i in applist) { + let app = applist[i]; + let match; + + match = app.get_name().toLowerCase() + " "; + let info = Gio.DesktopAppInfo.new(app.get_id()); + + if (info.get_display_name()) + match += info.get_display_name().toLowerCase() + " "; + if (info.get_executable()) + match += info.get_executable().toLowerCase() + " "; + if (info.get_keywords()) + match += info.get_keywords().toString().toLowerCase() + " "; + if (app.get_description()) + match += app.get_description().toLowerCase(); + + + let index = match.indexOf(pattern); + if (index != -1) { + searchResults.push([index, app]); + } + } + let arcMenuSettings = _("ArcMenu Settings").toLowerCase(); + let index = arcMenuSettings.indexOf(pattern); + let showArcMenuSettings = false; + if (index != -1) { + showArcMenuSettings = true; + } + + searchResults.sort(function(a,b) { + return a[0] > b[0]; + }); + res = searchResults.map(function(value,index) { return value[1]; }); + this.appsFrame.remove_all_children(); + this._loadCategories(res, showArcMenuSettings); + this.appsFrame.show(); + + }); + + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_min_content_height(400); + pinnedAppsScrollWindow.set_min_content_width(650); + this.appsFrame = new PW.FrameBox(); + let addAppsButton; + if(this._dialogType == Constants.DiaglogType.DEFAULT || this._dialogType == Constants.DiaglogType.APPLICATIONS + || this._dialogType == Constants.DiaglogType.DIRECTORIES){ + addAppsButton = new Gtk.Button({ + label: _("Add") + }); + + addAppsButton.connect('clicked', ()=> { + this.addResponse = true; + this.response(-10); + }); + addAppsButton.set_halign(Gtk.Align.END); + } + + pinnedAppsScrollWindow.set_child(this.appsFrame); + vbox.append(pinnedAppsScrollWindow); + if(this._dialogType == Constants.DiaglogType.DEFAULT){ + this._loadCategories(); + vbox.append(addAppsButton); + vbox.prepend(searchBar); + } + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES){ + let defaultApplicationShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"]); + defaultApplicationShortcuts.push([_("Network"), "ArcMenu_Network", "ArcMenu_Network"]); + defaultApplicationShortcuts.push([_("Trash"), "user-trash-symbolic", "ArcMenu_Trash"]); + defaultApplicationShortcuts.push([_("Recent"), "document-open-recent-symbolic", "ArcMenu_Recent"]); + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(getIconPath(defaultApplicationShortcuts[i])), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) + this.newPinnedAppsArray.push(frameRow); + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + this.appsFrame.add(frameRow); + } + vbox.append(addAppsButton); + } + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS){ + this._loadCategories(); + let defaultApplicationShortcutsFrame = new PW.FrameBox(); + let defaultApplicationShortcuts = this._settings.get_default_value('application-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("ArcMenu Settings"), Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg', Constants.ArcMenuSettingsCommand]); + defaultApplicationShortcuts.push([_("Run Command..."), "system-run-symbolic", "ArcMenu_RunCommand"]); + defaultApplicationShortcuts.push([_("Show All Applications"), "view-fullscreen-symbolic", "ArcMenu_ShowAllApplications"]); + + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(frameRow._icon), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) { + this.newPinnedAppsArray.push(frameRow); + } + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + + defaultApplicationShortcutsFrame.add(frameRow); + + } + let notebook = new PW.Notebook(); + + let defaultAppsPage = new PW.NotebookPage(_("Default Apps")); + notebook.append_page(defaultAppsPage); + defaultAppsPage.append(defaultApplicationShortcutsFrame); + vbox.remove(pinnedAppsScrollWindow); + let systemAppsPage = new PW.NotebookPage(_("System Apps")); + notebook.append_page(systemAppsPage); + systemAppsPage.append(pinnedAppsScrollWindow); + systemAppsPage.prepend(searchBar); + + vbox.append(notebook); + vbox.append(addAppsButton); + } + else{ + this._loadCategories(); + let defaultAppsWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + defaultAppsWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + defaultAppsWindow.set_min_content_width(500); + defaultAppsWindow.set_min_content_width(500); + + let defaultApplicationShortcutsFrame = new PW.FrameBox(); + defaultAppsWindow.set_child(defaultApplicationShortcutsFrame); + let defaultApplicationShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"]); + defaultApplicationShortcuts.push([_("Network"), "ArcMenu_Network", "ArcMenu_Network"]); + defaultApplicationShortcuts.push([_("Trash"), "user-trash-symbolic", "ArcMenu_Trash"]); + defaultApplicationShortcuts.push([_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"]); + defaultApplicationShortcuts.push([_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"]); + defaultApplicationShortcuts.push([_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"]); + defaultApplicationShortcuts.push([_("Restart"), 'system-reboot-symbolic', "ArcMenu_Restart"]); + defaultApplicationShortcuts.push([_("Suspend"), "media-playback-pause-symbolic", "ArcMenu_Suspend"]); + defaultApplicationShortcuts.push([_("Hybrid Sleep"), Me.path + Constants.SleepIcon.PATH, "ArcMenu_HybridSleep"]); + defaultApplicationShortcuts.push([_("Hibernate"), "document-save-symbolic", "ArcMenu_Hibernate"]); + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(getIconPath(defaultApplicationShortcuts[i])), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + + let checkButton = new PW.Button({ + icon_name: 'list-add-symbolic' + }); + checkButton.margin_end = 20; + checkButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(frameRow._name, frameRow._icon, frameRow._cmd); + this.addResponse = true; + this.response(-10); + }); + frameRow.add(checkButton); + + defaultApplicationShortcutsFrame.add(frameRow); + + } + let notebook = new PW.Notebook(); + + let defaultAppsPage = new PW.NotebookPage(_("Presets")); + notebook.append_page(defaultAppsPage); + defaultAppsPage.append(defaultAppsWindow); + vbox.remove(pinnedAppsScrollWindow); + let systemAppsPage = new PW.NotebookPage(_("System Apps")); + notebook.append_page(systemAppsPage); + systemAppsPage.append(pinnedAppsScrollWindow); + systemAppsPage.prepend(searchBar); + + vbox.append(notebook); + } + } + + get_newPinnedAppsArray() { + return this.newPinnedAppsArray; + } + + get_response() { + return this.addResponse; + } + + _loadCategories(searchResults, showArcMenuSettings) { + let allApps = searchResults ? searchResults : Gio.app_info_get_all(); + allApps.sort((a, b) => { + let _a = a.get_display_name(); + let _b = b.get_display_name(); + return GLib.strcmp0(_a, _b); + }); + + let iter = -1; + if(searchResults) + iter = 0; + if(showArcMenuSettings) + iter = -1; + for(let i = iter; i < allApps.length; i++) { + if(i == -1 ? true : allApps[i].should_show()) { + let frameRow = new PW.FrameBoxRow(); + let icon; + if(i == -1){ + frameRow._name = _("ArcMenu Settings"); + icon = frameRow._icon = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + frameRow._cmd = Constants.ArcMenuSettingsCommand; + } + else{ + frameRow._app = allApps[i]; + frameRow._name = allApps[i].get_display_name(); + frameRow._icon = ''; + if(allApps[i].get_icon()) + icon = allApps[i].get_icon().to_string(); + else + icon = "dialog-information"; + + frameRow._cmd = allApps[i].get_id(); + } + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(icon), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + if(this._dialogType == Constants.DiaglogType.DEFAULT || this._dialogType == Constants.DiaglogType.APPLICATIONS|| + this._dialogType == Constants.DiaglogType.DIRECTORIES){ + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) + this.newPinnedAppsArray.push(frameRow); + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + } + else{ + let checkButton = new PW.Button({ + icon_name: 'list-add-symbolic' + }); + checkButton.margin_end = 20; + checkButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(frameRow._name, frameRow._icon, frameRow._cmd); + this.addResponse = true; + this.response(-10); + }); + frameRow.add(checkButton); + } + + this.appsFrame.add(frameRow); + } + } + } +}); + +var AddCustomLinkDialogWindow = GObject.registerClass( + class Arc_Menu_AddCustomLinkDialogWindow extends PW.DialogWindow { + _init(settings, parent, dialogType, isAppEdit=false, appArray=null) { + this._settings = settings; + this.newPinnedAppsArray=[]; + this.addResponse = false; + this.isAppEdit = isAppEdit; + this._dialogType = dialogType; + this.appArray = appArray; + if(this._dialogType == Constants.DiaglogType.DEFAULT) + super._init(isAppEdit?_('Edit Pinned App'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.OTHER) + super._init(isAppEdit?_('Edit Pinned App'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS) + super._init(isAppEdit?_('Edit Shortcut'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + super._init(isAppEdit?_('Edit Custom Shortcut'):_('Add a Custom Shortcut'), parent); + } + + _createLayout(vbox) { + let mainFrame = new PW.FrameBox(); + let nameFrameRow = new PW.FrameBoxRow(); + let nameFrameLabel = new Gtk.Label({ + label: _('Shortcut Name:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let nameEntry = new Gtk.Entry(); + nameEntry.set_width_chars(35); + nameFrameRow.add(nameFrameLabel); + nameFrameRow.add(nameEntry); + nameEntry.grab_focus(); + mainFrame.add(nameFrameRow); + + let iconFrameRow = new PW.FrameBoxRow(); + let iconFrameLabel = new Gtk.Label({ + label: _("Icon:"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let iconEntry = new Gtk.Entry(); + iconEntry.set_width_chars(35); + + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + let fileChooserButton = new Gtk.Button({ + label: _('Browse...') + }); + + fileChooserButton.connect('clicked', (widget) => { + let dialog = new Gtk.FileChooserDialog({ + title: _('Select an Icon'), + transient_for: this.get_root(), + modal: true, + action: Gtk.FileChooserAction.OPEN, + }); + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button("_Open", Gtk.ResponseType.ACCEPT); + + dialog.set_filter(fileFilter); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + let iconFilepath = dialog.get_file().get_path(); + iconEntry.set_text(iconFilepath); + dialog.destroy(); + } + else if(response === Gtk.ResponseType.CANCEL) + dialog.destroy(); + }) + + dialog.show(); + }); + + iconFrameRow.add(iconFrameLabel); + iconFrameRow.add(fileChooserButton); + iconFrameRow.add(iconEntry); + mainFrame.add(iconFrameRow); + if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + iconEntry.set_text("ArcMenu_Folder"); + + let cmdFrameRow = new PW.FrameBoxRow(); + let cmdFrameLabel = new Gtk.Label({ + label: _('Terminal Command:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + cmdFrameLabel.label = _("Shortcut Path:"); + let cmdEntry = new Gtk.Entry(); + cmdEntry.set_width_chars(35); + cmdFrameRow.add(cmdFrameLabel); + cmdFrameRow.add(cmdEntry); + mainFrame.add(cmdFrameRow); + + let addButton = new Gtk.Button({ + label: this.isAppEdit ?_("Apply") :_("Add") + }); + + if(this.appArray!=null) { + nameEntry.text=this.appArray[0]; + iconEntry.text=this.appArray[1]; + cmdEntry.text=this.appArray[2]; + } + addButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(nameEntry.get_text()); + this.newPinnedAppsArray.push(iconEntry.get_text()); + this.newPinnedAppsArray.push(cmdEntry.get_text()); + this.addResponse = true; + this.response(-10); + }); + addButton.set_halign(Gtk.Align.END); + + vbox.append(mainFrame); + vbox.append(addButton); + } + + get_newPinnedAppsArray(){ + return this.newPinnedAppsArray; + } + + get_response(){ + return this.addResponse; + } +}); + +var GeneralPage = GObject.registerClass( + class Arc_Menu_GeneralPage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let arcMenuPlacementHeader = new Gtk.Label({ + label: "" + _("Display Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(arcMenuPlacementHeader); + let menuPlacementFrame = new PW.FrameBox(); + this._createDisplayOnFrame(menuPlacementFrame, true); + this._settings.connect('changed::available-placement', ()=>{ + menuPlacementFrame.remove_all_children(); + this._createDisplayOnFrame(menuPlacementFrame, false); + menuPlacementFrame.show(); + }) + + this.mainBox.append(menuPlacementFrame); + + let hotCornerHeader = new Gtk.Label({ + label: "" + _("Hot Corner Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(hotCornerHeader); + + let modifyHotCornerFrame = new PW.FrameBox(); + let modifyHotCornerRow = new PW.FrameBoxRow(); + let modifyHotCornerLabel = new Gtk.Label({ + label: _("Modify Hot Corner"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let modifyHotCornerButton = new PW.Button({ + icon_name: 'emblem-system-symbolic', + }); + modifyHotCornerButton.connect('clicked', ()=> { + let dialog = new ModifyHotCornerDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', ()=> { + dialog.destroy(); + }); + }); + let modifyHotCornerSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + modifyHotCornerSwitch.set_active(this._settings.get_boolean('override-hot-corners')); + modifyHotCornerButton.set_sensitive(this._settings.get_boolean('override-hot-corners')); + modifyHotCornerSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('override-hot-corners',widget.get_active()); + modifyHotCornerButton.set_sensitive(widget.get_active()); + if(!widget.get_active()){ + this._settings.set_enum('hot-corners',Constants.HotCornerAction.DEFAULT); + } + }); + modifyHotCornerRow.add(modifyHotCornerLabel); + modifyHotCornerRow.add(modifyHotCornerButton); + modifyHotCornerRow.add(modifyHotCornerSwitch); + modifyHotCornerFrame.add(modifyHotCornerRow); + this.mainBox.append(modifyHotCornerFrame); + + let menuHotkeyHeader = new Gtk.Label({ + label: "" + _("Hotkey Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuHotkeyHeader); + + let menuHotKeyFrame = this._createHotkeyFrame(true); + this.mainBox.append(menuHotKeyFrame); + + let runnerHeaderLabel = new Gtk.Label({ + label: "" + _("Standalone Runner Menu") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(runnerHeaderLabel); + + let runnerHotkeyFrame = this._createHotkeyFrame(false); + this.mainBox.append(runnerHotkeyFrame); + } + + _createHotkeyFrame(isMenuHotkey){ + let hotkeyFrame = new PW.FrameBox(); + let enableRunnerMenuSwitch, hotkeyEnumSetting, customHotkeySetting, primaryMonitorSetting; + if(isMenuHotkey){ + hotkeyEnumSetting = 'menu-hotkey'; + customHotkeySetting = 'toggle-arcmenu'; + primaryMonitorSetting = 'hotkey-open-primary-monitor'; + } + else{ + hotkeyEnumSetting = 'runner-menu-hotkey'; + customHotkeySetting = 'toggle-runner-menu'; + primaryMonitorSetting = 'runner-hotkey-open-primary-monitor'; + let enableRunnerMenuRow = new PW.FrameBoxRow(); + let enableRunnerMenuLabel = new Gtk.Label({ + label: _("Enable a standalone Runner menu"), + use_markup: true, + xalign: 0, + hexpand: true + }); + enableRunnerMenuSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + enableRunnerMenuSwitch.set_active(this._settings.get_boolean('enable-standlone-runner-menu')); + enableRunnerMenuSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-standlone-runner-menu', widget.get_active()); + if(!widget.get_active()){ + hotkeyFrame.removeChildrenAfterIndex(0); + } + else{ + hotkeyFrame.add(hotkeyRow); + if(this._settings.get_enum(hotkeyEnumSetting) === 0) + hotkeyFrame.add(primaryMonitorRow); + if(this._settings.get_enum(hotkeyEnumSetting) === 1){ + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + } + } + }); + enableRunnerMenuRow.add(enableRunnerMenuLabel); + enableRunnerMenuRow.add(enableRunnerMenuSwitch); + hotkeyFrame.add(enableRunnerMenuRow); + } + + let hotkeyActivationRow = new PW.FrameBoxRow(); + let hotkeyActivationLabel = new Gtk.Label({ + label: _("Hotkey Activation"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotkeyActivationCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + hotkeyActivationCombo.append_text(_("Key Release")); + hotkeyActivationCombo.append_text(_("Key Press")); + if(this._settings.get_boolean('disable-hotkey-onkeyrelease')) + hotkeyActivationCombo.set_active(1); + else + hotkeyActivationCombo.set_active(0); + hotkeyActivationCombo.connect('changed', (widget) => { + if(widget.get_active() === 0) + this._settings.set_boolean('disable-hotkey-onkeyrelease',false); + if(widget.get_active() === 1) + this._settings.set_boolean('disable-hotkey-onkeyrelease',true); + }); + + hotkeyActivationRow.add(hotkeyActivationLabel); + hotkeyActivationRow.add(hotkeyActivationCombo); + + let primaryMonitorRow = new PW.FrameBoxRow(); + let primaryMonitorLabel = new Gtk.Label({ + label: _("Open on Primary Monitor"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let primaryMonitorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + primaryMonitorSwitch.set_active(this._settings.get_boolean(primaryMonitorSetting)); + primaryMonitorSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(primaryMonitorSetting, widget.get_active()); + }); + primaryMonitorRow.add(primaryMonitorLabel); + primaryMonitorRow.add(primaryMonitorSwitch); + + + let hotkeyRow = new PW.FrameBoxRow(); + let hotkeyLabel = new Gtk.Label({ + label: isMenuHotkey ? _("Menu Hotkey") : _("Runner Hotkey"), + use_markup: true, + xalign: 0, + hexpand: true + }); + hotkeyRow.add(hotkeyLabel); + + let hotkeyCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + if(isMenuHotkey) + hotkeyCombo.append("NONE", _("None")); + hotkeyCombo.append("SUPER_L", _("Left Super Key")); + hotkeyCombo.append("CUSTOM", _("Custom Hotkey")); + hotkeyCombo.set_active(this._settings.get_enum(hotkeyEnumSetting)); + hotkeyCombo.connect('changed', (widget) => { + let removeIndex = isMenuHotkey ? 0 : 1; + if(widget.get_active_id() === "NONE"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + } + else if(widget.get_active_id() === "SUPER_L"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + hotkeyFrame.add(primaryMonitorRow); + } + else if(widget.get_active_id() === "CUSTOM"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + hotkeyFrame.show(); + } + this._settings.set_enum(hotkeyEnumSetting, widget.get_active()); + }); + hotkeyRow.add(hotkeyCombo); + + hotkeyFrame.add(hotkeyRow); + + let customHotkeyRow = new PW.FrameBoxRow(); + let currentHotkeyLabel = new Gtk.Label( { + label: _("Current Hotkey"), + use_markup: true, + xalign: 0, + hexpand: false + }); + + let shortcutCell = new Gtk.ShortcutsShortcut({ + halign: Gtk.Align.START, + hexpand: true, + }); + shortcutCell.accelerator = this._settings.get_strv(customHotkeySetting).toString(); + + let modifyHotkeyButton = new Gtk.Button({ + label: _("Modify Hotkey"), + halign: Gtk.Align.END, + hexpand: false, + }); + customHotkeyRow.add(currentHotkeyLabel); + customHotkeyRow.add(shortcutCell); + customHotkeyRow.add(modifyHotkeyButton); + modifyHotkeyButton.connect('clicked', () => { + let dialog = new CustomHotkeyDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', () => { + let customHotKeyEnum = isMenuHotkey ? 2 : 1; + if(dialog.addResponse) { + this._settings.set_enum(hotkeyEnumSetting, 0); + this._settings.set_strv(customHotkeySetting, [dialog.resultsText]); + this._settings.set_enum(hotkeyEnumSetting, customHotKeyEnum); + shortcutCell.accelerator = dialog.resultsText; + dialog.destroy(); + } + else { + shortcutCell.accelerator = this._settings.get_strv(customHotkeySetting).toString(); + this._settings.set_enum(hotkeyEnumSetting, customHotKeyEnum); + dialog.destroy(); + } + }); + }); + + if(hotkeyCombo.get_active_id() === "SUPER_L"){ + hotkeyFrame.add(primaryMonitorRow); + } + else if(hotkeyCombo.get_active_id() === "CUSTOM"){ + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + } + + if(!isMenuHotkey && !enableRunnerMenuSwitch.get_active()) + hotkeyFrame.removeChildrenAfterIndex(0); + return hotkeyFrame; + } + + _createDisplayOnFrame(menuPlacementFrame, setComboBox){ + let menuPlacementRow = new PW.FrameBoxRow(); + let menuPlacementLabel = new Gtk.Label({ + label: _("Display ArcMenu On"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuPlacementCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + + let avaliablePlacement = this._settings.get_value('available-placement').deep_unpack(); + let dashExtensionName = _("Dash to Dock"); + let gnomeSettings = Gio.Settings.new("org.gnome.shell"); + let enabledExtensions = gnomeSettings.get_strv('enabled-extensions'); + if (enabledExtensions.includes('ubuntu-dock@ubuntu.com')) { + dashExtensionName = _("Ubuntu Dock"); + } + + menuPlacementCombo.append_text(_("Main Panel")); + menuPlacementCombo.append_text(_("Dash to Panel")); + menuPlacementCombo.append_text(dashExtensionName); + + menuPlacementRow.add(menuPlacementLabel); + menuPlacementRow.add(menuPlacementCombo); + menuPlacementFrame.add(menuPlacementRow); + + let dashToDockWarningRow = new PW.FrameBoxRow(); + let dashToDockWarningLabel = new Gtk.Label({ + label: _("Dash to Dock extension not running!") + "\n" + _("Enable Dash to Dock for this feature to work."), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let showActivitiesRow = new PW.FrameBoxRow(); + let showActivitiesLabel = new Gtk.Label({ + label: _("Show Activities Button"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let showActivitiesSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + showActivitiesSwitch.set_active(this._settings.get_boolean('show-activities-button')); + showActivitiesSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('show-activities-button', widget.get_active()); + }); + showActivitiesRow.add(showActivitiesLabel); + showActivitiesRow.add(showActivitiesSwitch); + + let warningImage = new Gtk.Image({ + icon_name: 'warning-symbolic', + pixel_size: 24 + }); + let warningImageBox = new Gtk.Box({ + margin_top: 0, + margin_bottom: 0, + margin_start: 10 + }); + warningImageBox.append(warningImage); + + if(!avaliablePlacement[Constants.ArcMenuPlacement.DASH]){ + dashToDockWarningRow.add(warningImageBox); + } + dashToDockWarningRow.add(dashToDockWarningLabel); + + let panelWarningRow = new PW.FrameBoxRow(); + let panelWarningLabel = new Gtk.Label({ + label: avaliablePlacement[Constants.ArcMenuPlacement.DTP] ? _("Main Panel not found!") : + _("Dash to Panel extension not running!") + "\n" + _("Enable Dash to Panel for this feature to work."), + use_markup: true, + xalign: 0, + hexpand: true + }); + let panelWarningImage = new Gtk.Image({ + icon_name: 'warning-symbolic', + pixel_size: 24 + }); + let panelWarningImageBox = new Gtk.Box({ + margin_top: 0, + margin_bottom: 0, + margin_start: 10 + }); + panelWarningImageBox.append(panelWarningImage); + panelWarningRow.add(panelWarningImageBox); + panelWarningRow.add(panelWarningLabel); + + let menuPositionRow = new PW.FrameBoxRow(); + let menuPositionBoxLabel = new Gtk.Label({ + label: _("Position in Panel"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let menuPositionCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + + menuPositionCombo.append_text(_('Left')); + menuPositionCombo.append_text(_('Center')); + menuPositionCombo.append_text(_('Right')); + menuPositionCombo.set_active(this._settings.get_enum('position-in-panel')); + menuPositionCombo.connect('changed', (widget) => { + if(widget.get_active() === Constants.MenuPosition.LEFT){ + if(menuPlacementFrame.get_index(2) === menuPositionAdjustmentRow) + menuPlacementFrame.remove(menuPositionAdjustmentRow); + } + else if(widget.get_active() === Constants.MenuPosition.CENTER){ + if(menuPlacementFrame.get_index(2) != menuPositionAdjustmentRow){ + menuPlacementFrame.insert(menuPositionAdjustmentRow, 2); + menuPlacementFrame.show(); + } + } + else if(widget.get_active() === Constants.MenuPosition.RIGHT){ + if(menuPlacementFrame.get_index(2) === menuPositionAdjustmentRow) + menuPlacementFrame.remove(menuPositionAdjustmentRow); + } + this._settings.set_enum('position-in-panel', widget.get_active()); + }); + + menuPositionRow.add(menuPositionBoxLabel); + menuPositionRow.add(menuPositionCombo); + + let menuPositionAdjustmentRow = new PW.FrameBoxRow(); + let menuPositionAdjustmentLabel = new Gtk.Label({ + label: _("Menu Alignment"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let alignmentScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 100, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + }); + alignmentScale.add_mark(0, Gtk.PositionType.BOTTOM, _("Left")); + alignmentScale.add_mark(50, Gtk.PositionType.BOTTOM, _("Center")); + alignmentScale.add_mark(100, Gtk.PositionType.BOTTOM, _("Right")); + + alignmentScale.set_value(this._settings.get_int('menu-position-alignment')); + alignmentScale.connect('value-changed', (widget) => { + this._settings.set_int('menu-position-alignment', widget.get_value()); + }); + menuPositionAdjustmentRow.add(menuPositionAdjustmentLabel); + menuPositionAdjustmentRow.add(alignmentScale); + + let multiMonitorRow = new PW.FrameBoxRow(); + let multiMonitorLabel = new Gtk.Label({ + label: _("Display ArcMenu on all monitors"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let multiMonitorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + multiMonitorSwitch.set_active(this._settings.get_boolean('multi-monitor')); + multiMonitorSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('multi-monitor', widget.get_active()); + }); + + multiMonitorRow.add(multiMonitorLabel); + multiMonitorRow.add(multiMonitorSwitch); + + menuPlacementCombo.connect('changed', (widget) => { + let placement = widget.get_active(); + this._settings.set_enum('arc-menu-placement', placement); + menuPlacementFrame.remove_all_children(); + menuPlacementFrame.add(menuPlacementRow); + if(menuPlacementCombo.get_active() == Constants.ArcMenuPlacement.PANEL){ + if(avaliablePlacement[Constants.ArcMenuPlacement.PANEL] === false){ + menuPlacementFrame.add(panelWarningRow); + } + else{ + menuPlacementFrame.add(menuPositionRow); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER) + menuPlacementFrame.add(menuPositionAdjustmentRow); + if(avaliablePlacement[Constants.ArcMenuPlacement.DTP]) + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + menuPlacementFrame.show(); + } + else if(menuPlacementCombo.get_active() == Constants.ArcMenuPlacement.DTP){ + if(avaliablePlacement[Constants.ArcMenuPlacement.DTP]){ + menuPlacementFrame.add(menuPositionRow); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER) + menuPlacementFrame.add(menuPositionAdjustmentRow); + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + else + menuPlacementFrame.add(panelWarningRow); + + menuPlacementFrame.show(); + } + else{ + if(avaliablePlacement[Constants.ArcMenuPlacement.DASH]){ + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + else + menuPlacementFrame.add(dashToDockWarningRow); + + menuPlacementFrame.show(); + } + }); + let placement = this._settings.get_enum('arc-menu-placement'); + if(setComboBox){ + if(placement == Constants.ArcMenuPlacement.PANEL && !avaliablePlacement[Constants.ArcMenuPlacement.PANEL]) + menuPlacementCombo.set_active(Constants.ArcMenuPlacement.DTP); + else if(placement == Constants.ArcMenuPlacement.DTP && !avaliablePlacement[Constants.ArcMenuPlacement.DTP]) + menuPlacementCombo.set_active(Constants.ArcMenuPlacement.PANEL); + else + menuPlacementCombo.set_active(placement); + } + else + menuPlacementCombo.set_active(placement); + } +}); + +var ModifyHotCornerDialogWindow = GObject.registerClass( + class Arc_Menu_ModifyHotCornerDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + super._init(_('Modify Hot Corner'), parent); + this.set_default_size(600,250); + } + + _createLayout(vbox) { + let modifyHotCornerFrame = new PW.FrameBox(); + let modifyHotCornerRow = new PW.FrameBoxRow(); + let modifyHotCornerLabel = new Gtk.Label({ + label: _("Hot Corner Action"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotCornerActionCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + hotCornerActionCombo.append_text(_("GNOME Default")); + hotCornerActionCombo.append_text(_("Disabled")); + hotCornerActionCombo.append_text(_("Open ArcMenu")); + hotCornerActionCombo.append_text(_("Custom")); + + let customHotCornerFrame = new PW.FrameBox(); + let customHeaderHotCornerRow = new PW.FrameBoxRow(); + + let customHeaderHotCornerLabel = new Gtk.Label({ + label: ""+_("Custom Hot Corner Action") + "\n" + _("Choose from a list of preset commands or use your own terminal command"), + use_markup: true, + xalign: 0, + hexpand: true + }); + customHeaderHotCornerRow.add(customHeaderHotCornerLabel); + + let presetCustomHotCornerRow = new PW.FrameBoxRow(); + let presetCustomHotCornerLabel = new Gtk.Label({ + label: _("Preset commands"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotCornerPresetsCombo = new Gtk.ComboBoxText({ + hexpand: true + }); + + hotCornerPresetsCombo.append_text(_("Show all Applications")); + hotCornerPresetsCombo.append_text(_("GNOME Terminal")); + hotCornerPresetsCombo.append_text(_("GNOME System Monitor")); + hotCornerPresetsCombo.append_text(_("GNOME Calculator")); + hotCornerPresetsCombo.append_text(_("GNOME gedit")); + hotCornerPresetsCombo.append_text(_("GNOME Screenshot")); + hotCornerPresetsCombo.append_text(_("GNOME Weather")); + hotCornerPresetsCombo.append_text(_("Run Command...")); + hotCornerPresetsCombo.connect('changed', (widget) => { + if(widget.get_active() === 0) + customHotCornerEntry.set_text("ArcMenu_ShowAllApplications"); + else if(widget.get_active() === 1) + customHotCornerEntry.set_text("gnome-terminal"); + else if(widget.get_active() === 2) + customHotCornerEntry.set_text("gnome-system-monitor"); + else if(widget.get_active() === 3) + customHotCornerEntry.set_text("gnome-calculator"); + else if(widget.get_active() === 4) + customHotCornerEntry.set_text("gedit"); + else if(widget.get_active() === 5) + customHotCornerEntry.set_text("gnome-screenshot"); + else if(widget.get_active() === 6) + customHotCornerEntry.set_text("gnome-weather"); + else if(widget.get_active() === 7) + customHotCornerEntry.set_text("ArcMenu_RunCommand"); + }); + presetCustomHotCornerRow.add(presetCustomHotCornerLabel); + presetCustomHotCornerRow.add(hotCornerPresetsCombo); + + let customHotCornerRow = new PW.FrameBoxRow(); + let customHotCornerLabel = new Gtk.Label({ + label: _("Terminal Command"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let customHotCornerEntry = new Gtk.Entry({ + }); + customHotCornerEntry.set_text(this._settings.get_string('custom-hot-corner-cmd')); + customHotCornerEntry.connect('changed', (widget) => { + applyButton.set_sensitive(true); + let index = this.checkIfMatch(customHotCornerEntry.get_text()); + hotCornerPresetsCombo.set_active(index) + }); + customHotCornerEntry.set_width_chars(40); + + let index = this.checkIfMatch(customHotCornerEntry.get_text()); + hotCornerPresetsCombo.set_active(index) + customHotCornerRow.add(customHotCornerLabel); + customHotCornerRow.add(customHotCornerEntry); + + customHotCornerFrame.add(customHeaderHotCornerRow); + customHotCornerFrame.add(presetCustomHotCornerRow); + customHotCornerFrame.add(customHotCornerRow); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + }); + applyButton.connect('clicked', () => { + this._settings.set_string('custom-hot-corner-cmd',customHotCornerEntry.get_text()); + this._settings.set_enum('hot-corners',hotCornerActionCombo.get_active()); + applyButton.set_sensitive(false); + this.addResponse = true; + this.response(-10); + }); + applyButton.set_halign(Gtk.Align.END); + applyButton.set_sensitive(false); + + + let hotCornerAction = this._settings.get_enum('hot-corners'); + hotCornerActionCombo.set_active(hotCornerAction); + hotCornerActionCombo.connect('changed', (widget) => { + applyButton.set_sensitive(true); + if(widget.get_active()==Constants.HotCornerAction.CUSTOM){ + customHotCornerFrame.set_sensitive(true); + } + else{ + customHotCornerFrame.set_sensitive(false); + } + }); + + modifyHotCornerRow.add(modifyHotCornerLabel); + modifyHotCornerRow.add(hotCornerActionCombo); + modifyHotCornerFrame.add(modifyHotCornerRow); + if(hotCornerActionCombo.get_active() == Constants.HotCornerAction.CUSTOM) + customHotCornerFrame.set_sensitive(true); + else + customHotCornerFrame.set_sensitive(false); + vbox.append(modifyHotCornerFrame); + vbox.append(customHotCornerFrame); + vbox.append(applyButton); + } + checkIfMatch(text){ + if(text === "ArcMenu_ShowAllApplications") + return 0; + else if(text === "gnome-terminal") + return 1; + else if(text === "gnome-system-monitor") + return 2; + else if(text === "gnome-calculator") + return 3; + else if(text === "gedit") + return 4; + else if(text === "gnome-screenshot") + return 5; + else if(text === "gnome-weather") + return 6; + else if(text === "ArcMenu_RunCommand") + return 7; + else + return -1; + } +}); + +var CustomHotkeyDialogWindow = GObject.registerClass({ + Signals: { + 'response': { param_types: [GObject.TYPE_INT] }, + }, +}, + class Arc_Menu_CustomHotkeyDialogWindow extends Gtk.Window { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + this.keyEventController = new Gtk.EventControllerKey(); + + super._init({ + modal: true, + title: _("Set Custom Hotkey"), + transient_for: parent.get_root() + }); + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + hexpand: true, + halign: Gtk.Align.FILL + }); + this.set_child(vbox); + this._createLayout(vbox); + this.add_controller(this.keyEventController); + this.set_size_request(500, 250); + } + + _createLayout(vbox) { + let hotkeyKey = ''; + + let modLabel = new Gtk.Label({ + label:_("Choose Modifiers"), + use_markup: true, + hexpand: true, + halign: Gtk.Align.START + }); + let modFrame = new PW.FrameBox(); + let modRow = new PW.FrameBoxRow(); + modRow.add(modLabel); + + let buttonBox = new Gtk.Box({ + hexpand: true, + halign: Gtk.Align.END, + spacing: 5 + }); + modRow.add(buttonBox); + let ctrlButton = new Gtk.ToggleButton({ + label: _("Ctrl") + }); + let superButton = new Gtk.ToggleButton({ + label: _("Super") + }); + let shiftButton = new Gtk.ToggleButton({ + label: _("Shift") + }); + let altButton = new Gtk.ToggleButton({ + label: _("Alt") + }); + ctrlButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + superButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + shiftButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + altButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + buttonBox.append(ctrlButton); + buttonBox.append(superButton); + buttonBox.append(shiftButton); + buttonBox.append(altButton); + modFrame.add(modRow); + vbox.append(modFrame); + + let keyFrame = new PW.FrameBox(); + let keyLabel = new Gtk.Label({ + label: _("Press any key"), + use_markup: true, + xalign: .5, + hexpand: true, + halign: Gtk.Align.CENTER + }); + vbox.append(keyLabel); + let pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/keyboard-symbolic.svg', 256, 72); + let keyboardImage = Gtk.Picture.new_for_pixbuf(pixbuf); + keyboardImage.hexpand = true; + keyboardImage.vexpand = true; + keyboardImage.halign = Gtk.Align.CENTER; + keyboardImage.valign = Gtk.Align.CENTER; + vbox.append(keyboardImage) + + let resultsRow = new PW.FrameBoxRow(); + let resultsLabel = new Gtk.Label({ + label: _("New Hotkey"), + use_markup: true, + xalign: .5, + hexpand: false, + halign: Gtk.Align.START + }); + let resultsWidget = new Gtk.ShortcutsShortcut({ + hexpand: true, + halign: Gtk.Align.END + }); + resultsRow.add(resultsLabel); + resultsRow.add(resultsWidget); + keyFrame.add(resultsRow); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + halign: Gtk.Align.END + }); + applyButton.connect('clicked', () => { + this.addResponse = true; + this.emit("response", -10); + }); + applyButton.set_sensitive(false); + + this.keyEventController.connect('key-released', (controller, keyval, keycode, state) => { + this.resultsText = ""; + let key = keyval; + hotkeyKey = Gtk.accelerator_name(key, 0); + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += Gtk.accelerator_name(key,0); + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + + vbox.append(keyFrame); + vbox.append(applyButton); + } +}); + +function getIconPixbuf(filePath){ + if (GLib.file_test(filePath, GLib.FileTest.EXISTS)) + return GdkPixbuf.Pixbuf.new_from_file_at_size(filePath, 25, 25); + else + return null; +} + +var ButtonAppearancePage = GObject.registerClass( + class Arc_Menu_ButtonAppearancePage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + this.menuButtonColor = this._settings.get_string('menu-button-color'); + this.menuButtonHoverColor = this._settings.get_string('menu-button-hover-color'); + this.menuButtonActiveColor = this._settings.get_string('menu-button-active-color'); + this.menuButtonHoverBackgroundcolor = this._settings.get_string('menu-button-hover-backgroundcolor'); + this.menuButtonActiveBackgroundcolor = this._settings.get_string('menu-button-active-backgroundcolor'); + this._createLayout(this.mainBox); + } + + _createLayout(vbox) { + this.arcMenuPlacement = this._settings.get_enum('arc-menu-placement'); + let menuButtonAppearanceHeaderLabel = new Gtk.Label({ + label: "" + _('Menu Button Appearance') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonAppearanceHeaderLabel); + + let menuButtonAppearanceFrame = new PW.FrameBox(); + let menuButtonAppearanceRow = new PW.FrameBoxRow(); + let menuButtonAppearanceLabel = new Gtk.Label({ + label: _('Appearance'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonAppearanceCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + menuButtonAppearanceCombo.append_text(_("Icon")); + menuButtonAppearanceCombo.append_text(_("Text")); + menuButtonAppearanceCombo.append_text(_("Icon and Text")); + menuButtonAppearanceCombo.append_text(_("Text and Icon")); + menuButtonAppearanceCombo.append_text(_("Hidden")); + menuButtonAppearanceCombo.set_active(this._settings.get_enum('menu-button-appearance')); + menuButtonAppearanceCombo.connect('changed', (widget) => { + this.resetButton.set_sensitive(true); + menuButtonAppearanceFrame.removeChildrenAfterIndex(0); + if(widget.get_active() === Constants.MenuButtonAppearance.NONE){ + menuButtonAppearanceFrame.show(); + } + else if(widget.get_active() === Constants.MenuButtonAppearance.ICON){ + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + if (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + menuButtonAppearanceFrame.show(); + } + else if(widget.get_active() === Constants.MenuButtonAppearance.ICON_TEXT || widget.get_active() === Constants.MenuButtonAppearance.TEXT_ICON || + widget.get_active() === Constants.MenuButtonAppearance.TEXT){ + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + if (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + menuButtonAppearanceFrame.add(menuButtonCustomTextBoxRow); + menuButtonAppearanceFrame.show(); + } + this._settings.set_enum('menu-button-appearance', widget.get_active()); + }); + + menuButtonAppearanceRow.add(menuButtonAppearanceLabel); + menuButtonAppearanceRow.add(menuButtonAppearanceCombo); + menuButtonAppearanceFrame.add(menuButtonAppearanceRow); + + let menuButtonArrowIconBoxRow = new PW.FrameBoxRow(); + let menuButtonArrowIconLabel = new Gtk.Label({ + label: _('Show Arrow'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let enableArrowIconSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + enableArrowIconSwitch.set_active(this._settings.get_boolean('enable-menu-button-arrow')); + enableArrowIconSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-menu-button-arrow', widget.get_active()); + this.resetButton.set_sensitive(true); + }); + + menuButtonArrowIconBoxRow.add(menuButtonArrowIconLabel); + menuButtonArrowIconBoxRow.add(enableArrowIconSwitch); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + + let menuButtonPaddingRow = new PW.FrameBoxRow(); + let menuButtonPadding = this._settings.get_int('button-padding'); + let menuButtonPaddingLabel = new Gtk.Label({ + label: _('Menu Button Padding'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let paddingScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -1, + upper: 25, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + paddingScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + paddingScale.add_mark(-1, Gtk.PositionType.TOP, _("Default")); + paddingScale.set_value(menuButtonPadding); + paddingScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('button-padding', paddingScale.get_value()); + this._settings.set_boolean('reload-theme', true); + }); + + menuButtonPaddingRow.add(menuButtonPaddingLabel); + menuButtonPaddingRow.add(paddingScale); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + + ///// Row for menu button offset ///// + let menuButtonOffsetRow = new PW.FrameBoxRow(); + let menuButtonOffset = this._settings.get_int('menu-button-position-offset'); + let menuButtonOffsetLabel = new Gtk.Label({ + label: _('Menu Button Position'), + use_markup: true, + xalign: 0, + hexpand: true, + }); + let offsetScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 10, // arbitrary value + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + offsetScale.add_mark(0, Gtk.PositionType.TOP, _("Default")); // offset 0 is default + offsetScale.add_mark(1, Gtk.PositionType.TOP, null); + offsetScale.add_mark(2, Gtk.PositionType.TOP, null); + offsetScale.set_value(menuButtonOffset); + offsetScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('menu-button-position-offset', offsetScale.get_value()); + }); + menuButtonOffsetRow.add(menuButtonOffsetLabel); + menuButtonOffsetRow.add(offsetScale); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE && + (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP)) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + //////////////////// + + let menuButtonCustomTextBoxRow = new PW.FrameBoxRow(); + let menuButtonCustomTextLabel = new Gtk.Label({ + label: _('Text'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonCustomTextEntry = new Gtk.Entry({ halign: Gtk.Align.END }); + menuButtonCustomTextEntry.set_width_chars(30); + menuButtonCustomTextEntry.set_text(this._settings.get_string('custom-menu-button-text')); + menuButtonCustomTextEntry.connect('changed', (widget) => { + this.resetButton.set_sensitive(true); + let customMenuButtonText = widget.get_text(); + this._settings.set_string('custom-menu-button-text', customMenuButtonText); + }); + + menuButtonCustomTextBoxRow.add(menuButtonCustomTextLabel); + menuButtonCustomTextBoxRow.add(menuButtonCustomTextEntry); + if(this._settings.get_enum('menu-button-appearance') != Constants.MenuButtonAppearance.ICON && this._settings.get_enum('menu-button-appearance') != Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonCustomTextBoxRow); + vbox.append(menuButtonAppearanceFrame); + + let menuButtonIconHeaderLabel = new Gtk.Label({ + label: "" + _('Icon Appearance') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonIconHeaderLabel); + + let menuButtonIconFrame = new PW.FrameBox(); + let menuButtonIconRow = new PW.FrameBoxRow(); + let menuButtonIconLabel = new Gtk.Label({ + label: _('Icon'), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let menuButtonIconButton = new PW.Button({ + title: _("Browse Icons") + " ", + icon_name: 'icon-preview-symbolic', + hexpand: false, + }); + menuButtonIconButton.connect('clicked', () => { + let dialog = new ArcMenuIconsDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', ()=> { + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + dialog.destroy(); + }); + }); + + menuButtonIconRow.add(menuButtonIconLabel); + menuButtonIconRow.add(menuButtonIconButton); + menuButtonIconFrame.add(menuButtonIconRow); + + let menuButtonIconSizeRow = new PW.FrameBoxRow(); + let iconSize = this._settings.get_double('custom-menu-button-icon-size'); + let menuButtonIconSizeLabel = new Gtk.Label({ + label: _('Icon Size'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonIconSizeScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 14, + upper: 64, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuButtonIconSizeScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + menuButtonIconSizeScale.set_value(iconSize); + menuButtonIconSizeScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_double('custom-menu-button-icon-size', menuButtonIconSizeScale.get_value()); + }); + + menuButtonIconSizeRow.add(menuButtonIconSizeLabel); + menuButtonIconSizeRow.add(menuButtonIconSizeScale); + menuButtonIconFrame.add(menuButtonIconSizeRow); + + vbox.append(menuButtonIconFrame); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + halign: Gtk.Align.START, + hexpand: true, + valign: Gtk.Align.END, + vexpand: true + }); + + let menuButtonColorHeaderLabel = new Gtk.Label({ + label: "" + _('Menu Button Styling') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonColorHeaderLabel); + + this.menuButtonIconColorFrame = new PW.FrameBox(); + + let[menuButtonColorSwitch, menuButtonColorChooser] = this.newColorChooserRow({ + color: this.menuButtonColor, + label: _("Color"), + settingColorName: 'menu-button-color', + settingOverrideName: 'override-menu-button-color', + }); + + let[menuButtonHoverColorSwitch, menuButtonHoverColorChooser] = this.newColorChooserRow({ + color: this.menuButtonHoverColor, + label: _("Hover Color"), + settingColorName: 'menu-button-hover-color', + settingOverrideName: 'override-menu-button-hover-color', + }); + + let[menuButtonActiveColorSwitch, menuButtonActiveColorChooser] = this.newColorChooserRow({ + color: this.menuButtonActiveColor, + label: _("Active Color"), + settingColorName: 'menu-button-active-color', + settingOverrideName: 'override-menu-button-active-color', + }); + + let[menuButtonHoverBackgroundcolorSwitch, menuButtonHoverBackgroundcolorChooser] = this.newColorChooserRow({ + color: this.menuButtonHoverBackgroundcolor, + label: _("Hover Background Color"), + settingColorName: 'menu-button-hover-backgroundcolor', + settingOverrideName: 'override-menu-button-hover-background-color', + }); + + let[menuButtonActiveBackgroundcolorSwitch, menuButtonActiveBackgroundcolorChooser] = this.newColorChooserRow({ + color: this.menuButtonActiveBackgroundcolor, + label: _("Active Background Color"), + settingColorName: 'menu-button-active-backgroundcolor', + settingOverrideName: 'override-menu-button-active-background-color', + }); + + let roundedCornersRow = new PW.FrameBoxRow(); + + let roundedCornersLabel = new Gtk.Label({ + label: _("Override Border Radius"), + xalign:0, + hexpand: true, + }); + let roundedCornersSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + active: this._settings.get_boolean('menu-button-override-border-radius') + }); + roundedCornersSwitch.connect("notify::active", (widget)=> { + this.resetButton.set_sensitive(true); + this._settings.set_boolean('menu-button-override-border-radius', widget.get_active()) + this._settings.set_boolean('reload-theme', true); + menuButtonBorderRadiusRow.set_sensitive(widget.get_active()); + }); + + roundedCornersRow.add(roundedCornersLabel); + roundedCornersRow.add(roundedCornersSwitch); + + this.menuButtonIconColorFrame.add(roundedCornersRow); + + let menuButtonBorderRadiusRow = new PW.FrameBoxRow(); + let borderRadius = this._settings.get_int('menu-button-border-radius'); + let menuButtonBorderRadiusLabel = new Gtk.Label({ + label: _('Border Radius'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonBorderRadiusScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 20, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuButtonBorderRadiusScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + menuButtonBorderRadiusScale.set_value(borderRadius); + menuButtonBorderRadiusScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('menu-button-border-radius', menuButtonBorderRadiusScale.get_value()); + this._settings.set_boolean('reload-theme', true); + }); + + menuButtonBorderRadiusRow.add(menuButtonBorderRadiusLabel); + menuButtonBorderRadiusRow.add(menuButtonBorderRadiusScale); + menuButtonBorderRadiusRow.set_sensitive(this._settings.get_boolean('menu-button-override-border-radius')); + this.menuButtonIconColorFrame.add(menuButtonBorderRadiusRow); + + vbox.append(this.menuButtonIconColorFrame); + + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + menuButtonAppearanceCombo.set_active(0); + menuButtonCustomTextEntry.set_text('Applications'); + paddingScale.set_value(-1); + menuButtonIconSizeScale.set_value(20); + let colorParse = new Gdk.RGBA(); + colorParse.parse('rgb(240,240,240)'); + menuButtonActiveColorChooser.set_rgba(colorParse); + menuButtonColorChooser.set_rgba(colorParse); + colorParse.parse('rgb(214,214,214)'); + menuButtonHoverColorChooser.set_rgba(colorParse); + colorParse.parse('rgba(238,238,236,0.1)'); + menuButtonHoverBackgroundcolorChooser.set_rgba(colorParse); + colorParse.parse('rgba(238,238,236,0.18)'); + menuButtonActiveBackgroundcolorChooser.set_rgba(colorParse); + enableArrowIconSwitch.set_active(false); + menuButtonColorSwitch.set_active(false); + menuButtonHoverColorSwitch.set_active(false); + menuButtonActiveColorSwitch.set_active(false); + menuButtonHoverBackgroundcolorSwitch.set_active(false); + menuButtonActiveBackgroundcolorSwitch.set_active(false); + roundedCornersSwitch.set_active(false); + menuButtonBorderRadiusScale.set_value(0); + offsetScale.set_value(0); + this._settings.reset('menu-button-icon'); + this._settings.reset('arc-menu-icon'); + this._settings.reset('distro-icon'); + this._settings.reset('custom-menu-button-icon'); + this._settings.reset('menu-button-hover-color'); + this._settings.reset('menu-button-active-color'); + this._settings.reset('menu-button-hover-backgroundcolor'); + this._settings.reset('menu-button-active-backgroundcolor'); + this._settings.reset('menu-button-color'); + this._settings.reset('override-menu-button-hover-color'); + this._settings.reset('override-menu-button-active-color'); + this._settings.reset('override-menu-button-hover-background-color'); + this._settings.reset('override-menu-button-active-background-color'); + this._settings.reset('override-menu-button-color'); + this._settings.reset('menu-button-override-border-radius'); + this._settings.reset('menu-button-border-radius'); + this._settings.reset('menu-button-position-offset'); + this._settings.set_boolean('reload-theme', true); + + this.resetButton.set_sensitive(false); + }); + vbox.append(this.resetButton); + } + + newColorChooserRow(params){ + let colorParse = new Gdk.RGBA(); + let colorRow = new PW.FrameBoxRow(); + let buttonsGrid = new Gtk.Grid({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }); + + let colorLabel = new Gtk.Label({ + label: params.label, + xalign:0, + hexpand: true, + }); + let colorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + active: this._settings.get_boolean(params.settingOverrideName) + }); + colorSwitch.connect("notify::active", (widget)=> { + this.resetButton.set_sensitive(true); + this._settings.set_boolean(params.settingOverrideName, widget.get_active()) + colorChooser.sensitive = widget.get_active(); + this._settings.set_boolean('reload-theme', true); + }); + + let colorChooser = new Gtk.ColorButton({ + use_alpha: true, + sensitive: colorSwitch.get_active() + }); + + colorParse.parse(params.color); + colorChooser.set_rgba(colorParse); + + colorChooser.connect('color-set', ()=>{ + this.resetButton.set_sensitive(true); + params.color = colorChooser.get_rgba().to_string(); + this._settings.set_string(params.settingColorName, params.color); + this._settings.set_boolean('reload-theme', true); + }); + + colorRow.add(colorLabel); + buttonsGrid.attach(colorSwitch, 0, 0, 1, 1); + buttonsGrid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 1, 0, 1, 1); + buttonsGrid.attach(colorChooser, 2, 0, 1, 1); + colorRow.add(buttonsGrid); + this.menuButtonIconColorFrame.add(colorRow); + return [colorSwitch, colorChooser]; + } + + checkIfResetButtonSensitive(){ + if( this._settings.get_string('menu-button-hover-backgroundcolor') != 'rgba(238,238,236,0.1)' || + this._settings.get_string('menu-button-active-backgroundcolor') != 'rgba(238,238,236,0.18)' || + this._settings.get_string('menu-button-active-color') != 'rgb(240,240,240)' || + this._settings.get_string('menu-button-hover-color') != 'rgb(214,214,214)' || + this._settings.get_string('menu-button-color') != 'rgb(240,240,240)' || + this._settings.get_double('custom-menu-button-icon-size') != 20 || + this._settings.get_int('button-padding') != -1 || + this._settings.get_enum('menu-button-icon') != 0 || + this._settings.get_int('arc-menu-icon') != 0 || + this._settings.get_string('custom-menu-button-text') != 'Applications' || + this._settings.get_enum('menu-button-appearance') != 0 || + this._settings.get_boolean('enable-menu-button-arrow') || + this._settings.get_boolean('override-menu-button-color') || + this._settings.get_boolean('override-menu-button-hover-color') || + this._settings.get_boolean('override-menu-button-active-color') || + this._settings.get_boolean('override-menu-button-hover-background-color') || + this._settings.get_boolean('override-menu-button-active-background-color') || + this._settings.get_boolean('menu-button-override-border-radius') || + this._settings.get_int('menu-button-border-radius') != 0 || + this._settings.get_int('menu-button-position-offset') != 0 ) + return true; + else + return false; + } +}); + +var ArcMenuIconsDialogWindow = GObject.registerClass( + class Arc_Menu_ArcMenuIconsDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + super._init(_('ArcMenu Icons'), parent); + this.set_default_size(550, 400); + } + + _createLayout(vbox){ + this.stack = new Gtk.Stack({ + halign: Gtk.Align.FILL, + hexpand: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + + let arcMenuIconsBox = new Gtk.ScrolledWindow(); + + let arcMenuIconsFlowBox = new PW.IconGrid(); + arcMenuIconsFlowBox.connect('child-activated', ()=> { + distroIconsBox.unselect_all(); + customIconFlowBox.unselect_all(); + let selectedChild = arcMenuIconsFlowBox.get_selected_children(); + let selectedChildIndex = selectedChild[0].get_index(); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.ARC_MENU); + this._settings.set_int('arc-menu-icon', selectedChildIndex); + }); + arcMenuIconsBox.set_child(arcMenuIconsFlowBox); + Constants.MenuIcons.forEach((icon)=>{ + let iconName = icon.PATH.replace("/media/icons/menu_button_icons/icons/", ''); + iconName = iconName.replace(".svg", ''); + let iconImage = new Gtk.Image({ + icon_name: iconName, + pixel_size: 36 + }); + arcMenuIconsFlowBox.add(iconImage); + }); + + let distroIconsBox = new PW.IconGrid(); + distroIconsBox.connect('child-activated', ()=> { + arcMenuIconsFlowBox.unselect_all(); + customIconFlowBox.unselect_all(); + let selectedChild = distroIconsBox.get_selected_children(); + let selectedChildIndex = selectedChild[0].get_index(); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.DISTRO_ICON); + this._settings.set_int('distro-icon', selectedChildIndex); + }); + Constants.DistroIcons.forEach((icon)=>{ + let iconImage; + if(icon.PATH === 'start-here-symbolic'){ + iconImage = new Gtk.Image({ + icon_name: 'start-here-symbolic', + pixel_size: 36 + }); + } + else{ + let iconName1 = icon.PATH.replace("/media/icons/menu_button_icons/distro_icons/", ''); + iconName1 = iconName1.replace(".svg", ''); + iconImage = new Gtk.Image({ + icon_name: iconName1, + pixel_size: 36 + }); + } + distroIconsBox.add(iconImage); + }); + + let customIconBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL + }); + let customIconFlowBox = new PW.IconGrid(); + customIconFlowBox.vexpand = false; + customIconFlowBox.homogeneous = false; + customIconFlowBox.connect('child-activated', ()=> { + arcMenuIconsFlowBox.unselect_all(); + distroIconsBox.unselect_all(); + let customIconPath = this._settings.get_string('custom-menu-button-icon'); + this._settings.set_string('custom-menu-button-icon', customIconPath) + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.CUSTOM); + }); + customIconBox.append(customIconFlowBox); + let customIconImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string(this._settings.get_string('custom-menu-button-icon')), + pixel_size: 36 + }); + customIconFlowBox.add(customIconImage); + + let fileChooserFrame = new PW.FrameBox(); + fileChooserFrame.margin_top = 20; + fileChooserFrame.margin_bottom = 20; + fileChooserFrame.margin_start = 20; + fileChooserFrame.margin_end = 20; + let fileChooserRow = new PW.FrameBoxRow(); + let fileChooserLabel = new Gtk.Label({ + label: _('Browse for a Custom Icon'), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + let fileChooserButton = new Gtk.Button({ + label: _('Select an Icon') + }); + fileChooserButton.connect('clicked', (widget) => { + let dialog = new Gtk.FileChooserDialog({ + title: _('Select an Icon'), + transient_for: this.get_root(), + modal: true, + action: Gtk.FileChooserAction.OPEN, + }); + + if(dialog.get_parent()) + dialog.unparent(); + dialog.set_filter(fileFilter); + + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button("_Open", Gtk.ResponseType.ACCEPT); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + arcMenuIconsFlowBox.unselect_all(); + distroIconsBox.unselect_all(); + customIconImage.gicon = Gio.icon_new_for_string(dialog.get_file().get_path()); + this._settings.set_string('custom-menu-button-icon', dialog.get_file().get_path()); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.CUSTOM); + customIconFlowBox.select_child(customIconFlowBox.get_child_at_index(0)); + dialog.destroy(); + } + else + dialog.destroy(); + }) + + dialog.show(); + }); + + fileChooserRow.add(fileChooserLabel); + fileChooserRow.add(fileChooserButton); + fileChooserFrame.add(fileChooserRow); + customIconBox.append(fileChooserFrame); + + this.stack.add_titled(arcMenuIconsBox, 'ArcMenu Icons', _('ArcMenu Icons')); + this.stack.add_titled(distroIconsBox, 'Distro Icons', _('Distro Icons')); + this.stack.add_titled(customIconBox, 'Custom Icon', _('Custom Icon')); + + let stackSwitcher = new Gtk.StackSwitcher({ + stack: this.stack, + halign: Gtk.Align.CENTER + }); + + vbox.append(stackSwitcher); + vbox.append(this.stack); + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU) + this.stack.set_visible_child_name('ArcMenu Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON) + this.stack.set_visible_child_name('Distro Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM) + this.stack.set_visible_child_name('Custom Icon'); + + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU){ + let children = arcMenuIconsFlowBox.childrenCount; + for(let i = 0; i < children; i++){ + if(i === this._settings.get_int('arc-menu-icon')){ + arcMenuIconsFlowBox.select_child(arcMenuIconsFlowBox.get_child_at_index(i)); + break; + } + } + } + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON){ + let children = distroIconsBox.childrenCount; + for(let i = 0; i < children; i++){ + if(i === this._settings.get_int('distro-icon')){ + distroIconsBox.select_child(distroIconsBox.get_child_at_index(i)); + break; + } + } + } + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM){ + customIconFlowBox.select_child(customIconFlowBox.get_child_at_index(0)); + } + + let distroInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + distroInfoButton.halign = Gtk.Align.START; + distroInfoButton.connect('clicked', ()=> { + let dialog = new DistroIconsDisclaimerWindow(this._settings, this); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + vbox.append(distroInfoButton); + } + + setVisibleChild(){ + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU) + this.stack.set_visible_child_name('ArcMenu Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON) + this.stack.set_visible_child_name('Distro Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM) + this.stack.set_visible_child_name('Custom Icon'); + } +}); + +var DistroIconsDisclaimerWindow = GObject.registerClass( + class Arc_Menu_DistroIconsDisclaimerWindow extends Gtk.MessageDialog { + _init(settings, parent) { + this._settings = settings; + super._init({ + text: "" + _("Legal disclaimer for Distro Icons...") + "", + use_markup: true, + message_type: Gtk.MessageType.OTHER, + transient_for: parent.get_root(), + modal: true, + buttons: Gtk.ButtonsType.OK + }); + + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + }); + this.get_content_area().append(vbox); + this._createLayout(vbox); + } + + _createLayout(vbox) { + let scrollWindow = new Gtk.ScrolledWindow({ + min_content_width: 500, + max_content_width: 500, + min_content_height: 400, + max_content_height: 400, + hexpand: false, + halign: Gtk.Align.START, + }); + scrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + let frame = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + hexpand: false, + halign: Gtk.Align.START + }); + + let bodyLabel = new Gtk.Label({ + label: Constants.DistroIconsDisclaimer, + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true + }); + bodyLabel.set_size_request(500,-1); + + frame.append(bodyLabel); + scrollWindow.set_child(frame); + vbox.append(scrollWindow); + } +}); + +var MenuLayoutPage = GObject.registerClass( + class Arc_Menu_MenuLayoutPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + this._settings = settings; + + this.scrollBox = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + vexpand: true, + valign: Gtk.Align.FILL + }); + this.scrollBox.set_child(this.mainBox); + + let currentLayoutLabel = new Gtk.Label({ + label: "" + _("Current Menu Layout") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + let chooseNewLayoutLabel = new Gtk.Label({ + label: "" + _("Available Menu Layouts") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(currentLayoutLabel); + + let currentLayoutFrame = new PW.FrameBox(); + + let currentLayoutBoxLabel = new Gtk.Label({ + label: "" + this.getMenuLayoutName(this._settings.get_enum('menu-layout')) + "", + use_markup: true, + hexpand: true, + vexpand: true, + halign: Gtk.Align.CENTER, + valign: Gtk.Align.CENTER + }); + let currentLayoutBoxRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + currentLayoutBoxRow.activatable = true; + currentLayoutBoxRow._grid.row_spacing = 0; + currentLayoutBoxRow._grid.column_spacing = 0; + + let goNextImage = new Gtk.Image({ + icon_name: 'go-next-symbolic', + halign: Gtk.Align.END + }); + + currentLayoutFrame._listBox.connect('row-activated', () => { + this.displayLayoutTweaksPage(); + }); + + this.layoutsTweaksPage = new LayoutTweaks.tweaks.TweaksPage(this._settings, this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout'))); + this.layoutsTweaksPage.connect("response", (page, response) => { + if(response === -20) + this.stack.set_visible_child_name("LayoutsBox"); + }); + + let currentLayoutImagePath = this.getMenuLayoutImagePath(this._settings.get_enum('menu-layout')); + + let currentLayoutImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string(currentLayoutImagePath), + pixel_size: 155, + hexpand: false, + halign: Gtk.Align.START, + valign: Gtk.Align.CENTER, + }); + let tweaksLabel = new Gtk.Label({ + label: this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout')), + use_markup: true, + halign: Gtk.Align.END, + vexpand: true, + hexpand: true + }); + currentLayoutBoxRow._grid.attach(currentLayoutImage, 0, 0, 1, 1); + currentLayoutBoxRow._grid.attach(currentLayoutBoxLabel, 0, 0, 1, 1); + currentLayoutBoxRow._grid.attach(goNextImage, 0, 0, 1, 1); + currentLayoutFrame.add(currentLayoutBoxRow); + + this.mainBox.append(currentLayoutFrame); + this.mainBox.append(chooseNewLayoutLabel); + + this.stack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + this.layoutTilesBox = new Gtk.Grid({ + column_homogeneous: true, + column_spacing: 14, + row_spacing: 6, + hexpand: true, + halign: Gtk.Align.FILL, + vexpand: true, + valign: Gtk.Align.FILL + }); + this.mainBox.append(this.layoutTilesBox); + this.stack.add_named(this.scrollBox, "LayoutsBox"); + this.stack.add_named(this.layoutsTweaksPage, "LayoutsTweaks") + let gridY = 0; + Constants.MenuStyles.STYLES.forEach((style) => { + let tile = new PW.LayoutTile(style.TITLE, style.IMAGE, style); + this.layoutTilesBox.attach(tile, 0, gridY, 1, 1); + let menuLayoutsBox = new MenuLayoutCategoryPage(this._settings, this, tile, style.TITLE); + gridY++; + menuLayoutsBox.connect('menu-layout-response', (dialog, response) => { + if(response === -10) { + this._settings.set_enum('menu-layout', dialog.index); + this._settings.set_boolean('reload-theme', true); + currentLayoutBoxLabel.label = "" + this.getMenuLayoutName(dialog.index) + ""; + tweaksLabel.label = this.getMenuLayoutTweaksName(dialog.index); + currentLayoutImage.gicon = Gio.icon_new_for_string(this.getMenuLayoutImagePath(dialog.index)); + this.stack.set_visible_child_name("LayoutsBox"); + this.scrollBox.vadjustment.set_value(this.scrollBox.vadjustment.get_lower()); + } + if(response === -20){ + this.stack.set_visible_child_name("LayoutsBox"); + } + }); + this.stack.add_named(menuLayoutsBox, "Layout_" + style.TITLE); + tile._listBox.connect('row-activated', ()=> { + this.stack.set_visible_child_name("Layout_" + style.TITLE); + menuLayoutsBox.enableSelectionMode(); + }); + }); + + this.append(this.stack); + } + + displayLayoutTweaksPage(){ + let layoutName = this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout')); + this.layoutsTweaksPage.setActiveLayout(this._settings.get_enum('menu-layout'), layoutName); + this.stack.set_visible_child_name("LayoutsTweaks"); + } + + displayRunnerTweaksPage(){ + if(!this.runnerTweaksPage){ + let activeLayoutName = this.getMenuLayoutTweaksName(Constants.MenuLayout.RUNNER); + this.runnerTweaksPage = new LayoutTweaks.tweaks.TweaksPage(this._settings, activeLayoutName); + this.stack.add_named(this.runnerTweaksPage, "RunnerTweaks") + this.runnerTweaksPage.connect("response", (page, response) => { + if(response === -20) + this.stack.set_visible_child_name("LayoutsBox"); + }); + this.runnerTweaksPage.setActiveLayout(Constants.MenuLayout.RUNNER); + } + this.stack.set_visible_child_name("RunnerTweaks"); + } + + getMenuLayoutName(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return _(style.TITLE); + } + } + } + } + + getMenuLayoutTweaksName(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return _("%s Layout Tweaks", style.TITLE).format(style.TITLE); + } + } + } + } + + getMenuLayoutImagePath(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return style.IMAGE; + } + } + } + } + +}); + +var MenuThemePage = GObject.registerClass( + class Arc_Menu_MenuThemePage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.customArcMenu = this._settings.get_boolean('enable-custom-arc-menu'); + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.checkIfPresetMatch(); + + let overrideArcMenuHeaderLabel = new Gtk.Label({ + label: "" + _('Enable Custom Menu Theme') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(overrideArcMenuHeaderLabel); + + let overrideArcMenuFrame = new PW.FrameBox(); + let overrideArcMenuRow = new PW.FrameBoxRow(); + let overrideArcMenuLabel = new Gtk.Label({ + label: _("Override Menu Theme"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let overrideArcMenuSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + overrideArcMenuSwitch.set_active(this._settings.get_boolean('enable-custom-arc-menu')); + overrideArcMenuSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-custom-arc-menu',widget.get_active()); + this._settings.set_boolean('reload-theme', true); + if(widget.get_active()){ + this.mainBox.append(this.menuThemeCustomizationBox); + this.menuThemeCustomizationBox.show(); + this.append(this.buttonRow); + this.buttonRow.show(); + } + else{ + this.mainBox.remove(this.menuThemeCustomizationBox); + this.remove(this.buttonRow); + } + this.mainBox.show(); + }); + + this.menuThemeCustomizationBox = new OverrideArcMenuThemeWindow(this._settings, this.mainBox, this); + this.menuThemeCustomizationBox.connect('menu-theme-response', (dialog, response) => { + if(response === -10) { + this._settings.set_string('separator-color', dialog.separatorColor); + this._settings.set_boolean('vert-separator', dialog.verticalSeparator); + this._settings.set_string('menu-color', dialog.menuColor); + this._settings.set_string('menu-foreground-color', dialog.menuForegroundColor); + this._settings.set_string('border-color', dialog.borderColor); + this._settings.set_string('highlight-color', dialog.highlightColor ); + this._settings.set_string('highlight-foreground-color', dialog.highlightForegroundColor); + this._settings.set_int('menu-font-size', dialog.fontSize); + this._settings.set_int('menu-border-size', dialog.borderSize); + this._settings.set_int('menu-corner-radius', dialog.cornerRadius); + this._settings.set_int('menu-margin', dialog.menuMargin); + this._settings.set_int('menu-arrow-size', dialog.menuArrowSize); + this._settings.set_boolean('reload-theme', true); + this.presetName = dialog.presetName; + } + else{ + this.checkIfPresetMatch(); + } + }); + + overrideArcMenuRow.add(overrideArcMenuLabel); + overrideArcMenuRow.add(overrideArcMenuSwitch); + overrideArcMenuFrame.add(overrideArcMenuRow); + + this.mainBox.append(overrideArcMenuFrame); + if(overrideArcMenuSwitch.get_active()) + this.mainBox.append(this.menuThemeCustomizationBox); + else + this.remove(this.buttonRow); + } + + checkIfPresetMatch(){ + this.presetName = "Custom Theme"; + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.currentSettingsArray = [this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + let all_color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < all_color_themes.length; i++){ + this.isEqual = true; + for(let l = 0; l < this.currentSettingsArray.length; l++){ + if(this.currentSettingsArray[l] !== all_color_themes[i][l + 1]){ + this.isEqual=false; + break; + } + } + if(this.isEqual){ + this.presetName = all_color_themes[i][0]; + break; + } + } + } +}); + +var MenuLayoutCategoryPage = GObject.registerClass({ + Signals: { + 'menu-layout-response': { param_types: [GObject.TYPE_INT] }, + }, +}, class Arc_Menu_MenuLayoutCategoryPage extends Gtk.ScrolledWindow { + _init(settings, parent, tile, title) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this.title = title; + this._parent = parent; + this._settings = settings; + this.index = this._settings.get_enum('menu-layout'); + this.layoutStyle = tile.layout; + + this._params = { + maxColumns: tile.layout.length > 3 ? 3 : tile.layout.length, + imageHeight: 155, + imageWidth: 155, + styles: tile.layout + }; + let layoutsFrame = new PW.FrameBox(); + let layoutsRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false, + }) + layoutsRow._grid.orientation = Gtk.Orientation.VERTICAL; + layoutsFrame.add(layoutsRow); + let buttonBox = new Gtk.Box({ + spacing: 10 + }); + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: false, + halign: Gtk.Align.END + }); + applyButton.connect('clicked', ()=> { + let selectedBox = this._tileGrid.get_selected_children(); + this.index = selectedBox[0].get_child().layout; + this._tileGrid.unselect_all(); + applyButton.set_sensitive(false); + this.emit('menu-layout-response', -10); + }); + let backButton = new PW.Button({ + icon_name: 'go-previous-symbolic', + title: _("Back"), + icon_first: true, + halign: Gtk.Align.START + }); + backButton.connect('clicked', ()=> { + this.emit('menu-layout-response', -20); + }); + buttonBox.append(backButton); + let chooseNewLayoutLabel = new Gtk.Label({ + label: "" + _("%s Menu Layouts", this.title).format(this.title) + "", + use_markup: true, + halign: Gtk.Align.CENTER, + hexpand: true + }); + buttonBox.append(chooseNewLayoutLabel); + buttonBox.append(applyButton); + applyButton.set_sensitive(false); + + this.mainBox.append(buttonBox); + this.mainBox.append(layoutsFrame); + this._tileGrid = new PW.TileGrid(this._params.maxColumns); + + this._params.styles.forEach((style) => { + this._addTile(style.TITLE, style.IMAGE, style.LAYOUT); + }); + + layoutsRow.add(this._tileGrid); + + this._tileGrid.connect('selected-children-changed', () => { + applyButton.set_sensitive(true); + }); + + this._tileGrid.set_selection_mode(Gtk.SelectionMode.NONE); + } + + + enableSelectionMode(){ + this._tileGrid.set_selection_mode(Gtk.SelectionMode.SINGLE); + } + + _addTile(name, image, layout) { + let tile = new PW.Tile(name, image, this._params.imageWidth, this._params.imageHeight, layout); + this._tileGrid.insert(tile, -1); + } +}); + +var MenuSettingsGeneralPage = GObject.registerClass( + class Arc_Menu_MenuSettingsGeneralPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.heightValue = this._settings.get_int('menu-height'); + this.widthValue = this._settings.get_int('menu-width-adjustment'); + this.rightPanelWidth = this._settings.get_int('right-panel-width'); + this.menuWidth = this._settings.get_int('menu-width'); + this.forcedMenuLocation = this._settings.get_enum('force-menu-location'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.appDescriptions = this._settings.get_boolean('apps-show-extra-details'); + this.categoryIconType = this._settings.get_enum('category-icon-type'); + this.shortcutsIconType = this._settings.get_enum('shortcut-icon-type'); + + let menuSizeFrame = new PW.FrameBox(); + //find the greatest screen height of all monitors + //use that value to set Menu Height cap + let display = Gdk.Display.get_default(); + let monitors = display.get_monitors(); + let nMonitors = monitors.get_n_items(); + let greatestHeight = 0; + let scaleFactor = 1; + for (let i = 0; i < nMonitors; i++) { + let monitor = monitors.get_item(i); + let monitorHeight = monitor.get_geometry().height; + if(monitorHeight > greatestHeight){ + scaleFactor = monitor.get_scale_factor(); + greatestHeight = monitorHeight; + } + } + let monitorHeight = greatestHeight * scaleFactor; + monitorHeight = Math.round((monitorHeight * 8) / 10); + + let menuSizeHeaderLabel = new Gtk.Label({ + label: "" + _("Menu Size") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(menuSizeHeaderLabel); + + this.mainBox.append(menuSizeFrame); + let heightRow = new PW.FrameBoxRow(); + let heightLabel = new Gtk.Label({ + label: _('Height'), + use_markup: true, + xalign: 0, + hexpand: false, + selectable: false + }); + let hscale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: monitorHeight, + step_increment: 10, + page_increment: 10, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + hscale.set_value(this.heightValue); + hscale.connect('value-changed', () => { + this.heightValue = hscale.get_value(); + if(hSpinButton.value !== this.heightValue) + hSpinButton.set_value(this.heightValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let hSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 300, upper: monitorHeight, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + hSpinButton.set_value(this.heightValue); + hSpinButton.connect('value-changed', () => { + this.heightValue = hSpinButton.get_value(); + if(hscale.value !== this.heightValue) + hscale.set_value(this.heightValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + heightRow.add(heightLabel); + heightRow.add(hscale); + heightRow.add(hSpinButton); + menuSizeFrame.add(heightRow); + + let menuWidthTwoPanelsHeaderRow = new PW.FrameBoxRow(); + let menuWidthTwoPanelsHeaderLabel = new Gtk.Label({ + label: _("Traditional Layouts Width"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false, + sensitive: false + }); + menuWidthTwoPanelsHeaderRow.add(menuWidthTwoPanelsHeaderLabel) + menuSizeFrame.add(menuWidthTwoPanelsHeaderRow); + + let menuWidthRow = new PW.FrameBoxRow(); + menuWidthRow._grid.margin_start = 25; + let menuWidthLabel = new Gtk.Label({ + label: _('Left-Panel'), + xalign:0, + hexpand: false, + }); + let menuWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 175, upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuWidthScale.set_value(this.menuWidth); + menuWidthScale.connect('value-changed', () => { + this.menuWidth = menuWidthScale.get_value(); + if(menuWidthSpinButton.value !== this.menuWidth) + menuWidthSpinButton.set_value(this.menuWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let menuWidthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 175, upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + menuWidthSpinButton.set_value(this.menuWidth); + menuWidthSpinButton.connect('value-changed', () => { + this.menuWidth = menuWidthSpinButton.get_value(); + if(menuWidthScale.value !== this.menuWidth) + menuWidthScale.set_value(this.menuWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + menuWidthRow.add(menuWidthLabel); + menuWidthRow.add(menuWidthScale); + menuWidthRow.add( menuWidthSpinButton); + menuSizeFrame.add(menuWidthRow); + + let rightPanelWidthRow = new PW.FrameBoxRow(); + rightPanelWidthRow._grid.margin_start = 25; + let rightPanelWidthLabel = new Gtk.Label({ + label: _('Right-Panel'), + xalign:0, + hexpand: false, + }); + let rightPanelWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 200,upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + rightPanelWidthScale.set_value(this.rightPanelWidth); + rightPanelWidthScale.connect('value-changed', () => { + this.rightPanelWidth = rightPanelWidthScale.get_value(); + if(rightPanelWidthSpinButton.value !== this.rightPanelWidth) + rightPanelWidthSpinButton.set_value(this.rightPanelWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let rightPanelWidthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 200,upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + rightPanelWidthSpinButton.set_value(this.rightPanelWidth); + rightPanelWidthSpinButton.connect('value-changed', () => { + this.rightPanelWidth = rightPanelWidthSpinButton.get_value(); + if(rightPanelWidthScale.value !== this.rightPanelWidth) + rightPanelWidthScale.set_value(this.rightPanelWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + rightPanelWidthRow.add(rightPanelWidthLabel); + rightPanelWidthRow.add(rightPanelWidthScale); + rightPanelWidthRow.add(rightPanelWidthSpinButton); + menuSizeFrame.add(rightPanelWidthRow); + + let otherWidthHeaderRow = new PW.FrameBoxRow(); + let otherWidthHeaderLabel = new Gtk.Label({ + label: _("Non-Traditional Layouts Width"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false, + sensitive: false + }); + otherWidthHeaderRow.add(otherWidthHeaderLabel) + menuSizeFrame.add(otherWidthHeaderRow); + + let widthRow = new PW.FrameBoxRow(); + widthRow._grid.margin_start = 25; + let widthLabel = new Gtk.Label({ + label: _('Width Offset'), + use_markup: true, + xalign: 0, + hexpand: false, + selectable: false + }); + let widthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -350, + upper: 600, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + widthScale.add_mark(0, Gtk.PositionType.BOTTOM, _("Default")); + widthScale.set_value(this.widthValue); + widthScale.connect('value-changed', (widget) => { + this.widthValue = widget.get_value(); + if(widthSpinButton.value !== this.widthValue) + widthSpinButton.set_value(this.widthValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let widthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: -350, upper: 600, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + valign: Gtk.Align.START + }); + widthSpinButton.set_value(this.widthValue); + widthSpinButton.connect('value-changed', () => { + this.widthValue = widthSpinButton.get_value(); + if(widthScale.value !== this.widthValue) + widthScale.set_value(this.widthValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + widthRow.add(widthLabel); + widthRow.add(widthScale); + widthRow.add(widthSpinButton); + menuSizeFrame.add(widthRow); + + let iconsSizeFrame = new PW.FrameBox(); + let menuItemSizeHeaderLabel = new Gtk.Label({ + label: "" + _("Menu Items Icon Size") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(menuItemSizeHeaderLabel); + + let gridIconsSizeRow = new PW.FrameBoxRow(); + let gridIconsSizeLabel = new Gtk.Label({ + label: _("Grid Icons"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.gridIconsSizeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + this.gridIconsSizeCombo.append("Default", _("Default")); + this.gridIconsSizeCombo.append("Small", _("Small") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Medium", _("Medium") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Large", _("Large") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Small Rect", _("Small") + " - " + _("Wide")); + this.gridIconsSizeCombo.append("Medium Rect", _("Medium") + " - " + _("Wide")); + this.gridIconsSizeCombo.append("Large Rect", _("Large") + " - " + _("Wide")); + this.gridIconsSizeCombo.set_active(this._settings.get_enum('menu-item-grid-icon-size')); + this.gridIconsSizeCombo.connect('changed', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + gridIconsSizeRow.add(gridIconsSizeLabel); + gridIconsSizeRow.add(this.gridIconsSizeCombo); + iconsSizeFrame.add(gridIconsSizeRow); + + [this.menuItemIconSizeCombo, this.menuItemIconSizeRow] = this.createIconSizeRow(_("Categories & Applications"), this._settings.get_enum('menu-item-icon-size')); + iconsSizeFrame.add(this.menuItemIconSizeRow); + [this.buttonIconSizeCombo, this.buttonIconSizeRow] = this.createIconSizeRow(_("Buttons"), this._settings.get_enum('button-item-icon-size')); + iconsSizeFrame.add(this.buttonIconSizeRow); + [this.quicklinksIconSizeCombo, this.quicklinksIconSizeRow] = this.createIconSizeRow(_("Quick Links"), this._settings.get_enum('quicklinks-item-icon-size')); + iconsSizeFrame.add(this.quicklinksIconSizeRow); + [this.miscIconSizeCombo, this.miscIconSizeRow] = this.createIconSizeRow(_("Misc"), this._settings.get_enum('misc-item-icon-size')); + iconsSizeFrame.add(this.miscIconSizeRow); + + this.mainBox.append(iconsSizeFrame); + + let generalHeaderLabel = new Gtk.Label({ + label: "" + _("General Settings") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(generalHeaderLabel); + + let generalSettingsFrame = new PW.FrameBox(); + let menuLocationRow = new PW.FrameBoxRow(); + let menuLocationLabel = new Gtk.Label({ + label: _('Override Menu Location'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let menuLocationCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + menuLocationCombo.append_text(_("Off")); + menuLocationCombo.append_text(_("Top Centered")); + menuLocationCombo.append_text(_("Bottom Centered")); + menuLocationCombo.set_active(this._settings.get_enum('force-menu-location')); + menuLocationCombo.connect('changed', (widget) => { + this.forcedMenuLocation = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + menuLocationRow.add(menuLocationLabel); + menuLocationRow.add(menuLocationCombo); + generalSettingsFrame.add(menuLocationRow); + this.mainBox.append(generalSettingsFrame); + + let appDescriptionsRow = new PW.FrameBoxRow(); + let appDescriptionsLabel = new Gtk.Label({ + label: _("Show Application Descriptions"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let appDescriptionsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + appDescriptionsSwitch.set_active(this.appDescriptions); + appDescriptionsSwitch.connect('notify::active', (widget) => { + this.appDescriptions = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appDescriptionsRow.add(appDescriptionsLabel); + appDescriptionsRow.add(appDescriptionsSwitch); + generalSettingsFrame.add(appDescriptionsRow); + + let categoryIconTypeRow = new PW.FrameBoxRow(); + let categoryIconTypeLabel = new Gtk.Label({ + label: _('Category Icon Type'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let categoryIconTypeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + categoryIconTypeCombo.append_text(_("Full Color")); + categoryIconTypeCombo.append_text(_("Symbolic")); + categoryIconTypeCombo.set_active(this.categoryIconType); + categoryIconTypeCombo.connect('changed', (widget) => { + this.categoryIconType = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + categoryIconTypeRow.add(categoryIconTypeLabel); + categoryIconTypeRow.add(categoryIconTypeCombo); + generalSettingsFrame.add(categoryIconTypeRow); + + let shortcutsIconTypeRow = new PW.FrameBoxRow(); + let shortcutsIconTypeLabel = new Gtk.Label({ + label: _('Shortcuts Icon Type'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let shortcutsIconTypeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + shortcutsIconTypeCombo.append_text(_("Full Color")); + shortcutsIconTypeCombo.append_text(_("Symbolic")); + shortcutsIconTypeCombo.set_active(this.shortcutsIconType); + shortcutsIconTypeCombo.connect('changed', (widget) => { + this.shortcutsIconType = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + shortcutsIconTypeRow.add(shortcutsIconTypeLabel); + shortcutsIconTypeRow.add(shortcutsIconTypeCombo); + generalSettingsFrame.add(shortcutsIconTypeRow); + + let vertSeparatorRow = new PW.FrameBoxRow(); + let vertSeparatorLabel = new Gtk.Label({ + label: _('Enable Vertical Separator'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let vertSeparatorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + vertSeparatorSwitch.set_active(this.verticalSeparator); + vertSeparatorSwitch.connect('notify::active', (widget) => { + this.verticalSeparator = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + vertSeparatorRow.add(vertSeparatorLabel); + vertSeparatorRow.add(vertSeparatorSwitch); + generalSettingsFrame.add(vertSeparatorRow); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.heightValue = this._settings.get_default_value('menu-height').unpack(); + this.widthValue = this._settings.get_default_value('menu-width-adjustment').unpack(); + this.rightPanelWidth = this._settings.get_default_value('right-panel-width').unpack(); + this.menuWidth = this._settings.get_default_value('menu-width').unpack(); + this.verticalSeparator = this._settings.get_default_value('vert-separator').unpack(); + this.appDescriptions = this._settings.get_default_value('apps-show-extra-details').unpack(); + this.categoryIconType = 0; + this.shortcutsIconType = 1; + this.forcedMenuLocation = 0; + hscale.set_value(this.heightValue); + widthScale.set_value(this.widthValue); + menuWidthScale.set_value(this.menuWidth); + rightPanelWidthScale.set_value(this.rightPanelWidth); + vertSeparatorSwitch.set_active(this.verticalSeparator); + this.gridIconsSizeCombo.set_active(0); + this.menuItemIconSizeCombo.set_active(0); + this.buttonIconSizeCombo.set_active(0); + this.quicklinksIconSizeCombo.set_active(0); + this.miscIconSizeCombo.set_active(0); + appDescriptionsSwitch.set_active(this.appDescriptions); + menuLocationCombo.set_active(this.forcedMenuLocation); + categoryIconTypeCombo.set_active(0); + shortcutsIconTypeCombo.set_active(1); + + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_int('menu-height', this.heightValue); + this._settings.set_int('menu-width-adjustment', this.widthValue); + this._settings.set_int('right-panel-width', this.rightPanelWidth); + this._settings.set_int('menu-width', this.menuWidth); + this._settings.set_enum('force-menu-location', this.forcedMenuLocation); + this._settings.set_boolean('vert-separator', this.verticalSeparator); + this._settings.set_enum('menu-item-icon-size', this.menuItemIconSizeCombo.get_active()); + this._settings.set_enum('menu-item-grid-icon-size', this.gridIconsSizeCombo.get_active()); + this._settings.set_enum('button-item-icon-size', this.buttonIconSizeCombo.get_active()); + this._settings.set_enum('quicklinks-item-icon-size', this.quicklinksIconSizeCombo.get_active()); + this._settings.set_enum('misc-item-icon-size', this.miscIconSizeCombo.get_active()); + this._settings.set_boolean('reload-theme', true); + this._settings.set_boolean('apps-show-extra-details', this.appDescriptions); + this._settings.set_enum('category-icon-type', this.categoryIconType); + this._settings.set_enum('shortcut-icon-type', this.shortcutsIconType); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + createIconSizeRow(title, iconSizeEnum){ + let iconsSizeRow = new PW.FrameBoxRow(); + let iconsSizeLabel = new Gtk.Label({ + label: _(title), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let iconSizeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + iconSizeCombo.append("Default", _("Default")); + iconSizeCombo.append("ExtraSmall", _("Extra Small")); + iconSizeCombo.append("Small", _("Small")); + iconSizeCombo.append("Medium", _("Medium")); + iconSizeCombo.append("Large", _("Large")); + iconSizeCombo.append("ExtraLarge", _("Extra Large")); + iconSizeCombo.set_active(iconSizeEnum); + iconSizeCombo.connect('changed', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + iconsSizeRow.add(iconsSizeLabel); + iconsSizeRow.add(iconSizeCombo); + return [iconSizeCombo, iconsSizeRow]; + } + + checkIfResetButtonSensitive(){ + return ( + this.heightValue !== this._settings.get_default_value('menu-height').unpack() || + this.widthValue !== this._settings.get_default_value('menu-width-adjustment').unpack() || + this.rightPanelWidth !== this._settings.get_default_value('right-panel-width').unpack() || + this.menuWidth !== this._settings.get_default_value('menu-width').unpack() || + this.forcedMenuLocation !== 0 || + this.verticalSeparator !== this._settings.get_default_value('vert-separator').unpack() || + this.gridIconsSizeCombo.get_active() !== 0 || + this.menuItemIconSizeCombo.get_active() !== 0 || + this.buttonIconSizeCombo.get_active() !== 0 || + this.quicklinksIconSizeCombo.get_active() !== 0 || + this.miscIconSizeCombo.get_active() !== 0 || + this.appDescriptions !== this._settings.get_default_value('apps-show-extra-details').unpack() || + this.categoryIconType !== 0 || + this.shortcutsIconType !== 1 ) ? true : false + } +}); + +var MenuSettingsFineTunePage = GObject.registerClass( + class Arc_Menu_MenuSettingsFineTunePage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.disableFadeEffect = this._settings.get_boolean('disable-scrollview-fade-effect'); + this.gapAdjustment = this._settings.get_int('gap-adjustment'); + this.removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + this.disableSearchStyle = this._settings.get_boolean('disable-searchbox-border'); + this.alphabetizeAllPrograms = this._settings.get_boolean('alphabetize-all-programs') + this.multiLinedLabels = this._settings.get_boolean('multi-lined-labels'); + this.disableTooltips = this._settings.get_boolean('disable-tooltips'); + this.subMenus = this._settings.get_boolean('enable-sub-menus'); + this.showHiddenRecentFiles = this._settings.get_boolean('show-hidden-recent-files'); + + let searchStyleFrame = new PW.FrameBox(); + let searchStyleRow = new PW.FrameBoxRow(); + let searchStyleLabel = new Gtk.Label({ + label: _("Disable Searchbox Border"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let searchStyleSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + searchStyleSwitch.set_active(this._settings.get_boolean('disable-searchbox-border')); + searchStyleSwitch.connect('notify::active', (widget) => { + this.disableSearchStyle = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + searchStyleRow.add(searchStyleLabel); + searchStyleRow.add(searchStyleSwitch); + searchStyleFrame.add(searchStyleRow); + this.mainBox.append(searchStyleFrame); + + let tweakStyleFrame = new PW.FrameBox(); + let tweakStyleRow = new PW.FrameBoxRow(); + let tweakStyleLabel = new Gtk.Label({ + label: _("Disable Menu Arrow"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let tweakStyleSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + tweakStyleSwitch.set_active(this._settings.get_boolean('remove-menu-arrow')); + tweakStyleSwitch.connect('notify::active', (widget) => { + this.removeMenuArrow = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + tweakStyleRow.add(tweakStyleLabel); + tweakStyleRow.add(tweakStyleSwitch); + tweakStyleFrame.add(tweakStyleRow); + this.mainBox.append(tweakStyleFrame); + + let fadeEffectFrame = new PW.FrameBox(); + let fadeEffectRow = new PW.FrameBoxRow(); + let fadeEffectLabel = new Gtk.Label({ + label: _("Disable ScrollView Fade Effects"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let fadeEffectSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + fadeEffectSwitch.set_active(this._settings.get_boolean('disable-scrollview-fade-effect')); + fadeEffectSwitch.connect('notify::active', (widget) => { + this.disableFadeEffect = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + fadeEffectRow.add(fadeEffectLabel); + fadeEffectRow.add(fadeEffectSwitch); + fadeEffectFrame.add(fadeEffectRow); + this.mainBox.append(fadeEffectFrame); + + let tooltipFrame = new PW.FrameBox(); + let tooltipRow = new PW.FrameBoxRow(); + let tooltipLabel = new Gtk.Label({ + label: _("Disable Tooltips"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let tooltipSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + tooltipSwitch.set_active(this.disableTooltips); + tooltipSwitch.connect('notify::active', (widget) => { + this.disableTooltips = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + tooltipRow.add(tooltipLabel); + tooltipRow.add(tooltipSwitch); + tooltipFrame.add(tooltipRow); + this.mainBox.append(tooltipFrame); + + let alphabetizeAllProgramsFrame = new PW.FrameBox(); + let alphabetizeAllProgramsRow = new PW.FrameBoxRow(); + let alphabetizeAllProgramsLabel = new Gtk.Label({ + label: _("Alphabetize 'All Programs' Category"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let alphabetizeAllProgramsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + alphabetizeAllProgramsSwitch.set_active(this._settings.get_boolean('alphabetize-all-programs')); + alphabetizeAllProgramsSwitch.connect('notify::active', (widget) => { + this.alphabetizeAllPrograms = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + alphabetizeAllProgramsRow.add(alphabetizeAllProgramsLabel); + alphabetizeAllProgramsRow.add(alphabetizeAllProgramsSwitch); + alphabetizeAllProgramsFrame.add(alphabetizeAllProgramsRow); + this.mainBox.append(alphabetizeAllProgramsFrame); + + let subMenusFrame = new PW.FrameBox(); + let subMenusRow = new PW.FrameBoxRow(); + let subMenusLabel = new Gtk.Label({ + label: _('Category Sub Menus'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let subMenusSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + subMenusSwitch.set_active(this.subMenus); + subMenusSwitch.connect('notify::active', (widget) => { + this.subMenus = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + subMenusRow.add(subMenusLabel); + subMenusRow.add(subMenusSwitch); + subMenusFrame.add(subMenusRow); + this.mainBox.append(subMenusFrame); + + let hiddenFilesFrame = new PW.FrameBox(); + let hiddenFilesRow = new PW.FrameBoxRow(); + let hiddenFilesLabel = new Gtk.Label({ + label: _('Show Hidden Recent Files'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let hiddenFilesSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + hiddenFilesSwitch.set_active(this.showHiddenRecentFiles); + hiddenFilesSwitch.connect('notify::active', (widget) => { + this.showHiddenRecentFiles = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + hiddenFilesRow.add(hiddenFilesLabel); + hiddenFilesRow.add(hiddenFilesSwitch); + hiddenFilesFrame.add(hiddenFilesRow); + this.mainBox.append(hiddenFilesFrame); + + let multiLinedLabelFrame = new PW.FrameBox(); + let multiLinedLabelRow = new PW.FrameBoxRow(); + let multiLinedLabelLabel = new Gtk.Label({ + label: _("Multi-Lined Labels"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let multiLinedLabelSwitch = new Gtk.Switch({ halign: Gtk.Align.END, vexpand: false, valign: Gtk.Align.CENTER }); + multiLinedLabelSwitch.set_active(this._settings.get_boolean('multi-lined-labels')); + multiLinedLabelSwitch.connect('notify::active', (widget) => { + this.multiLinedLabels = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + let multiLinedLabelInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + multiLinedLabelInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Multi-Lined Labels"), + secondaryText: _('Enable/Disable multi-lined labels on large application icon layouts.'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + multiLinedLabelRow.add(multiLinedLabelLabel); + multiLinedLabelRow.add(multiLinedLabelSwitch); + multiLinedLabelRow.add(multiLinedLabelInfoButton); + multiLinedLabelFrame.add(multiLinedLabelRow); + this.mainBox.append(multiLinedLabelFrame); + + let gapAdjustmentFrame = new PW.FrameBox(); + let gapAdjustmentRow = new PW.FrameBoxRow(); + let gapAdjustmentLabel = new Gtk.Label({ + label: _('Gap Adjustment'), + xalign:0, + hexpand: false, + }); + let gapAdjustmentScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -1, upper: 20, step_increment: 1, page_increment: 1, page_size: 0 + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT, + draw_value: true, + }); + gapAdjustmentScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + gapAdjustmentScale.set_value(this.gapAdjustment); + gapAdjustmentScale.connect('value-changed', () => { + this.gapAdjustment = gapAdjustmentScale.get_value(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let gapAdjustmentInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + gapAdjustmentInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Adjust the gap between the ArcMenu button and the menu."), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + gapAdjustmentRow.add(gapAdjustmentLabel); + gapAdjustmentRow.add(gapAdjustmentScale); + gapAdjustmentRow.add(gapAdjustmentInfoButton); + gapAdjustmentFrame.add(gapAdjustmentRow); + this.mainBox.append(gapAdjustmentFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.gapAdjustment = this._settings.get_default_value('gap-adjustment').unpack(); + this.removeMenuArrow = this._settings.get_default_value('remove-menu-arrow').unpack(); + this.disableSearchStyle = this._settings.get_default_value('disable-searchbox-border').unpack(); + this.alphabetizeAllPrograms = this._settings.get_default_value('alphabetize-all-programs').unpack(); + this.multiLinedLabels = this._settings.get_default_value('multi-lined-labels').unpack(); + this.subMenus = this._settings.get_default_value('enable-sub-menus').unpack(); + this.showHiddenRecentFiles = this._settings.get_default_value('show-hidden-recent-files').unpack(); + this.disableTooltips = this._settings.get_default_value('disable-tooltips').unpack(); + this.disableFadeEffect = this._settings.get_default_value('disable-scrollview-fade-effect').unpack(); + alphabetizeAllProgramsSwitch.set_active(this.alphabetizeAllPrograms); + gapAdjustmentScale.set_value(this.gapAdjustment); + searchStyleSwitch.set_active(this.disableSearchStyle); + tweakStyleSwitch.set_active(this.removeMenuArrow); + multiLinedLabelSwitch.set_active(this.multiLinedLabels); + tooltipSwitch.set_active(this.disableTooltips); + subMenusSwitch.set_active(this.subMenus); + hiddenFilesSwitch.set_active(this.showHiddenRecentFiles); + fadeEffectSwitch.set_active(this.disableFadeEffect); + + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_int('gap-adjustment', this.gapAdjustment); + this._settings.set_boolean('remove-menu-arrow', this.removeMenuArrow); + this._settings.set_boolean('disable-searchbox-border', this.disableSearchStyle); + this._settings.set_boolean('alphabetize-all-programs', this.alphabetizeAllPrograms); + this._settings.set_boolean('multi-lined-labels', this.multiLinedLabels); + this._settings.set_boolean('disable-scrollview-fade-effect', this.disableFadeEffect); + this._settings.set_boolean('disable-tooltips', this.disableTooltips); + this._settings.set_boolean('enable-sub-menus', this.subMenus); + this._settings.set_boolean('show-hidden-recent-files', this.showHiddenRecentFiles); + this._settings.set_boolean('reload-theme', true); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.subMenus !== this._settings.get_default_value('enable-sub-menus').unpack() || + this.disableTooltips !== this._settings.get_default_value('disable-tooltips').unpack() || + this.gapAdjustment !== this._settings.get_default_value('gap-adjustment').unpack() || + this.removeMenuArrow !== this._settings.get_default_value('remove-menu-arrow').unpack() || + this.disableSearchStyle !== this._settings.get_default_value('disable-searchbox-border').unpack()|| + this.alphabetizeAllPrograms !== this._settings.get_default_value('alphabetize-all-programs').unpack()|| + this.multiLinedLabels !== this._settings.get_default_value('multi-lined-labels').unpack() || + this.disableFadeEffect !== this._settings.get_default_value('disable-scrollview-fade-effect').unpack() || + this.showHiddenRecentFiles !== this._settings.get_default_value('show-hidden-recent-files').unpack()) ? true : false; + } +}); + +var MenuSettingsNewAppsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsNewAppsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.disableRecentApps = this._settings.get_boolean('disable-recently-installed-apps'); + this.indicatorColor = this._settings.get_string('indicator-color'); + this.indicatorTextColor = this._settings.get_string('indicator-text-color'); + + let recentAppsFrame = new PW.FrameBox(); + let recentAppsRow = new PW.FrameBoxRow(); + let recentAppsLabel = new Gtk.Label({ + label: _("Disable New Apps Tracker"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let recentAppsSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + + recentAppsSwitch.connect('notify::active', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + this.disableRecentApps = widget.get_active(); + + if(widget.get_active()){ + appIndicatorColorFrame.hide(); + recentlyInstalledInfoLabel.hide(); + clearRecentAppsFrame.hide(); + } + else{ + appIndicatorColorFrame.show(); + recentlyInstalledInfoLabel.show(); + clearRecentAppsFrame.show(); + this.mainBox.show(); + } + this._settings.set_boolean('disable-recently-installed-apps', widget.get_active()); + }); + + recentAppsSwitch.set_active(this._settings.get_boolean('disable-recently-installed-apps')); + + recentAppsRow.add(recentAppsLabel); + recentAppsRow.add(recentAppsSwitch); + recentAppsFrame.add(recentAppsRow); + this.mainBox.append(recentAppsFrame); + + let appIndicatorColorFrame = new PW.FrameBox(); + let recentlyInstalledInfoLabel = new Gtk.Label({ + label: "" + _("Customize New Apps Indicator") + "", + use_markup: true, + xalign: 0, + hexpand: true, + }); + this.mainBox.append(recentlyInstalledInfoLabel); + let appIndicatorColorRow = new PW.FrameBoxRow(); + let appIndicatorColorLabel = new Gtk.Label({ + label: _('Category Indicator Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let appIndicatorColorChooser = new Gtk.ColorButton({ + use_alpha: true, + }); + let color = new Gdk.RGBA(); + color.parse(this.indicatorColor); + appIndicatorColorChooser.set_rgba(color); + appIndicatorColorChooser.connect('color-set', ()=>{ + this.indicatorColor = appIndicatorColorChooser.get_rgba().to_string(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appIndicatorColorRow.add(appIndicatorColorLabel); + appIndicatorColorRow.add(appIndicatorColorChooser); + appIndicatorColorFrame.add(appIndicatorColorRow); + + let appIndicatorTextColorRow = new PW.FrameBoxRow(); + let appIndicatorTextColorLabel = new Gtk.Label({ + label: _('App Indicator Label Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let appIndicatorTextColorChooser = new Gtk.ColorButton({ + use_alpha: true, + }); + color = new Gdk.RGBA(); + color.parse(this.indicatorTextColor); + appIndicatorTextColorChooser.set_rgba(color); + appIndicatorTextColorChooser.connect('color-set', ()=>{ + this.indicatorTextColor = appIndicatorTextColorChooser.get_rgba().to_string(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appIndicatorTextColorRow.add(appIndicatorTextColorLabel); + appIndicatorTextColorRow.add(appIndicatorTextColorChooser); + appIndicatorColorFrame.add(appIndicatorTextColorRow); + this.mainBox.append(appIndicatorColorFrame); + + let clearRecentAppsFrame = new PW.FrameBox(); + let clearRecentAppsRow = new PW.FrameBoxRow(); + let clearRecentAppsLabel = new Gtk.Label({ + label: _("Clear Apps Marked 'New'"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let clearRecentAppsButton = new Gtk.Button({ + halign: Gtk.Align.END, + label: _("Clear All"), + }); + let sensitive = this._settings.get_strv('recently-installed-apps').length > 0; + clearRecentAppsButton.set_sensitive(sensitive); + clearRecentAppsButton.connect('clicked', (widget) => { + clearRecentAppsButton.set_sensitive(false); + this._settings.reset('recently-installed-apps'); + }); + clearRecentAppsRow.add(clearRecentAppsLabel); + clearRecentAppsRow.add(clearRecentAppsButton); + clearRecentAppsFrame.add(clearRecentAppsRow); + this.mainBox.append(clearRecentAppsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.disableRecentApps = this._settings.get_default_value('disable-recently-installed-apps').unpack(); + this.indicatorColor = this._settings.get_default_value('indicator-color').unpack(); + this.indicatorTextColor = this._settings.get_default_value('indicator-text-color').unpack(); + recentAppsSwitch.set_active(this.disableRecentApps); + let color = new Gdk.RGBA(); + color.parse(this.indicatorColor); + appIndicatorColorChooser.set_rgba(color); + color.parse(this.indicatorTextColor); + appIndicatorTextColorChooser.set_rgba(color); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_boolean('disable-recently-installed-apps', this.disableRecentApps); + this._settings.set_string('indicator-color', this.indicatorColor); + this._settings.set_string('indicator-text-color', this.indicatorTextColor); + this._settings.set_boolean('reload-theme', true); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.disableRecentApps !== this._settings.get_default_value('disable-recently-installed-apps').unpack() || + this.indicatorColor !== this._settings.get_default_value('indicator-color').unpack() || + this.indicatorTextColor !== this._settings.get_default_value('indicator-text-color').unpack() + ) ? true : false; + } +}); + +var MenuSettingsSearchOptionsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsSearchOptionsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.searchResultsDetails = this._settings.get_boolean('show-search-result-details'); + this.openWindowsSearchProvider = this._settings.get_boolean('search-provider-open-windows'); + this.recentFilesSearchProvider = this._settings.get_boolean('search-provider-recent-files'); + this.highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + this.maxSearchResults = this._settings.get_int('max-search-results'); + + let searchProvidersFrame = new PW.FrameBox(); + let searchProvidersLabel = new Gtk.Label({ + label: "" + _("Search Providers") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(searchProvidersLabel); + let openWindowsRow = new PW.FrameBoxRow(); + let openWindowsLabel = new Gtk.Label({ + label: _("Search for open windows across all workspaces"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let openWindowsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + openWindowsSwitch.set_active(this.openWindowsSearchProvider); + openWindowsSwitch.connect('notify::active', (widget) => { + this.openWindowsSearchProvider = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + openWindowsRow.add(openWindowsLabel); + openWindowsRow.add(openWindowsSwitch); + searchProvidersFrame.add(openWindowsRow); + + let recentFilesRow = new PW.FrameBoxRow(); + let recentFilesLabel = new Gtk.Label({ + label: _("Search for recent files"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let recentFilesSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + recentFilesSwitch.set_active(this.recentFilesSearchProvider); + recentFilesSwitch.connect('notify::active', (widget) => { + this.recentFilesSearchProvider = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + recentFilesRow.add(recentFilesLabel); + recentFilesRow.add(recentFilesSwitch); + searchProvidersFrame.add(recentFilesRow); + this.mainBox.append(searchProvidersFrame); + + let searchOptionsFrame = new PW.FrameBox(); + let searchOptionsLabel = new Gtk.Label({ + label: "" + _("Search Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(searchOptionsLabel); + let descriptionsRow = new PW.FrameBoxRow(); + let descriptionsLabel = new Gtk.Label({ + label: _("Show descriptions of search results"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let descriptionsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + descriptionsSwitch.set_active(this.searchResultsDetails); + descriptionsSwitch.connect('notify::active', (widget) => { + this.searchResultsDetails = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + descriptionsRow.add(descriptionsLabel); + descriptionsRow.add(descriptionsSwitch); + searchOptionsFrame.add(descriptionsRow); + + let highlightSearchResultRow = new PW.FrameBoxRow(); + let highlightSearchResultLabel = new Gtk.Label({ + label: _("Highlight search result terms"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let highlightSearchResultSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + highlightSearchResultSwitch.set_active(this.highlightSearchResultTerms); + highlightSearchResultSwitch.connect('notify::active', (widget) => { + this.highlightSearchResultTerms = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + highlightSearchResultRow.add(highlightSearchResultLabel); + highlightSearchResultRow.add(highlightSearchResultSwitch); + searchOptionsFrame.add(highlightSearchResultRow); + + let maxSearchResultsRow = new PW.FrameBoxRow(); + let maxSearchResultsLabel = new Gtk.Label({ + label: _('Max Search Results'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let maxSearchResultsScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 2, + upper: 10, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + maxSearchResultsScale.set_value(this.maxSearchResults); + maxSearchResultsScale.connect('value-changed', (widget) => { + this.maxSearchResults = widget.get_value(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + maxSearchResultsRow.add(maxSearchResultsLabel); + maxSearchResultsRow.add(maxSearchResultsScale); + searchOptionsFrame.add( maxSearchResultsRow); + this.mainBox.append(searchOptionsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.searchResultsDetails = this._settings.get_default_value('show-search-result-details').unpack(); + this.openWindowsSearchProvider = this._settings.get_default_value('search-provider-open-windows').unpack(); + this.recentFilesSearchProvider = this._settings.get_default_value('search-provider-recent-files').unpack(); + this.highlightSearchResultTerms = this._settings.get_default_value('highlight-search-result-terms').unpack(); + this.maxSearchResults = this._settings.get_default_value('max-search-results').unpack(); + descriptionsSwitch.set_active(this.searchResultsDetails); + openWindowsSwitch.set_active(this.openWindowsSearchProvider); + highlightSearchResultSwitch.set_active(this.highlightSearchResultTerms); + maxSearchResultsScale.set_value(this.maxSearchResults); + recentFilesSwitch.set_active(this.recentFilesSearchProvider); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_boolean('show-search-result-details', this.searchResultsDetails); + this._settings.set_boolean('search-provider-open-windows', this.openWindowsSearchProvider); + this._settings.set_boolean('search-provider-recent-files', this.recentFilesSearchProvider); + this._settings.set_boolean('highlight-search-result-terms', this.highlightSearchResultTerms); + this._settings.set_int('max-search-results', this.maxSearchResults); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.searchResultsDetails !== this._settings.get_default_value('show-search-result-details').unpack() || + this.openWindowsSearchProvider !== this._settings.get_default_value('search-provider-open-windows').unpack() || + this.recentFilesSearchProvider !== this._settings.get_default_value('search-provider-recent-files').unpack() || + this.highlightSearchResultTerms !== this._settings.get_default_value('highlight-search-result-terms').unpack() || + this.maxSearchResults !== this._settings.get_default_value('max-search-results').unpack()) ? true : false; + } +}); + +var MenuSettingsCategoriesPage = GObject.registerClass( + class Arc_Menu_MenuSettingsCategoriesPage extends Gtk.Box { + _init(settings, settingType) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.settingType = settingType; + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.categoriesFrame = new PW.FrameBox(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._createFrame(this._settings.get_value(this.settingType).deep_unpack()); + this.mainBox.append(this.categoriesFrame); + + this.buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + this.categoriesFrame.remove_all_children(); + this._createFrame(this._settings.get_default_value(this.settingType).deep_unpack()); + this.categoriesFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < this.categoriesFrame.count; i++) { + let frame = this.categoriesFrame.get_index(i); + array.push([frame._enum, frame._shouldShow]); + } + this._settings.set_value(this.settingType, new GLib.Variant('a(ib)', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + this.buttonRow.append(this.resetButton); + this.buttonRow.append(this.saveButton); + this.append(this.buttonRow); + } + + getSensitive(){ + let defaultExtraCategories = this._settings.get_default_value(this.settingType).deep_unpack(); + let currentExtraCategories = this._settings.get_value(this.settingType).deep_unpack(); + return !Utils.getArraysEqual(defaultExtraCategories, currentExtraCategories); + } + + _createFrame(extraCategories){ + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let name = Constants.Categories[categoryEnum].NAME; + + let frameRow = new PW.FrameBoxDragRow(this); + frameRow._enum = extraCategories[i][0]; + frameRow._shouldShow = extraCategories[i][1]; + frameRow._name = Constants.Categories[categoryEnum].NAME; + frameRow._gicon = Gio.icon_new_for_string(Constants.Categories[categoryEnum].ICON); + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + frameRow.hasSwitch = true; + frameRow.switchActive = frameRow._shouldShow; + + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(name), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.categoriesFrame, + buttons: [this.saveButton, this.resetButton], + }); + + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + }); + + modifyButton.set_active(frameRow._shouldShow); + modifyButton.connect('notify::active', ()=> { + frameRow._shouldShow = modifyButton.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + buttonBox.insert_column(0); + buttonBox.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + buttonBox.insert_column(0); + buttonBox.attach(modifyButton, 0, 0, 1, 1); + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + this.categoriesFrame.add(frameRow); + } + } +}); + +var ColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ColorThemeDialogWindow extends PW.DialogWindow { + _init(settings, parent, themeName="") { + this._settings = settings; + this.addResponse = false; + this.themeName = themeName; + super._init(_('Color Theme Name'), parent); + } + + _createLayout(vbox) { + let nameFrameRow = new PW.FrameBoxRow(); + let nameFrameLabel = new Gtk.Label({ + label: _('Name:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + nameFrameRow.add(nameFrameLabel); + this.nameEntry = new Gtk.Entry(); + this.nameEntry.set_width_chars(35); + + nameFrameRow.add(this.nameEntry); + this.nameEntry.grab_focus(); + if(this.themeName!=""){ + this.nameEntry.set_text(this.themeName); + } + this.nameEntry.connect('changed',()=>{ + if(this.nameEntry.get_text().length > 0) + saveButton.set_sensitive(true); + else + saveButton.set_sensitive(false); + }); + + vbox.append(nameFrameRow); + let saveButton = new Gtk.Button({ + label: _("Save Theme"), + halign: Gtk.Align.END + }); + saveButton.set_sensitive(false); + saveButton.connect('clicked', ()=> { + this.themeName = this.nameEntry.get_text(); + this.addResponse=true; + this.response(-10); + }); + vbox.append(saveButton); + } + get_response(){ + return this.addResponse; + } +}); + +var ExportColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ExportColorThemeDialogWindow extends PW.DialogWindow { + + _init(settings, parent, themes=null) { + this._settings = settings; + this._themes = themes; + this.addResponse = false; + this.selectedThemes = []; + super._init(this._themes ? _('Select Themes to Import'): _('Select Themes to Export'), parent); + } + + _createLayout(vbox) { + vbox.spacing = 0; + this.checkButtonArray = []; + this.shouldToggle =true; + let themesListScrollWindow = new Gtk.ScrolledWindow(); + themesListScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themesListScrollWindow.set_max_content_height(300); + themesListScrollWindow.set_min_content_height(300); + themesListScrollWindow.set_min_content_width(500); + themesListScrollWindow.set_min_content_width(500); + this.mainFrame = new PW.FrameBox(); + + let themesListButton = new Gtk.Button({ + label: this._themes ?_("Import"): _("Export"), + }); + + themesListButton.connect('clicked', () => { + this.addResponse = true; + this.response(-10); + }); + themesListButton.set_halign(Gtk.Align.END); + + themesListScrollWindow.set_child(this.mainFrame); + this.checkAllButton = new Gtk.CheckButton({ + margin_end: 23 + }); + + this.checkAllButton.set_halign(Gtk.Align.END); + this.checkAllButton.set_active(true); + this.checkAllButton.connect('toggled', () => { + let isActive = this.checkAllButton.get_active(); + if(this.shouldToggle){ + for(let i = 0; i< this.checkButtonArray.length; i++){ + this.checkButtonArray[i].set_active(isActive); + } + } + }); + let checkAllRow = new PW.FrameBoxRow(); + let checkAllLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + hexpand: true, + label: _("Select All"), + halign: Gtk.Align.END + }); + checkAllRow.add(checkAllLabel); + checkAllRow.add(this.checkAllButton); + vbox.append(checkAllRow); + vbox.append(themesListScrollWindow); + vbox.append(new PW.FrameBoxRow()); + vbox.append(themesListButton); + + this.color_themes = this._themes ? this._themes : this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i< this.color_themes.length; i++) { + let theme = this.color_themes[i]; + let frameRow = new PW.FrameBoxRow(); + + let themeBox = new Gtk.Box(); + + let frameLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + label: theme[0], + hexpand: true + }); + + let xpm = Utils.createXpmImage(theme[1], theme[2], theme[4], theme[5]); + let presetPreview = new Gtk.Image({ + hexpand: false, + margin_end: 5, + pixel_size: 42 + }); + presetPreview.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_xpm_data(xpm)); + themeBox.append(presetPreview); + themeBox.append(frameLabel); + frameRow.add(themeBox); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', () => { + if(checkButton.get_active()){ + this.selectedThemes.push(theme); + } + else{ + this.shouldToggle = false; + this.checkAllButton.set_active(false); + this.shouldToggle = true; + let index= this.selectedThemes.indexOf(theme); + this.selectedThemes.splice(index,1); + } + }); + this.checkButtonArray.push(checkButton); + frameRow.add(checkButton); + this.mainFrame.add(frameRow); + checkButton.set_active(true); + } + } + get_response(){ + return this.addResponse; + } +}); + +var ManageColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ManageColorThemeDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + this.selectedThemes = []; + super._init( _('Manage Presets'), parent); + } + + _createLayout(vbox) { + let themesListScrollWindow = new Gtk.ScrolledWindow(); + themesListScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themesListScrollWindow.set_max_content_height(300); + themesListScrollWindow.set_min_content_height(300); + themesListScrollWindow.set_min_content_width(500); + themesListScrollWindow.set_min_content_width(500); + this.mainFrame = new PW.FrameBox(); + let buttonRow = new PW.FrameBoxRow(); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + applyButton.set_sensitive(false); + applyButton.connect('clicked', () => { + this.addResponse = true; + this.response(-10); + }); + applyButton.set_halign(Gtk.Align.END); + + themesListScrollWindow.set_child(this.mainFrame); + vbox.append(themesListScrollWindow); + buttonRow.add(applyButton); + vbox.append(buttonRow); + + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i< this.color_themes.length; i++) { + let theme = this.color_themes[i]; + let frameRow = new PW.FrameBoxRow(); + let themeBox = new Gtk.Box(); + + let frameLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + label: theme[0], + hexpand: true + }); + let xpm = Utils.createXpmImage(theme[1], theme[2], theme[4], theme[5]); + let presetPreview = new Gtk.Image({ + hexpand: false, + margin_end: 5, + pixel_size: 42 + }); + presetPreview.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_xpm_data(xpm)); + + themeBox.append(presetPreview); + themeBox.append(frameLabel); + frameRow.add(themeBox); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.mainFrame, + buttons: [applyButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', () => { + let dialog = new ColorThemeDialogWindow(this._settings, this, theme[0]); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()) { + let index = frameRow.get_index(); + let array = [dialog.themeName, theme[1], theme[2], theme[3], theme[4], theme[5], + theme[6], theme[7], theme[8], theme[9], theme[10], theme[11], theme[12]]; + this.color_themes.splice(index,1,array); + theme = array; + frameLabel.label = dialog.themeName; + dialog.destroy(); + } + else + dialog.destroy(); + }); + applyButton.set_sensitive(true); + }); + buttonBox.connect('move-up', () => { + let index = frameRow.get_index(); + if(index > 0){ + this.color_themes.splice(index, 1); + this.color_themes.splice(index - 1, 0, theme); + } + }); + + buttonBox.connect('move-down', () => { + let index = frameRow.get_index(); + if(index + 1 < this.mainFrame.count){ + this.color_themes.splice(index, 1); + this.color_themes.splice(index + 1, 0, theme); + } + }); + + buttonBox.connect('delete', () => { + let index = frameRow.get_index(); + this.color_themes.splice(index, 1); + }); + + frameRow.add(buttonBox); + this.mainFrame.add(frameRow); + } + } + get_response(){ + return this.addResponse; + } +}); + +var OverrideArcMenuThemeWindow = GObject.registerClass({ + Signals: { + 'menu-theme-response': { param_types: [GObject.TYPE_INT] }, + }, +}, + class Arc_Menu_OverrideArcMenuThemeWindow extends Gtk.Box { + _init(settings, parentBox, parentMainBox) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + }); + this.parentBox = parentBox; + this._parentMainBox = parentMainBox; + this._settings = settings; + this.addResponse = false; + this.heightValue = this._settings.get_int('menu-height'); + this.rightPanelWidth = this._settings.get_int('right-panel-width'); + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.customArcMenu = this._settings.get_boolean('enable-custom-arc-menu'); + + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.menuWidth = this._settings.get_int('menu-width'); + this.updatePresetComboBox = true; + this.shouldDeselect = true; + this._createLayout(this); + } + createIconList(store){ + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i= 0; i" + _('Menu Theme Presets') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + vbox.append(colorPresetHeaderLabel); + + this.colorPresetFrame = new PW.FrameBox(); + let colorPresetRow = new PW.FrameBoxRow(); + let colorPresetLabel = new Gtk.Label({ + label: _('Current Menu Theme Preset'), + xalign:0, + hexpand: true, + }); + let store = new Gtk.ListStore(); + store.set_column_types([GdkPixbuf.Pixbuf, GObject.TYPE_STRING]); + this.colorPresetCombo = new Gtk.ComboBox({ + model: store, + }); + + this.createIconList(store); + + let renderer = new Gtk.CellRendererPixbuf({xpad: 5}); + this.colorPresetCombo.pack_start(renderer, false); + this.colorPresetCombo.add_attribute(renderer, "pixbuf", 0); + renderer = new Gtk.CellRendererText(); + this.colorPresetCombo.pack_start(renderer, true); + this.colorPresetCombo.add_attribute(renderer, "text", 1); + + this.saveButton = new Gtk.Button({ + label: _("Save as Preset"), + hexpand: true, + halign: Gtk.Align.END + }); + this.checkIfPresetMatch(); + this.colorPresetCombo.connect('changed', (widget) => { + if(this.updatePresetComboBox){ + let index = widget.get_active(); + /*let defaultArray = ["Theme Name","Background Color", "Foreground Color","Border Color", "Highlight Color", "Hightlight Foreground Color", "Separator Color" + , "Font Size", "Border Size", "Corner Radius", "Arrow Size", "Menu Displacement", "Vertical Separator"];*/ + if(index>=0){ + this.menuColor = this.color_themes[index][1]; + this.menuForegroundColor = this.color_themes[index][2]; + this.borderColor = this.color_themes[index][3]; + this.highlightColor = this.color_themes[index][4]; + this.highlightForegroundColor = this.color_themes[index][5]; + this.separatorColor = this.color_themes[index][6]; + this.fontSize = parseInt(this.color_themes[index][7]); + this.borderSize = parseInt(this.color_themes[index][8]); + this.cornerRadius = parseInt(this.color_themes[index][9]); + this.menuArrowSize = parseInt(this.color_themes[index][10]); + this.menuMargin = parseInt(this.color_themes[index][11]); + this.verticalSeparator = (this.color_themes[index][12] === 'true'); + + this.shouldDeselect = false; + this.presetName=this.color_themes[index][0]; + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + + fontScale.set_value(this.fontSize); + + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + + borderScale.set_value(this.borderSize); + + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + + cornerScale.set_value(this.cornerRadius); + marginScale.set_value(this.menuMargin); + arrowScale.set_value(this.menuArrowSize); + + vertSeparatorSwitch.set_active(this.verticalSeparator); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + this.saveButton.set_sensitive(false); + applyButton.set_sensitive(true); + this.shouldDeselect = true; + resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + } + } + }); + colorPresetRow.add(colorPresetLabel); + colorPresetRow.add(this.colorPresetCombo); + this.colorPresetFrame.add(colorPresetRow); + + let presetsButtonRow = new PW.FrameBoxRow(); + + this.saveButton.connect('clicked', () => { + /*let defaultArray = ["Theme Name","Background Color", "Foreground Color","Border Color", "Highlight Color", "Separator Color" + , "Font Size", "Border Size", "Corner Radius", "Arrow Size", "Menu Displacement", "Vertical Separator"];*/ + let dialog = new ColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let array = [dialog.themeName, this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + this.color_themes.push(array); + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + + let manageButton = new Gtk.Button({ + label: _("Manage Presets") + }); + manageButton.connect('clicked', ()=> { + let dialog = new ManageColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response)=>{ + if(dialog.get_response()){ + this.color_themes = dialog.color_themes; + this._settings.set_value('color-themes',new GLib.Variant('aas',dialog.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + let addButton = new PW.Button({ + title: _("Browse Presets"), + icon_name: "browse-presets-symbolic", + hexpand: false + }); + addButton.connect('clicked', () => { + let settingsFile = Gio.File.new_for_path(Me.path + '/media/misc/ArcMenuDefaultPresets'); + let [ success, content, etags] = settingsFile.load_contents(null); + let string = ByteArray.toString(content); + let themes = string.split("\n") + themes.pop(); //remove last blank array + let colorThemes = []; + for(let i = 0; i < themes.length; i++){ + let array = themes[i].split('//') + array.pop(); + colorThemes.push(array); + } + let dialog = new ExportColorThemeDialogWindow(this._settings, this, colorThemes); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let selectedThemes = dialog.selectedThemes; + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < selectedThemes.length; i++){ + this.color_themes.push(selectedThemes[i]); + } + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + + presetsButtonRow.add(manageButton); + presetsButtonRow.add(addButton); + presetsButtonRow.add(this.saveButton); + this.colorPresetFrame.add(presetsButtonRow); + vbox.append(this.colorPresetFrame); + + this._settings.connect("changed::color-themes", () => { + store.clear(); + this.createIconList(store); + this.colorPresetCombo.model = store; + this.colorPresetCombo.show(); + + this.checkIfPresetMatch(); + }); + + let menuSettingsHeaderLabel = new Gtk.Label({ + label: "" + _('Theme Settings') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + vbox.append(menuSettingsHeaderLabel); + + let themeSettingsFrame = new PW.FrameBox(); + let themeSettingsFrameScrollWindow = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + themeSettingsFrameScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themeSettingsFrameScrollWindow.set_min_content_height(250); + themeSettingsFrameScrollWindow.set_child(themeSettingsFrame); + vbox.append(themeSettingsFrameScrollWindow); + + //ROW 1 - MENU BACKGROUND COLOR-------------------------------------- + let menuBackgroudColorRow = new PW.FrameBoxRow(); + let menuBackgroudColorLabel = new Gtk.Label({ + label: _('Menu Background Color'), + xalign:0, + hexpand: true, + }); + let menuBackgroudColorChooser = new Gtk.ColorButton({use_alpha:true}); + let color = new Gdk.RGBA(); + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + menuBackgroudColorChooser.connect('color-set', () => { + this.menuColor = menuBackgroudColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuBackgroudColorRow.add(menuBackgroudColorLabel); + menuBackgroudColorRow.add(menuBackgroudColorChooser); + themeSettingsFrame.add(menuBackgroudColorRow); + + //ROW 2 - MENU FOREGROUND COLOR-------------------------------------- + let menuForegroundColorRow = new PW.FrameBoxRow(); + let menuForegroundColorLabel = new Gtk.Label({ + label: _('Menu Foreground Color'), + xalign:0, + hexpand: true, + }); + let menuForegroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + menuForegroundColorChooser.connect('color-set', () => { + this.menuForegroundColor = menuForegroundColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuForegroundColorRow.add(menuForegroundColorLabel); + menuForegroundColorRow.add(menuForegroundColorChooser); + themeSettingsFrame.add(menuForegroundColorRow); + + //ROW 3 - FONT SIZE-------------------------------------------------- + let fontSizeRow = new PW.FrameBoxRow(); + let fontSizeLabel = new Gtk.Label({ + label: _('Font Size'), + xalign:0, + hexpand: true, + }); + + let fontScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 8, upper: 14, step_increment: 1, page_increment: 1, page_size: 0 }), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + fontScale.set_format_value_func( (scale, value) => { + return value + "pt"; + }); + fontScale.set_value(this.fontSize); + fontScale.connect('value-changed', () => { + this.fontSize = fontScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + fontSizeRow.add(fontSizeLabel); + fontSizeRow.add(fontScale); + themeSettingsFrame.add(fontSizeRow); + + //ROW 4- Border Color------------------------------------------------- + let borderColorRow = new PW.FrameBoxRow(); + let borderColorLabel = new Gtk.Label({ + label: _('Border Color'), + xalign:0, + hexpand: true, + }); + let borderColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + borderColorChooser.connect('color-set', ()=>{ + this.borderColor = borderColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + borderColorRow.add(borderColorLabel); + borderColorRow.add(borderColorChooser); + themeSettingsFrame.add(borderColorRow); + + //ROW 5 - Border Size------------------------------------------------------- + let borderSizeRow = new PW.FrameBoxRow(); + let borderSizeLabel = new Gtk.Label({ + label: _('Border Size'), + xalign:0, + hexpand: true, + }); + let borderScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 4, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + borderScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + borderScale.set_value(this.borderSize); + borderScale.connect('value-changed', () => { + this.borderSize = borderScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + borderSizeRow.add(borderSizeLabel); + borderSizeRow.add(borderScale); + themeSettingsFrame.add(borderSizeRow); + + //ROW 6 - Active Item Background Color----------------------------------------------- + let itemColorRow = new PW.FrameBoxRow(); + let itemColorLabel = new Gtk.Label({ + label: _('Active Item Background Color'), + xalign:0, + hexpand: true, + }); + let itemColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + itemColorChooser.connect('color-set', () => { + this.highlightColor = itemColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + itemColorRow.add(itemColorLabel); + itemColorRow.add(itemColorChooser); + themeSettingsFrame.add(itemColorRow); + + //ROW 7 - Active Item Foreground Color----------------------------------------------- + let itemForegroundColorRow = new PW.FrameBoxRow(); + let itemForegroundColorLabel = new Gtk.Label({ + label: _('Active Item Foreground Color'), + xalign:0, + hexpand: true, + }); + let itemForegroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + itemForegroundColorChooser.connect('color-set', () => { + this.highlightForegroundColor = itemForegroundColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + itemForegroundColorRow.add(itemForegroundColorLabel); + itemForegroundColorRow.add(itemForegroundColorChooser); + themeSettingsFrame.add(itemForegroundColorRow); + + //ROW 8 - Corner Radius----------------------------------------------------- + let cornerRadiusRow = new PW.FrameBoxRow(); + let cornerRadiusLabel = new Gtk.Label({ + label: _('Corner Radius'), + xalign:0, + hexpand: true, + }); + let cornerScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 20, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + cornerScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + cornerScale.set_value(this.cornerRadius); + cornerScale.connect('value-changed', () => { + this.cornerRadius = cornerScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + cornerRadiusRow.add(cornerRadiusLabel); + cornerRadiusRow.add(cornerScale); + themeSettingsFrame.add(cornerRadiusRow); + + //ROW 9 - Menu Arrow Size------------------------------------------------------- + let menuMarginRow = new PW.FrameBoxRow(); + let menuMarginLabel = new Gtk.Label({ + label: _('Menu Arrow Size'), + xalign:0, + hexpand: true, + }); + let marginScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 30, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + marginScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + marginScale.set_value(this.menuMargin); + marginScale.connect('value-changed', () => { + this.menuMargin = marginScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuMarginRow.add(menuMarginLabel); + menuMarginRow.add(marginScale); + themeSettingsFrame.add(menuMarginRow); + + //ROW 10 - Menu Displacement------------------------------------------------------ + let menuArrowRow = new PW.FrameBoxRow(); + let menuArrowLabel = new Gtk.Label({ + label: _('Menu Displacement'), + xalign:0, + hexpand: true, + }); + let arrowScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 20, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + arrowScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + arrowScale.set_value(this.menuArrowSize); + arrowScale.connect('value-changed', () => { + this.menuArrowSize = arrowScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuArrowRow.add(menuArrowLabel); + menuArrowRow.add(arrowScale); + themeSettingsFrame.add(menuArrowRow); + + //ROW 11 - Vertical Separator------------------------------------------------------ + let vertSeparatorRow = new PW.FrameBoxRow(); + let vertSeparatorLabel = new Gtk.Label({ + label: _('Enable Vertical Separator'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let vertSeparatorSwitch = new Gtk.Switch({ halign: Gtk.Align.END}); + vertSeparatorSwitch.set_active(this.verticalSeparator); + vertSeparatorSwitch.connect('notify::active', (widget) => { + this.verticalSeparator = widget.get_active(); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + applyButton.set_sensitive(true); + resetButton.set_sensitive(true); + }); + vertSeparatorRow.add(vertSeparatorLabel); + vertSeparatorRow.add(vertSeparatorSwitch); + themeSettingsFrame.add(vertSeparatorRow); + + //ROW 12 - Separator Color------------------------------------------------------ + let separatorColorRow = new PW.FrameBoxRow(); + let separatorColorLabel = new Gtk.Label({ + label: _('Separator Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let colorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + colorChooser.connect('color-set', ()=>{ + this.separatorColor = colorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + separatorColorRow.add(separatorColorLabel); + separatorColorRow.add(colorChooser); + themeSettingsFrame.add(separatorColorRow); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this._parentMainBox.buttonRow = buttonRow; + let resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + valign: Gtk.Align.END, + vexpand: false + }); + resetButton.set_sensitive( this.checkIfResetButtonSensitive()); + resetButton.connect('clicked', ()=> { + this.separatorColor = this._settings.get_default_value('separator-color').unpack(); + this.verticalSeparator = this._settings.get_default_value('vert-separator').unpack(); + this.menuColor = this._settings.get_default_value('menu-color').unpack(); + this.menuForegroundColor = this._settings.get_default_value('menu-foreground-color').unpack(); + this.borderColor = this._settings.get_default_value('border-color').unpack(); + this.highlightColor = this._settings.get_default_value('highlight-color').unpack(); + this.highlightForegroundColor = this._settings.get_default_value('highlight-foreground-color').unpack(); + this.fontSize = this._settings.get_default_value('menu-font-size').unpack(); + this.borderSize = this._settings.get_default_value('menu-border-size').unpack(); + this.cornerRadius = this._settings.get_default_value('menu-corner-radius').unpack(); + this.menuMargin = this._settings.get_default_value('menu-margin').unpack(); + this.menuArrowSize = this._settings.get_default_value('menu-arrow-size').unpack(); + + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + + fontScale.set_value(this.fontSize); + + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + + borderScale.set_value(this.borderSize); + + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + + cornerScale.set_value(this.cornerRadius); + marginScale.set_value(this.menuMargin); + arrowScale.set_value(this.menuArrowSize); + + vertSeparatorSwitch.set_active(this.verticalSeparator); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + + resetButton.set_sensitive(false); + applyButton.set_sensitive(true); + }); + + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + halign: Gtk.Align.END + }); + applyButton.connect('clicked', ()=> { + applyButton.set_sensitive(false); + this.emit('menu-theme-response', -10); + }); + applyButton.set_sensitive(false); + + buttonRow.append(resetButton); + buttonRow.append(applyButton); + + this._parentMainBox.append(buttonRow); + } + get_response(){ + return this.addResponse; + } + checkIfPresetMatch(){ + this.presetName = "Custom Theme"; + let currentSettingsArray = [this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + let all_color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0;i < all_color_themes.length;i++){ + this.isEqual=true; + for(let l = 0; l { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array=[]; + for(let i = 0;i { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps([newPinnedApps],softwareShortcutsFrame); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + softwareShortcutsFrame.remove_all_children(); + this._loadPinnedApps(this._settings.get_default_value('directory-shortcuts-list').deep_unpack(), softwareShortcutsFrame); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < softwareShortcutsFrame.count; i++) { + let frame = softwareShortcutsFrame.get_index(i); + array.push([frame._name, frame._icon, frame._cmd]); + } + this._settings.set_value('directory-shortcuts-list', new GLib.Variant('aas', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + let currentShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + return !Utils.getArraysEqual(defaultShortcuts, currentShortcuts); + } + + _loadPinnedApps(applicationShortcuts,softwareShortcutsFrame){ + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = _(applicationShortcuts[i][0]); + let editable = true; + if(applicationShortcuts[i][2].startsWith("ArcMenu_")){ + editable = false; + } + + let frameRow = new PW.FrameBoxDragRow(this.softwareShortcutsScrollWindow); + frameRow._name = applicationName; + frameRow._icon = applicationShortcuts[i][1]; + frameRow._gicon = Gio.icon_new_for_string(getIconPath(applicationShortcuts[i])); + frameRow._cmd = applicationShortcuts[i][2]; + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(applicationName), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: softwareShortcutsFrame, + buttons: [this.resetButton, this.saveButton], + modifyButton: editable, + deleteButton: true + }); + + if(editable){ + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newApplicationShortcut = dialog.get_newPinnedAppsArray(); + frameRow._name = newApplicationShortcut[0]; + frameRow._icon = newApplicationShortcut[1]; + frameRow._cmd = newApplicationShortcut[2]; + softwareShortcutsLabel.label = _(frameRow._name); + applicationIcon.gicon = Gio.icon_new_for_string(frameRow._icon); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(true); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + } + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + softwareShortcutsFrame.add(frameRow); + } + } +}); +var MenuSettingsShortcutApplicationsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsShortcutApplicationsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + let softwareShortcutsFrame = new PW.FrameBox(); + this.softwareShortcutsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.softwareShortcutsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + this.softwareShortcutsScrollWindow.set_min_content_height(300); + this.softwareShortcutsScrollWindow.set_child(softwareShortcutsFrame); + + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._loadPinnedApps(applicationShortcuts,softwareShortcutsFrame); + this.mainBox.append(this.softwareShortcutsScrollWindow); + + let addPinnedAppsFrame = new PW.FrameBox(); + let addPinnedAppsFrameRow = new PW.FrameBoxRow(); + let addPinnedAppsFrameLabel = new Gtk.Label({ + label: _("Add More Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addPinnedAppsButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addPinnedAppsButton.connect('clicked', ()=> { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array=[]; + for(let i = 0;i { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps([newPinnedApps],softwareShortcutsFrame); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + softwareShortcutsFrame.remove_all_children(); + this._loadPinnedApps(this._settings.get_default_value('application-shortcuts-list').deep_unpack(), softwareShortcutsFrame); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < softwareShortcutsFrame.count; i++) { + let frame = softwareShortcutsFrame.get_index(i); + array.push([frame._name,frame._icon, frame._cmd]); + } + this._settings.set_value('application-shortcuts-list', new GLib.Variant('aas', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultShortcuts = this._settings.get_default_value('application-shortcuts-list').deep_unpack(); + let currentShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + return !Utils.getArraysEqual(defaultShortcuts, currentShortcuts); + } + + _loadPinnedApps(applicationShortcuts,softwareShortcutsFrame){ + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + + let frameRow = new PW.FrameBoxDragRow(this.softwareShortcutsScrollWindow); + let iconString; + frameRow._name = applicationShortcuts[i][0]; + frameRow._icon = applicationShortcuts[i][1]; + frameRow._cmd = applicationShortcuts[i][2]; + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + iconString = frameRow._icon; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString); + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(applicationName), + use_markup: true, + xalign: 0, + hexpand: true + }); + + checkIfValidShortcut(frameRow, softwareShortcutsLabel, applicationIcon); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: softwareShortcutsFrame, + buttons: [this.saveButton, this.resetButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newApplicationShortcut = dialog.get_newPinnedAppsArray(); + frameRow._name = newApplicationShortcut[0]; + frameRow._icon = newApplicationShortcut[1]; + frameRow._cmd = newApplicationShortcut[2]; + softwareShortcutsLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + applicationIcon.gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(true); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + softwareShortcutsFrame.add(frameRow); + } + } +}); +var MenuSettingsPowerOptionsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsPowerOptionsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.powerOptionsFrame = new PW.FrameBox(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._createFrame(this._settings.get_value("power-options").deep_unpack()); + this.mainBox.append(this.powerOptionsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + this.powerOptionsFrame.remove_all_children(); + this._createFrame(this._settings.get_default_value('power-options').deep_unpack()); + this.powerOptionsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < this.powerOptionsFrame.count; i++) { + let frame = this.powerOptionsFrame.get_index(i); + array.push([frame._enum, frame._shouldShow]); + } + this._settings.set_value('power-options', new GLib.Variant('a(ib)', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultPowerOptions = this._settings.get_default_value("power-options").deep_unpack(); + let currentPowerOptions = this._settings.get_value("power-options").deep_unpack(); + return !Utils.getArraysEqual(defaultPowerOptions, currentPowerOptions); + } + + _createFrame(powerOptions){ + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let name = Constants.PowerOptions[powerType].TITLE; + + let frameRow = new PW.FrameBoxDragRow(this); + frameRow._enum = powerOptions[i][0]; + frameRow._shouldShow = powerOptions[i][1]; + frameRow._name = Constants.PowerOptions[powerType].TITLE; + frameRow._gicon = Gio.icon_new_for_string(Constants.PowerOptions[powerType].IMAGE); + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + frameRow.hasSwitch = true; + frameRow.switchActive = frameRow._shouldShow; + + let powerIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let powerImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + powerImageBox.append(dragImage); + powerImageBox.append(powerIcon); + frameRow.add(powerImageBox); + + let powerLabel = new Gtk.Label({ + label: _(name), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.powerOptionsFrame, + buttons: [this.saveButton, this.resetButton], + }); + + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + }); + + modifyButton.set_active(frameRow._shouldShow); + modifyButton.connect('notify::active', ()=> { + frameRow._shouldShow = modifyButton.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + buttonBox.insert_column(0); + buttonBox.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + buttonBox.insert_column(0); + buttonBox.attach(modifyButton, 0, 0, 1, 1); + + frameRow.add(powerLabel); + frameRow.add(buttonBox); + this.powerOptionsFrame.add(frameRow); + } + } + }); + +var MiscPage = GObject.registerClass( + class Arc_Menu_MiscPage extends Gtk.ScrolledWindow { + _init(settings, parentBox) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let settingsHeaderLabel = new Gtk.Label({ + label: "" + _('Export or Import Settings') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(settingsHeaderLabel); + + let importFrame = new PW.FrameBox(); + let importRow = new PW.FrameBoxRow(); + let importLabel = new Gtk.Label({ + label: _("All ArcMenu Settings"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let settingsImportInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + settingsImportInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Export or Import All ArcMenu Settings"), + secondaryText: _('Importing settings from file may replace ALL saved settings.\nThis includes all saved pinned apps.'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + let importButtonsRow = new PW.FrameBoxRow(); + let importButton = new Gtk.Button({ + label: _("Import from File"), + hexpand: true, + vexpand: true, + }); + importButton.connect('clicked', ()=> { + this._showFileChooser( + _('Import settings'), + { action: Gtk.FileChooserAction.OPEN }, + "_Open", + filename => { + let settingsFile = Gio.File.new_for_path(filename); + let [ success_, pid, stdin, stdout, stderr] = + GLib.spawn_async_with_pipes( + null, + ['dconf', 'load', SCHEMA_PATH], + null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null + ); + + stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); + GLib.close(stdout); + GLib.close(stderr); + + stdin.splice(settingsFile.read(null), Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, null); + } + ); + }); + let exportButton = new Gtk.Button({ + label: _("Export to File"), + hexpand: true, + vexpand: true, + }); + exportButton.connect('clicked', ()=> { + this._showFileChooser( + _('Export settings'), + { action: Gtk.FileChooserAction.SAVE}, + "_Save", + (filename) => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + out.write_all(GLib.spawn_command_line_sync('dconf dump ' + SCHEMA_PATH)[1], null); + out.close(null); + } + ); + }); + + importRow.add(importLabel); + importRow.add(settingsImportInfoButton); + importButtonsRow.add(exportButton); + importButtonsRow.add(importButton); + importFrame.add(importRow); + importFrame.add(importButtonsRow); + this.mainBox.append(importFrame); + + let importColorPresetFrame = new PW.FrameBox(); + let importColorPresetRow = new PW.FrameBoxRow(); + let importColorPresetLabel = new Gtk.Label({ + label: _("Menu Theme Presets"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let colorThemesImportInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + colorThemesImportInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Export or Import Menu Theme Presets"), + secondaryText: _('Menu theme presets are located in the "Menu Theme" section'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + let importColorPresetButtonsRow = new PW.FrameBoxRow(); + let importColorPresetButton = new Gtk.Button({ + label: _("Import Theme Preset"), + hexpand: true, + vexpand: true, + }); + importColorPresetButton.connect('clicked', ()=> { + this._showFileChooser( + _('Import Theme Preset'), + { action: Gtk.FileChooserAction.OPEN }, + "_Open", + filename => { + let settingsFile = Gio.File.new_for_path(filename); + let [ success, content, etags] = settingsFile.load_contents(null); + let string = ByteArray.toString(content); + let themes = string.split("\n") + themes.pop(); //remove last blank array + this.color_themes = []; + for(let i = 0; i < themes.length; i++){ + let array = themes[i].split('//') + array.pop(); + this.color_themes.push(array); + } + let dialog = new ExportColorThemeDialogWindow(this._settings, this, this.color_themes); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let selectedThemes = dialog.selectedThemes; + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < selectedThemes.length; i++){ + this.color_themes.push(selectedThemes[i]); + } + + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + + dialog.destroy(); + } + else + dialog.destroy(); + }); + } + ); + }); + let exportColorPresetButton = new Gtk.Button({ + label: _("Export Theme Preset"), + hexpand: true, + vexpand: true, + }); + exportColorPresetButton.connect('clicked', ()=> { + let dialog = new ExportColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + this.selectedThemes = dialog.selectedThemes; + this._showFileChooser( + _('Export Theme Preset'), + { action: Gtk.FileChooserAction.SAVE }, + "_Save", + (filename) => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + for(let i = 0; i" + _('ArcMenu Settings Window Size') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(settingsSizeHeaderLabel); + + let settingsSizeFrame = new PW.FrameBox(); + let settingsWidthRow = new PW.FrameBoxRow(); + let settingsWidthLabel = new Gtk.Label({ + label: _('Window Width'), + xalign:0, + hexpand: false, + }); + let settingsWidthScale = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 850, upper: 1800, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + hexpand: true, + halign: Gtk.Align.END + }); + settingsWidthScale.set_value(this._settings.get_int("settings-width")); + settingsWidthScale.connect('value-changed', (widget) => { + this._settings.set_int("settings-width", widget.get_value()) + }); + settingsWidthRow.add(settingsWidthLabel); + settingsWidthRow.add(settingsWidthScale); + settingsSizeFrame.add(settingsWidthRow); + + let settingsHeightRow = new PW.FrameBoxRow(); + let settingsHeightLabel = new Gtk.Label({ + label: _('Window Height'), + xalign:0, + hexpand: false, + }); + let settingsHeightScale = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 300, upper: 1600, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + hexpand: true, + halign: Gtk.Align.END + }); + settingsHeightScale.set_value(this._settings.get_int("settings-height")); + settingsHeightScale.connect('value-changed', (widget) => { + this._settings.set_int("settings-height", widget.get_value()) + }); + settingsHeightRow.add(settingsHeightLabel); + settingsHeightRow.add(settingsHeightScale); + settingsSizeFrame.add(settingsHeightRow); + + this.mainBox.append(settingsSizeFrame); + + let resetSettingsButton = new Gtk.Button({ + valign: Gtk.Align.END, + halign: Gtk.Align.START, + vexpand: true, + hexpand: false, + label: _("Reset all Settings"), + }); + let context = resetSettingsButton.get_style_context(); + context.add_class('suggested-action'); + resetSettingsButton.connect('clicked', (widget) => { + let dialog = new Gtk.MessageDialog({ + text: "" + _("Restore Default Settings?") + '\n' + _("All ArcMenu settings will be reset to the default value."), + use_markup: true, + buttons: Gtk.ButtonsType.YES_NO, + message_type: Gtk.MessageType.WARNING, + transient_for: this.get_root(), + modal: true + }); + dialog.connect('response', (widget, response) => { + if(response == Gtk.ResponseType.YES){ + GLib.spawn_command_line_sync('dconf reset -f /org/gnome/shell/extensions/arcmenu/'); + let children = [...parentBox.settingsFrameStack]; + for(let child of children){ + parentBox.settingsFrameStack.remove(child); + } + parentBox.populateSettingsFrameStack(); + } + dialog.destroy(); + }); + dialog.show(); + }); + + this.mainBox.append(resetSettingsButton); + } + _showFileChooser(title, params, acceptBtn, acceptHandler) { + let dialog = new Gtk.FileChooserDialog({ + title: _(title), + transient_for: this.get_root(), + modal: true, + action: params.action, + }); + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button(acceptBtn, Gtk.ResponseType.ACCEPT); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + try { + acceptHandler(dialog.get_file().get_path()); + } catch(e) { + log('error from ArcMenu filechooser: ' + e); + } + } + dialog.destroy(); + }); + + dialog.show(); + } + }); + function mergeObjects(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + return main; + }; + +var AboutPage = GObject.registerClass( + class Arc_Menu_AboutPage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_start: 24, + margin_end: 24, + spacing: 0, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let releaseVersion; + if(Me.metadata.version) + releaseVersion = Me.metadata.version; + else + releaseVersion = 'unknown'; + + let commitVersion; + if(Me.metadata.commit) + commitVersion = Me.metadata.commit; + + let projectUrl = Me.metadata.url; + + let arcMenuImage = new Gtk.Image({ + margin_bottom: 5, + icon_name: 'arc-menu-logo', + pixel_size: 100, + }); + let arcMenuImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_top: 10, + margin_bottom: 10, + hexpand: false, + vexpand: false + }); + arcMenuImageBox.append(arcMenuImage); + + let extensionInfoFrame = new PW.FrameBox(); + + let arcMenuVersionRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let versionText = new Gtk.Label({ + label: _('ArcMenu Version'), + }); + let versionInfo = new Gtk.Label({ + label: releaseVersion + '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + arcMenuVersionRow.add(versionText); + arcMenuVersionRow.add(versionInfo); + extensionInfoFrame.add(arcMenuVersionRow); + + let commitRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let commitText = new Gtk.Label({ + label: _('Git Commit'), + }); + let commitInfo = new Gtk.Label({ + label: commitVersion ? commitVersion : '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + commitRow.add(commitText); + commitRow.add(commitInfo); + if(commitVersion){ + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(commitRow); + } + + let gnomeVersionRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let gnomeVersionText = new Gtk.Label({ + label: _('GNOME Version'), + }); + let gnomeVersionInfo = new Gtk.Label({ + label: imports.misc.config.PACKAGE_VERSION + '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + gnomeVersionRow.add(gnomeVersionText); + gnomeVersionRow.add(gnomeVersionInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(gnomeVersionRow); + + let osRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let osText = new Gtk.Label({ + label: _('OS'), + }); + let osInfoText; + let name = GLib.get_os_info("NAME"); + let prettyName = GLib.get_os_info("PRETTY_NAME"); + if(prettyName) + osInfoText = prettyName; + else + osInfoText = name; + let versionID = GLib.get_os_info("VERSION_ID"); + if(versionID) + osInfoText += "; Version ID: " + versionID; + let buildID = GLib.get_os_info("BUILD_ID"); + if(buildID) + osInfoText += "; " + "Build ID: " +buildID; + + let osInfo = new Gtk.Label({ + label: osInfoText, + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + osRow.add(osText); + osRow.add(osInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(osRow); + + let windowingRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let windowingText = new Gtk.Label({ + label: _('Session Type'), + }); + let windowingLabel; + if(Me.metadata.isWayland) + windowingLabel = "Wayland"; + else + windowingLabel = "X11"; + + let windowingInfo = new Gtk.Label({ + label: windowingLabel, + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + windowingRow.add(windowingText); + windowingRow.add(windowingInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(windowingRow); + + let arcMenuInfoBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + hexpand: false, + vexpand: false + }); + let arcMenuLabel = new Gtk.Label({ + label: '' + _('ArcMenu') + '', + use_markup: true, + vexpand: true, + valign: Gtk.Align.FILL + }); + + let projectDescriptionLabel = new Gtk.Label({ + label: _('Application Menu Extension for GNOME'), + hexpand: false, + vexpand: false, + margin_bottom: 5 + }); + let linksBox = new Gtk.Box({ + hexpand: false, + vexpand: false, + valign: Gtk.Align.END, + halign: Gtk.Align.CENTER, + margin_top: 0, + margin_bottom: 0, + margin_start: 0, + margin_end: 0, + spacing: 0, + }); + + let pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/donate-icon.svg', 150, 50); + let donateImage = Gtk.Picture.new_for_pixbuf(pixbuf); + let donateLinkButton = new Gtk.LinkButton({ + child: donateImage, + uri: 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=53CWA7NR743WC&item_name=Donate+to+support+my+work¤cy_code=USD&source=url', + }); + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/gitlab-icon.svg', 150, 50); + let gitlabImage = Gtk.Picture.new_for_pixbuf(pixbuf); + let projectLinkButton = new Gtk.LinkButton({ + child: gitlabImage, + uri: projectUrl, + }); + + linksBox.append(projectLinkButton); + linksBox.append(donateLinkButton); + + this.creditsScrollWindow = new Gtk.ScrolledWindow({ + margin_top: 10, + margin_bottom: 0, + hexpand: false, + }); + this.creditsScrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.creditsScrollWindow.set_max_content_height(200); + this.creditsScrollWindow.set_min_content_height(200); + this.creditsFrame = new PW.Notebook(); + this.creditsFrame.scrollable = true; + let developersPage = new PW.NotebookPage(_("Developers")); + this.creditsFrame.append_page(developersPage); + let translatorsPage = new PW.NotebookPage(_("Translators")); + this.creditsFrame.append_page(translatorsPage); + let contributorsPage = new PW.NotebookPage(_("Contributors")); + this.creditsFrame.append_page(contributorsPage ); + let artworkPage = new PW.NotebookPage(_("Artwork")); + this.creditsFrame.append_page(artworkPage); + this.creditsScrollWindow.set_child(this.creditsFrame); + let creditsLabel = new Gtk.Label({ + label: _(Constants.DEVELOPERS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + }); + developersPage.append(creditsLabel); + creditsLabel = new Gtk.Label({ + label: _(Constants.TRANSLATORS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + }); + translatorsPage.append(creditsLabel); + creditsLabel = new Gtk.Label({ + label: _(Constants.CONTRIBUTORS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + wrap: true + }); + contributorsPage.append(creditsLabel); + contributorsPage.hexpand = false; + creditsLabel = new Gtk.Label({ + label: _(Constants.ARTWORK), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + wrap: true + }); + artworkPage.append(creditsLabel); + arcMenuImageBox.append(arcMenuLabel); + arcMenuImageBox.append(projectDescriptionLabel); + + let gnuSofwareLabel = new Gtk.Label({ + label: _(Constants.GNU_SOFTWARE), + use_markup: true, + justify: Gtk.Justification.CENTER + }); + let gnuSofwareLabelBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + valign: Gtk.Align.END, + vexpand: true, + margin_top: 5, + margin_bottom: 10 + }); + gnuSofwareLabelBox.append(gnuSofwareLabel); + + this.mainBox.append(arcMenuImageBox); + this.mainBox.append(arcMenuInfoBox); + this.mainBox.append(extensionInfoFrame); + + this.mainBox.append(this.creditsScrollWindow) + this.mainBox.append(gnuSofwareLabelBox); + this.mainBox.append(linksBox); + } +}); + +function createSeparator(){ + let separatorRow = new Gtk.ListBoxRow({ + selectable: false, + activatable: false + }); + separatorRow.set_child(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + return separatorRow; +} + +var ArcMenuPreferencesWidget = GObject.registerClass( +class Arc_Menu_ArcMenuPreferencesWidget extends Gtk.Box { + _init() { + super._init(); + + this.leftHeaderBox = new Gtk.Box({ + hexpand: true, + visible: true + }); + + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + + this.backButton = new Gtk.Button({ + child: new Gtk.Image({icon_name: 'go-previous-symbolic'}), + visible: true + }); + this.backButton.connect("clicked", () => { + this.leftHeaderBox.remove(this.backButton); + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectFirstRow(); + }); + + this.settingsFrameStack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.CROSSFADE + }); + + this.settingsListStack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + + let mainStackListBox = new PW.StackListBox(this, {width_request: 215}); + + let mainStackBox = mainStackListBox.scrollWindow; + mainStackListBox.addRow("General", _("General"), 'homescreen-symbolic'); + mainStackListBox.addRow("MenuLayout", _("Menu Layout"), 'menu-layouts-symbolic') + mainStackListBox.addRow("MenuTheme", _("Menu Theme"), 'menu-theme-symbolic'); + mainStackListBox.addRow("MenuSettingsGeneral", _("Customize Menu"), 'menu-settings-symbolic', "MenuSettings"); + mainStackListBox.addRow("ButtonAppearance", _("Button Appearance"), 'arc-menu-symbolic') + mainStackListBox.addRow("Misc", _("Misc"), 'misc-symbolic') + mainStackListBox.addRow("About", _("About"), 'info-circle-symbolic'); + mainStackListBox.setSeparatorIndices([1, 4, 5]); + + let menuSettingsStackListBox = new PW.StackListBox(this, {width_request: 215}); + let menuSettingsListBox = menuSettingsStackListBox.scrollWindow; + menuSettingsStackListBox.addRow("MenuSettingsGeneral", _("Menu Settings"), 'menu-settings-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsPinnedApps", _("Pinned Apps"), 'pinned-apps-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsShortcutDirectories", _("Directory Shortcuts"), 'folder-documents-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsShortcutApplications", _("Application Shortcuts"), 'preferences-desktop-apps-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsPowerOptions", _("Power Options"), 'gnome-power-manager-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsSearchOptions", _("Search Options"), 'preferences-system-search-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsCategories", _("Extra Categories"), 'categories-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsNewApps", _("New Apps Tracker"), 'preferences-system-notifications-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsFineTune", _("Fine-Tune"), 'fine-tune-symbolic'); + menuSettingsStackListBox.setSeparatorIndices([1, 4, 8]); + + this.settingsListStack.add_named(mainStackBox, "Main"); + this.settingsListStack.add_named(menuSettingsListBox, "MenuSettings"); + + let sidebar = new Gtk.StackSidebar(); + sidebar.set_stack(this.settingsListStack); + this.append(this.settingsListStack); + this.append(sidebar); + + this.append(this.settingsFrameStack); + this.populateSettingsFrameStack(); + } + + populateSettingsFrameStack(){ + this.settingsFrameStack.add_named(new GeneralPage(this._settings), "General"); + this.menuLayoutPage = new MenuLayoutPage(this._settings); + this.settingsFrameStack.add_named(this.menuLayoutPage, "MenuLayout"); + this.settingsFrameStack.add_named(new MenuThemePage(this._settings), "MenuTheme"); + + this.settingsFrameStack.add_named(new MenuSettingsGeneralPage(this._settings), "MenuSettingsGeneral"); + this.settingsFrameStack.add_named(new MenuSettingsPinnedAppsPage(this._settings), "MenuSettingsPinnedApps"); + + let menuSettingsPinnedAppsPage = this.settingsFrameStack.get_child_by_name("MenuSettingsPinnedApps"); + + if(this.pinnedAppsChangedID){ + this._settings.disconnect(this.pinnedAppsChangedID); + this.pinnedAppsChangedID = null; + } + this.pinnedAppsChangedID = this._settings.connect("changed::pinned-app-list", () =>{ + menuSettingsPinnedAppsPage.frame.remove_all_children(); + menuSettingsPinnedAppsPage._loadPinnedApps(this._settings.get_strv('pinned-app-list')); + menuSettingsPinnedAppsPage.frame.show(); + }); + + this.settingsFrameStack.add_named(new MenuSettingsShortcutDirectoriesPage(this._settings), "MenuSettingsShortcutDirectories"); + this.settingsFrameStack.add_named(new MenuSettingsShortcutApplicationsPage(this._settings), "MenuSettingsShortcutApplications"); + this.settingsFrameStack.add_named(new MenuSettingsPowerOptionsPage(this._settings), "MenuSettingsPowerOptions"); + this.settingsFrameStack.add_named(new MenuSettingsSearchOptionsPage(this._settings), "MenuSettingsSearchOptions"); + this.settingsFrameStack.add_named(new MenuSettingsCategoriesPage(this._settings, "extra-categories"), "MenuSettingsCategories"); + this.settingsFrameStack.add_named(new MenuSettingsNewAppsPage(this._settings), "MenuSettingsNewApps"); + this.settingsFrameStack.add_named(new MenuSettingsFineTunePage(this._settings), "MenuSettingsFineTune"); + this.settingsFrameStack.add_named(new ButtonAppearancePage(this._settings), "ButtonAppearance"); + this.settingsFrameStack.add_named(new MiscPage(this._settings, this), "Misc"); + this.settingsFrameStack.add_named(new AboutPage(this._settings), "About"); + + this.show(); + + if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.MAIN){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectFirstRow(); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.CUSTOMIZE_MENU){ + this.settingsListStack.set_visible_child_name("MenuSettings"); + this.settingsListStack.get_child_by_name('MenuSettings').listBox.selectRowAtIndex(0); + if(!this.backButton.get_parent()) + this.leftHeaderBox.append(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.MENU_LAYOUT){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.BUTTON_APPEARANCE){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(4); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.LAYOUT_TWEAKS){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + this.menuLayoutPage.connect("realize", () => this.menuLayoutPage.displayLayoutTweaksPage()); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.RUNNER_TWEAKS){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + this.menuLayoutPage.connect("realize", () => this.menuLayoutPage.displayRunnerTweaksPage()); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.ABOUT){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(6); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + this._settings.set_int('prefs-visible-page', Constants.PrefsVisiblePage.MAIN); + } +}); + +function init() { + ExtensionUtils.initTranslations(Me.metadata['gettext-domain']); +} + +function buildPrefsWidget() { + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + let iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()); + if(!iconTheme.get_search_path().includes(Me.path + "/media/icons/prefs_icons")) + iconTheme.add_search_path(Me.path + "/media/icons/prefs_icons"); + let widget = new ArcMenuPreferencesWidget(); + widget.connect("realize", () => { + let window = widget.get_root(); + + window.default_width = this._settings.get_int('settings-width'); + window.default_height = this._settings.get_int('settings-height'); + + window.set_title(_("ArcMenu Settings")); + window.get_titlebar().pack_start(widget.leftHeaderBox); + }); + + widget.show(); + return widget; +} + +function checkIfValidShortcut(frameRow, label, icon){ + if(frameRow._cmd.endsWith(".desktop") && !Gio.DesktopAppInfo.new(frameRow._cmd)){ + icon.icon_name = 'warning-symbolic'; + label.label = "" + _("Invalid Shortcut") + " "+ _(label.label); + } +} + +function getIconPath(listing){ + let path, icon; + + if(listing[2]=="ArcMenu_Home") + path = GLib.get_home_dir(); + else if(listing[2].startsWith("ArcMenu_")){ + let string = listing[2]; + path = string.replace("ArcMenu_",''); + if(path === "Documents") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS); + else if(path === "Downloads") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD); + else if(path === "Music") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC); + else if(path === "Pictures") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES); + else if(path === "Videos") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_VIDEOS); + else + path = null; + } + else if(listing[1] == listing[2]) + path = listing[2]; + else if(listing[1] == "ArcMenu_Folder"){ + path = listing[2]; + } + else + path = null; + + if(path){ + let file = Gio.File.new_for_path(path); + try { + let info = file.query_info('standard::symbolic-icon', 0, null); + icon = info.get_symbolic_icon(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + if (!file.is_native()) { + icon = new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + } else { + icon = new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + } + return icon.to_string(); + } + else{ + if(listing[2]=="ArcMenu_Network") + return 'network-workgroup-symbolic'; + else if(listing[2]=="ArcMenu_Computer") + return 'drive-harddisk-symbolic'; + else + return listing[1]; + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js new file mode 100644 index 0000000..0700025 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js @@ -0,0 +1,793 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +var Notebook = GObject.registerClass(class Arc_Menu_Notebook extends Gtk.Notebook{ + _init() { + super._init({ + margin_start: 0, + margin_end: 0 + }); + } + + append_page(notebookPage) { + Gtk.Notebook.prototype.append_page.call( + this, + notebookPage, + notebookPage.getTitleLabel() + ); + } +}); + +var NotebookPage = GObject.registerClass(class Arc_Menu_NotebookPage extends Gtk.Box { + _init(title) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + homogeneous: false + }); + this._title = new Gtk.Label({ + label: "" + title + "", + use_markup: true, + xalign: 0 + }); + } + + getTitleLabel() { + return this._title; + } +}); + +var Button = GObject.registerClass(class Arc_Menu_Button extends Gtk.Button { + _init(params) { + super._init(); + this._params = params; + this.halign = Gtk.Align.END; + this.valign = Gtk.Align.CENTER; + this.box = new Gtk.Box({ + orientation: Gtk.Orientation.HORIZONTAL, + spacing: 5 + }); + this.set_child(this.box); + + if (this._params.icon_name) { + let image = new Gtk.Image({ + icon_name: this._params.icon_name, + halign: Gtk.Align.CENTER + }); + this.box.append(image); + } + if (this._params.tooltip_text){ + this.set_tooltip_text(this._params.tooltip_text); + } + if (this._params.title){ + let label = new Gtk.Label({ + label: _(this._params.title), + use_markup: true, + xalign: 0 + }); + if(this._params.icon_first) + this.box.append(label); + else + this.box.prepend(label); + } + } +}); + +var DialogWindow = GObject.registerClass(class Arc_Menu_DialogWindow extends Gtk.Dialog { + _init(title, parent) { + super._init({ + title: title, + transient_for: parent.get_root(), + modal: true + }); + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + hexpand: true, + halign: Gtk.Align.FILL + }); + vbox.insert_after(this.get_content_area(), null); + this._createLayout(vbox); + } + + _createLayout(vbox) { + throw "Not implemented!"; + } +}); + +var MessageDialog = GObject.registerClass(class Arc_Menu_MessageDialog extends Gtk.MessageDialog { + _init(params) { + super._init({ + transient_for: params.transient_for, + modal: true, + buttons: params.buttons + }); + this.set_size_request(300, 50); + this.grid = new Gtk.Grid({ + row_spacing: 10, + column_spacing: 24, + margin_top: 24, + margin_bottom: 0, + margin_start: 24, + margin_end: 24, + hexpand: false, + halign: Gtk.Align.CENTER + }); + this.grid.insert_after(this.get_content_area(), null); + let text = new Gtk.Label({ + label: "" + _(params.text) + "", + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true, + }); + this.grid.attach(text, 1, 0, 1, 1); + + if(params.secondaryText){ + let secondayText = new Gtk.Label({ + label: _(params.secondaryText), + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true, + }); + this.grid.attach(secondayText, 1, 1, 1, 1); + } + + if(params.iconName){ + let image = new Gtk.Image({ + icon_name: params.iconName, + pixel_size: 48 + }); + this.grid.attach(image, 0, 0, 1, 2); + } + } +}); + +var FrameBox = GObject.registerClass(class Arc_Menu_FrameBox extends Gtk.Frame { + _init(params) { + super._init(params); + this._listBox = new Gtk.ListBox(); + this._listBox.set_selection_mode(Gtk.SelectionMode.NONE); + this.count = 0; + this.children = []; + Gtk.Frame.prototype.set_child.call(this, this._listBox); + } + + add(boxRow) { + this._listBox.append(boxRow); + this.children.push(boxRow); + this.count++; + } + show() { + this._listBox.show(); + super.show(); + } + length() { + return this._listBox.length; + } + remove(boxRow){ + if(boxRow){ + this._listBox.remove(boxRow); + this.children = this.children.filter(e => e !== boxRow) + this.count = this.count -1; + } + } + removeChildrenAfterIndex(index){ + let childrenCount = this.count; + for(let i = childrenCount - 1; i > index; i--){ + let child = this._listBox.get_row_at_index(i); + if(child) this.remove(child); + } + this._listBox.show(); + } + remove_all_children() { + for(let i = 0; i < this.children.length; i++){ + let child = this.children[i]; + this._listBox.remove(child); + } + this.children = []; + this.count = 0; + this._listBox.show(); + } + get_index(index){ + return this._listBox.get_row_at_index(index); + } + insert(row, pos){ + this._listBox.insert(row, pos); + this.children.push(row); + this.count++; + } +}); + +var FrameBoxRow = GObject.registerClass(class Arc_Menu_FrameBoxRow extends Gtk.ListBoxRow { + _init(params) { + super._init(params); + this.selectable = false; + this.activatable = false; + this._grid = new Gtk.Grid({ + orientation: Gtk.Orientation.HORIZONTAL, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + column_spacing: 20, + row_spacing: 20 + }); + this.x = 0; + Gtk.ListBoxRow.prototype.set_child.call(this, this._grid); + } + + add(widget) { + this._grid.attach(widget, this.x, 0, 1, 1); + this.x++; + } + + setVerticalAlignmentBottom(){ + this._grid.vexpand = true; + this._grid.valign = Gtk.Align.END; + } +}); + +var FrameBoxDragRow = GObject.registerClass(class Arc_Menu_FrameBoxDragRow extends Gtk.ListBoxRow { + _init(scrolledWindow) { + super._init(); + + this._grid = new Gtk.Grid({ + orientation: Gtk.Orientation.HORIZONTAL, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + column_spacing: 20, + row_spacing: 20 + }); + + let dragSource = new Gtk.DragSource({ + actions: Gdk.DragAction.MOVE + }); + this.add_controller(dragSource); + + let dropTarget = new Gtk.DropTargetAsync({ + actions: Gdk.DragAction.MOVE + }); + this.add_controller(dropTarget); + + this.x = 0; + Gtk.ListBoxRow.prototype.set_child.call(this, this._grid); + dragSource.connect("drag-begin", (self, gdkDrag) => { + //get listbox parent + let listBox = self.get_widget().get_parent(); + //get widgets parent - the listBoxDragRow + listBox.dragRow = this; + + let alloc = self.get_widget().get_allocation(); + let dragWidget = self.get_widget().createDragRow(alloc); + listBox.dragWidget = dragWidget; + + let icon = Gtk.DragIcon.get_for_drag(gdkDrag); + icon.set_child(dragWidget); + + gdkDrag.set_hotspot(listBox.dragX, listBox.dragY); + }); + + dragSource.connect("prepare", (self, x, y) => { + //get listbox parent + this.set_state_flags(Gtk.StateFlags.NORMAL, true); + let listBox = self.get_widget().get_parent(); + //store drag start cursor location + listBox.dragX = x; + listBox.dragY = y; + return new Gdk.ContentProvider(Arc_Menu_FrameBoxDragRow); + }); + + dragSource.connect("drag-end", (self, gdkDrag, deleteData)=> { + deleteData = true; + let listBox = self.get_widget().get_parent(); + listBox.dragWidget = null; + listBox.drag_unhighlight_row(); + }); + + dropTarget.connect("drag-enter", (self, gdkDrop, x, y, selection, info, time)=> { + let listBox = self.get_widget().get_parent(); + let widget = self.get_widget(); + + listBox.startIndex = widget.get_index(); + listBox.drag_highlight_row(widget); + + if(!scrolledWindow) + return true; + + let height = widget.get_height(); + let scrollHeight = scrolledWindow.get_height(); + let widgetLoc = widget.get_index() * height; + let value = scrolledWindow.vadjustment.value; + + if((widgetLoc + (height * 4)) > (value + scrollHeight)) + scrolledWindow.vadjustment.value += height; + else if((widgetLoc - (height * 2)) < value) + scrolledWindow.vadjustment.value -= height; + }); + + dropTarget.connect("drag-leave", (self, gdkDrop, x, y, selection, info, time)=> { + let listBox = self.get_widget().get_parent(); + listBox.drag_unhighlight_row(); + }); + + dropTarget.connect("drop", (self, gdkDrop, x, y, selection, info, time)=> { + //get listbox parent + let listBox = this.get_parent(); + let index = this.get_index(); + if(index === listBox.dragRow.get_index()){ + gdkDrop.read_value_async(Arc_Menu_FrameBoxDragRow, 1, null, ()=>{ + gdkDrop.finish(Gdk.DragAction.MOVE); + }); + return true; + } + listBox.remove(listBox.dragRow); + listBox.show(); + listBox.insert(listBox.dragRow, index); + this.resetButton?.set_sensitive(true); + this.saveButton.set_sensitive(true); + gdkDrop.read_value_async(Arc_Menu_FrameBoxDragRow, 1, null, ()=>{ + gdkDrop.finish(Gdk.DragAction.MOVE); + }); + return true; + }); + } + + createDragRow(alloc){ + let dragWidget = new Gtk.ListBox(); + dragWidget.set_size_request(alloc.width, alloc.height); + + let dragRow = new FrameBoxRow(); + dragWidget.append(dragRow); + dragWidget.drag_highlight_row(dragRow); + + let image = new Gtk.Image( { + gicon: this._gicon, + pixel_size: 22 + }); + + let imageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: true, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + + imageBox.append(dragImage); + imageBox.append(image); + + dragRow.add(imageBox); + + let label = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true, + label: _(this._name) + }); + dragRow.add(label); + let grid = new Gtk.Grid({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }) + let editButton = new Button({ + icon_name: 'view-more-symbolic' + }); + grid.attach(editButton, 0, 0, 1, 1); + + if(this.hasSwitch){ + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + active: this.switchActive + }); + grid.insert_column(0); + grid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + grid.insert_column(0); + grid.attach(modifyButton, 0, 0, 1, 1); + } + if(this.hasEditButton){ + let editButton = new Button({ + icon_name: 'text-editor-symbolic', + }); + grid.insert_column(0); + grid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + grid.insert_column(0); + grid.attach(editButton, 0, 0, 1, 1); + } + dragRow.add(grid); + + return dragWidget; + } + + add(widget) { + this._grid.attach(widget, this.x, 0, 1, 1); + this.x++; + } + + setVerticalAlignmentBottom(){ + this._grid.vexpand = true; + this._grid.valign = Gtk.Align.END; + } +}); + +var EditEntriesBox = GObject.registerClass({ + Signals: { + 'modify': {}, + 'change': {}, + 'move-up': {}, + 'move-down': {}, + 'delete': {}, + }, +}, class Arc_Menu_EditEntriesBox extends Gtk.Grid{ + _init(params){ + super._init({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }); + let editPopover = new Gtk.Popover(); + let frameRow = params.frameRow; + let frame = params.frame; + let buttons = params.buttons; + + let modifyButton, deleteButton, changeButton; + + if(params.modifyButton){ + modifyButton = new Gtk.Button({ + label: _("Modify"), + has_frame: false + }); + modifyButton.connect('clicked', () => { + editPopover.popdown(); + this.emit('modify'); + }); + } + + if(params.changeButton){ + changeButton = new Button({ + icon_name: 'text-editor-symbolic', + }); + changeButton.connect('clicked', () => { + editPopover.popdown(); + this.emit('change'); + }); + } + + let editButton = new Gtk.MenuButton({ + icon_name: 'view-more-symbolic', + popover: editPopover, + }); + + this.attach(editButton, 0, 0, 1, 1); + + let editPopoverBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL + }); + + editPopover.set_child(editPopoverBox); + + let moveUpButton = new Gtk.Button({ + label: _("Move Up"), + has_frame: false + }); + moveUpButton.connect('clicked', ()=> { + this.emit('move-up'); + let index = frameRow.get_index(); + if(index > 0){ + frame.remove(frameRow); + frame.insert(frameRow, index - 1); + } + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + + let moveDownButton = new Gtk.Button({ + label: _("Move Down"), + has_frame: false + }); + moveDownButton.connect('clicked', ()=> { + this.emit('move-down'); + let index = frameRow.get_index(); + if(index + 1 < frame.count) { + frame.remove(frameRow); + frame.insert(frameRow, index + 1); + } + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + + if(params.deleteButton){ + deleteButton = new Gtk.Button({ + label: _("Delete"), + has_frame: false, + }); + deleteButton.connect('clicked', ()=> { + this.emit('delete'); + frame.remove(frameRow); + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + } + + if(params.changeButton){ + this.insert_column(0); + this.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + this.insert_column(0); + this.attach(changeButton, 0, 0, 1, 1); + } + + if(params.modifyButton){ + editPopoverBox.append(modifyButton); + editPopoverBox.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + } + + editPopoverBox.append(moveUpButton); + editPopoverBox.append(moveDownButton); + + if(params.deleteButton){ + editPopoverBox.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + editPopoverBox.append(deleteButton); + } + } +}); + +var StackListBox = GObject.registerClass(class Arc_Menu_StackListBox extends Gtk.ListBox{ + _init(widget, params){ + super._init(params); + this.valign = Gtk.Align.FILL; + this.vexpand = true; + this.hexpand = false; + this.settingsFrameStack = widget.settingsFrameStack; + this.settingsListStack = widget.settingsListStack + this.connect("row-selected", (self, row) => { + if(row){ + let stackName = row.stackName; + this.settingsFrameStack.set_visible_child_name(stackName); + if(row.nextPage){ + if(widget.backButton.get_parent()) + widget.leftHeaderBox.remove(widget.backButton); + widget.leftHeaderBox.prepend(widget.backButton); + this.settingsListStack.set_visible_child_name(row.nextPage); + this.settingsListStack.get_child_by_name(row.nextPage).listBox.selectFirstRow(); + } + } + }); + this.scrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.scrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.scrollWindow.set_child(this); + this.scrollWindow.listBox = this; + } + + getRowAtIndex(index){ + return this.get_row_at_index(index).get_children()[0]; + } + + getSelectedRow(){ + return this.get_selected_row().get_children()[0]; + } + + selectFirstRow(){ + this.select_row(this.get_row_at_index(0)); + } + + selectRowAtIndex(index){ + this.select_row(this.get_row_at_index(index)); + } + + addRow(name, translateableName, iconName, nextPage){ + let row1 = new Gtk.ListBoxRow(); + this.append(row1); + + let row = new Gtk.Grid({ + margin_top: 12, + margin_bottom: 12, + margin_start: 12, + margin_end: 12, + column_spacing: 10 + }); + row1.set_child(row); + row1.stackName = name; + row1.translateableName = translateableName; + + let image = new Gtk.Image({ + icon_name: iconName + }); + + let label = new Gtk.Label({ + label: translateableName, + halign: Gtk.Align.START, + }); + row.attach(image, 0, 0, 1, 1); + row.attach(label, 1, 0, 1, 1); + + if(nextPage){ + row1.nextPage = nextPage; + let image2 = new Gtk.Image({ + gicon: Gio.icon_new_for_string('go-next-symbolic'), + halign: Gtk.Align.END, + hexpand: true + }); + row.attach(image2, 2, 0, 1, 1); + } + } + + setSeparatorIndices(indexArray){ + this.set_header_func((_row, _before) =>{ + for(let i = 0; i < indexArray.length; i++){ + if(_row.get_index() === indexArray[i]){ + let sep = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL); + sep.show(); + _row.set_header(sep); + + } + } + }); + } +}); + +var TileGrid = GObject.registerClass(class Arc_Menu_TileGrid extends Gtk.FlowBox{ + _init(maxColumns) { + super._init({ + row_spacing: 5, + column_spacing: 5, + vexpand: true, + hexpand: true, + valign: Gtk.Align.CENTER, + halign: Gtk.Align.CENTER, + max_children_per_line: maxColumns, + homogeneous: true, + selection_mode: Gtk.SelectionMode.NONE + }); + } +}); + +var IconGrid = GObject.registerClass(class Arc_Menu_IconGrid extends Gtk.FlowBox{ + _init() { + super._init({ + max_children_per_line: 7, + row_spacing: 10, + column_spacing: 10, + vexpand: true, + hexpand: false, + valign: Gtk.Align.START, + halign: Gtk.Align.CENTER, + homogeneous: true, + selection_mode: Gtk.SelectionMode.SINGLE + }); + this.childrenCount = 0; + } + + add(widget){ + this.insert(widget, -1); + this.childrenCount++; + } +}); + +var Tile = GObject.registerClass(class Arc_Menu_Tile extends FrameBox{ + _init(name, file, width, height, layout) { + super._init({ + hexpand: true, + vexpand: false, + halign: Gtk.Align.FILL, + valign: Gtk.Align.CENTER + }); + this.box = new FrameBoxRow(); + this.box.activatable = true; + this.box._grid.row_spacing = 0; + this.box._grid.orientation = Gtk.Orientation.VERTICAL, + this.activatable = true; + this.name = name; + this.layout = layout; + this._image = new Gtk.Image({ + + gicon: Gio.icon_new_for_string(file), + pixel_size: width + }); + this._label = new Gtk.Label({ label: _(this.name) }); + + this.box._grid.attach(this._image, 0, 0, 1, 1); + this.box._grid.attach(this._label, 0, 1, 1, 1); + this._listBox.append(this.box); + } +}); + +var LayoutTile = GObject.registerClass(class Arc_Menu_LayoutTile extends FrameBox{ + _init(name, file, layout) { + super._init({ + halign: Gtk.Align.FILL, + valign: Gtk.Align.CENTER, + hexpand: true, + vexpand: false + }); + this._listBox.set_selection_mode(Gtk.SelectionMode.NONE); + this.name = name; + this.layout = layout.MENU_TYPE; + + this.box = new FrameBoxRow(); + this.box.activatable = true; + this.box._grid.row_spacing = 0; + this.box._grid.column_spacing = 0; + + this._image = new Gtk.Image({ + hexpand: false, + halign: Gtk.Align.START, + gicon: Gio.icon_new_for_string(file), + pixel_size: 46 + }); + + let titleLabel = new Gtk.Label({ + label: "" + _("%s Menu Layouts", layout.TITLE).format(layout.TITLE) + "", + use_markup: true, + hexpand: true, + halign: Gtk.Align.CENTER, + vexpand: true, + valign: Gtk.Align.CENTER, + wrap: true, + }) + + let goNextImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string('go-next-symbolic'), + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + hexpand: false, + vexpand: false, + }) + + this.box._grid.attach(this._image, 0, 0, 1, 2); + this.box._grid.attach(titleLabel, 1, 0, 1, 1); + this.box._grid.attach(goNextImage, 2, 0, 1, 2); + + this._listBox.append(this.box); + } +}); diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js new file mode 100644 index 0000000..eb51dff --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js @@ -0,0 +1,111 @@ +const { Gtk, Gio, GLib } = imports.gi; +const ExtensionUtils = imports.misc.extensionUtils; +const Main = imports.ui.main; + +const LogEnabled = false; + +var isCanceled = false; +var currentQueries = []; + +var RecentFilesManager = class Arc_Menu_RecentFilesManager { + constructor() { + this._settings = ExtensionUtils.getSettings(); + this._recentManager = new Gtk.RecentManager(); + } + + filterRecentFiles(callback){ + isCanceled = false; + this._recentManager.get_items().sort((a, b) => b.get_modified() - a.get_modified()) + .forEach(item => { + this.queryFileExists(item) + .then(validFile => { + this.debugLog("Valid file - " + validFile.get_display_name()); + if(!isCanceled) + callback(validFile); + }) + .catch(err =>{ + this.debugLog(err); + }); + }); + } + + queryFileExists(item) { + return new Promise((resolve, reject) => { + let file = Gio.File.new_for_uri(item.get_uri()); + let cancellable = new Gio.Cancellable(); + + if(file === null) + reject("Recent file is null. Rejected."); + + //Create and store queryInfo to cancel any active queries when needed + let queryInfo = { + timeOutID: null, + cancellable, + reject, + item + }; + + currentQueries.push(queryInfo); + + file.query_info_async('standard::type,standard::is-hidden', 0, 0, cancellable, (source, res) => { + try { + let fileInfo = source.query_info_finish(res); + this.removeQueryInfoFromList(queryInfo); + if (fileInfo) { + let isHidden = fileInfo.get_attribute_boolean("standard::is-hidden"); + let showHidden = this._settings.get_boolean('show-hidden-recent-files'); + if(isHidden && !showHidden) + reject(item.get_display_name() + " is hidden. Rejected.") + resolve(item); + } + } + catch (err) { + if (err.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + this.debugLog("Cancel Called: " + item.get_display_name()); + + this.removeQueryInfoFromList(queryInfo); + reject(err); + } + }); + }); + } + + removeQueryInfoFromList(queryInfo){ + let queryIndex = currentQueries.indexOf(queryInfo); + if(queryIndex !== -1) + currentQueries.splice(queryIndex, 1); + } + + cancelCurrentQueries(){ + if(currentQueries.length === 0) + return; + isCanceled = true; + this.debugLog("Canceling " + currentQueries.length + " queries...") + for(let queryInfo of currentQueries){ + this.debugLog("Cancel query - " + queryInfo.item.get_display_name()); + queryInfo.cancellable.cancel(); + queryInfo.cancellable = null; + queryInfo.reject("Query Canceled"); + } + currentQueries = null; + currentQueries = []; + this.debugLog("Cancel Finished"); + } + + debugLog(message){ + if (!LogEnabled) + return; + else log(message); + } + + getRecentManager(){ + return this._recentManager; + } + + destroy(){ + this.cancelCurrentQueries(); + this._settings = null; + this._recentManager = null; + } +} + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..473fe73f32ad30f7f813acd364e7108a048a2530 GIT binary patch literal 12620 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 KhO#K9?)X3aDRLwL literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml new file mode 100644 index 0000000..9638cb6 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml @@ -0,0 +1,799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 +

      Menu position alignment + Menu position alignment 0 = Left, 50 = Center, 100 = Right + + + 'Default' + menu layout + Menu Layout + + + 'Off' + Force the menu to a specific location + Force the menu to a specific location + + + false + disable hotkey on key release + disable hotkey on key release. + + + false + show ArcMenu on primary monitor when using hotkey + show ArcMenu on primary monitor when using hotkey. + + + false + show standalone Runner menu on primary monitor when using hotkey + show standalone Runner menu monitor when using hotkey. + + + 875 + ArcMenu Settings Width + ArcMenu Settings Width. + + + 725 + ArcMenu Settings Height + ArcMenu Settings Height. + + + [true, false, false] + Keeps track of available placement for ArcMenu. [Main Panel, Dash to Panel, Dash to Dock] + false = not avaliable, true = avaliable + + + "Panel" + Embed ArcMenu button into Dash instead of panel + Embed ArcMenu button into Dash instead of panel + + + 'Left' + Raven layout position. 'Left' or 'Right' side of screen + Raven layout position. 'Left' or 'Right' side of screen. + + + true + Enable Weather Widget raven layout + Enable Weather Widget raven layout. + + + true + Enable Clocks Widget raven layout + Enable Clocks Widget raven layout. + + + false + Enable Weather Widget Unity layout + Enable Weather Widget Unity layout. + + + false + Enable Clocks Widget Unity layout + Enable Clocks Widget Unity layout. + + + false + Enable Category Sub Menus + Enable Category Sub Menus. + + + 'Full_Color' + Category icon type. Full_Color or Symbolic + Category icon type. Full_Color or Symbolic + + + 'Symbolic' + Shortcut icon type. Full_Color or Symbolic + Shortcut icon type. Full_Color or Symbolic + + + false + disable the fade effect on scrollviews + ddisable the fade effect on scrollviews (may help improve performace) + + + false + Show a larger icon and extra app details + Show a larger icon and extra app details. + + + 5 + The amount of search results to display. + The amount of search results to display. + + + false + Highlight search results terms + Highlight search results terms. + + + false + Show search result description label + Show search result description label. + + + false + Show custom search provider - open windows + Show custom search provider - open windows. + + + false + Show custom search provider - recent files + Show custom search provider - recent files. + + + false + Show hidden recent files + Show hidden recent files. + + + false + Activate Categories on Hover + Activate Categories on Hover. + + + false + disable recently installed apps + disable recently installed apps. + + + false + disable tooltips + disable tooltips. + + + true + Separate All Programs by a Character Listing + Separate All Programs by a Character Listing. + + + true + Multi-lined labels for large icon application grid layouts + Multi-lined labels for large icon application grid layouts. + + + 'Pinned_Apps' + Set ArcMenu Layout Default View + Set ArcMenu Layout Default View. + + + 'Categories_List' + Set Tognee Layout Default View + Set Tognee Layout Default View. + + + true + Set Unity layout to display "Home Screen" as default + Set Unity layout to display "Home Screen" as default. False = Show all Apps + + + false + Remove the themes menu arrow and displacement + Remove the themes menu arrow and displacement + + + false + Remove border around the searchbox + Remove border around the searchbox + + + false + Disable the user avatar icon from the menu + Disable the user avatar icon from the menu + + + false + Enable an Activitities Overview Shortcut + Enable an Activitities Overview Shortcut + + + 'Bottom' + Searchbar location for layouts with default searchbar on bottom + Searchbar location for layouts with default searchbar on bottom + + + 'Top' + Searchbar location for layouts with default searchbar on top + Searchbar location for layouts with default searchbar on top + + + false + Flip menu horizontally + Flip menu horizontally + + + false + Windows layout - disable frequent apps + Windows layout - disable frequent apps + + + false + Windows layout - disable pinned apps + Windows layout - disable pinned apps + + + false + GNOME Dash Layout - Show Applications + GNOME Dash Layout - Show Applications + + + "rgb(61, 174, 235)" + Plasma Selected Item Color + Plasma Selected Item Color. + + + "rgba(245, 245, 245, .05)" + Plasma Selected Item Background Color + Plasma Selected Item Background Color. + + + true + Plasma Menu Hover to activate item + Plasma Menu Hover to activate item. + + + false + Runner layout - show frequent apps + Runner layout - show frequent apps + + + false + Runner layout - use current shell theme gap + Runner layout - use current shell theme gap + + + 400 + Runner layout - menu height + Runner layout - menu height + + + 500 + Runner layout - menu width + Runner layout - menu width + + + 0 + Runner layout - font size + Runner layout - font size + + + false + Eleven Layout - disable frequent apps + Eleven Layout - disable frequent apps + + + false + Used to reload theme + Used to reload theme. + + + false + Enable a vertical separator + Enable a vertical separator. + + + "rgb(32,32,32)" + Separator Color + Separator Color. + + + "rgba(53,53,53,0.987)" + Menu Background Color + Menu Background Color. + + + "rgb(223,223,223)" + Menu Foreground Color + Menu Foreground Color. + + + "rgb(32,32,32)" + Border Color + Border Color. + + + "rgb(21,83,158)" + Highlight/Active Menu Item Background Color + Highlight/Active Menu Item Background Color. + + + "rgba(255,255,255,1)" + Highlight/Active Menu Item Foreground Color + Highlight/Active Menu Item Foreground Color. + + + 9 + Menu font size + Menu font size. + + + 1 + Menu border size + Menu border size. + + + 5 + Menu corner radius + Menu corner radius. + + + 24 + Menu margin + Menu margin. + + + 12 + Menu arrow size + Menu arrow size. + + + 550 + Menu Height + Menu Height. + + + 290 + Menu width + Menu width. + + + 0 + Menu Width Adjustement. + Menu Width Adjustement. 0 Default. A negative value decreses the default width, positive increases width. + + + 205 + Right Panel width + Right Panel width. + + + 0 + Gap Adjustment + Gap Adjustment + + + "rgb(41, 165, 249)" + Recently Installed Application Inidcator Color + Recently Installed Application Inidcator Color.. + + + "rgba(196, 196, 196, 0.3)" + Recently Installed Application Inidcator Text Background Color + Recently Installed Application Inidcator Text Background Color.. + + + false + Enable Custom ArcMenu Theme + Enable Custom ArcMenu Theme. + + + false + Enable Custom ArcMenu Layout + Enable Custom ArcMenu Layout. + + + false + Show External Devices + Show External Devices. + + + false + Show Bookmarks + Show Bookmarks. + + + [(0, true), (1, true), (2, true), (3, true), (4, false), (5, false), (6, false)] + Power Options + See Constants.js PowerOptions + + + false + Display on all monitors + Display the menu on all monitors when using Dash to Panel. + + + 'Default' + Activities hotcorner action + Activities hotcorner action. + + + false + Override action of activities hot corner + Override action of activities hot corner. + + + false + Show/Hide Activities Button in panel + Show/Hide Activities Button in panel. + + + "sh -c 'notify-send \"$(date)\"'" + Custom hot corner terminal command + Custom hot corner terminal command. + + + 'Undefined' + Set a hotkey to open ArcMenu + Set a hotkey to open ArcMenu. + + + ["<Super>x"] + Custom keybind to open ArcMenu + Custom keybind to open ArcMenu. + + + false + Enable a standalone Runner menu. + Enable a standalone Runner menu. + + + 'Custom' + Set a hotkey to open the standalone Runner menu. + Set a hotkey to open the standalone Runner menu. + + + ["<Alt>1"] + Keybinding to open the standalone runner menu + Keybinding to open the standalone runner menu. + + + 'Left' + The menu position in the panel + The menu position in the panel. + + + 'Top' + Runner Menu Position + Runner Menu Position. + + + 'Icon' + Appearance of the menu button. + Appearance of the menu button. + + + 'Circular' + Appearance of the avatar icon. + Appearance of the avatar icon. + + + false + Enables the default menu button arrow. + Enables the default menu button arrow. + + + 'Default' + Size of the menu items icon. + Size of the menu items icon. Includes all application items, category items, search results. + + + 'Default' + Size of the menu grid icons. + Size of the menu grid icon. + + + 'Default' + Size of the button items in ArcMenu. + Size of the button items in ArcMenu. Includes all buttons inside the menu + + + 'Default' + Size of misc items in ArcMenu. + Size of misc items in ArcMenu. Includes searchbox icons, back menu item, all applications menu item, usermenu item. + + + 'Default' + Size of quicklink items in ArcMenu. + Size of quicklink items in ArcMenu. Includes places, shortcuts, external devices, bookmarks. + + + 'Applications' + Text of the menu button. + Text of the menu button. + + + 'Arc_Menu_Icon' + Icon of the menu button. + Icon of the menu button. + + + 0 + Icon of the menu button. + Icon of the menu button. + + + 0 + Icon of the menu button. + Icon of the menu button. + + + '' + File path of the custom icon for the menu button. + File path of the custom icon for the menu button. + + + 20 + Size of the icon in percentage. + Size of the icon in percentage. + + + -1 + Menu Button Padding. + Menu Button Padding. + + + 0 + Menu button position offset for main panel + Menu button position offset for main panel + + + false + Override border radius styling of the menu button + Override border radius of the menu button. + + + 0 + The border radius size of the menu button + The border radius size of the menu button. + + + 'rgb(240,240,240)' + Color for the menu button icon + Color for the menu button icon. + + + false + Allows changing the menu button icon color + Allows changing the menu button icon color. + + + 'rgb(240,240,240)' + Active color for the menu button icon + Active color for the menu button icon. + + + false + Allows changing the menu button icon active color + Allows changing the menu button icon active color. + + + 'rgb(214,214,214)' + Hover color for the menu button icon + Hover color for the menu button icon. + + + false + Allows changing the menu button icon hover color + Allows changing the menu button icon hover color. + + + 'rgba(238,238,236,0.1)' + Hover background color for the menu button icon + Hover background color for the menu button icon. + + + false + Allows changing the menu button hover background color + Allows changing the menu button hover background color. + + + 'rgba(238,238,236,0.18)' + Active background color for the menu button icon + Active background color for the menu button icon. + + + false + Allows changing the menu button active background color + Allows changing the menu button active background color. + + + [(0, true), (1, true), (2, false), (3, false), (4, false)] + Array of extra categories. See Constants.js - Categories + Array of extra categories. See Constants.js - Categories + + + [(0, false), (1, false), (2, false), (3, false), (4, false)] + Array of extra categories links for ArcMenu layout. See Constants.js - Categories + Array of extra categories for ArcMenu layout. See Constants.js - Categories + + + 'Bottom' + Display extra categories quick links on ArcMenu Layout home page + Display extra categories quick links on ArcMenu Layout home page + + + [] + List of recently installed apps + List of recently installed apps + + + [ "ArcMenu_WebBrowser","WebBrowser", "WebBrowser", + "Files", "", "org.gnome.Nautilus.desktop", + "Terminal", "", "org.gnome.Terminal.desktop", + "ArcMenu Settings", "ArcMenu_ArcMenuIcon", "gnome-extensions prefs arcmenu@arcmenu.com" + ] + + List of Apps Pinned to Menu + List of Apps Pinned to Menu + + + false + Toggle for enabling custom shortcuts. + Toggle for enabling custom shortcuts. + + + [["Home","ArcMenu_Home", "ArcMenu_Home"], ["Documents","ArcMenu_Documents", "ArcMenu_Documents"],["Downloads","ArcMenu_Downloads", "ArcMenu_Downloads"], + ["Music","ArcMenu_Music", "ArcMenu_Music"],["Pictures","ArcMenu_Pictures", "ArcMenu_Pictures"],["Videos","ArcMenu_Videos", "ArcMenu_Videos"]] + List of default directory paths used for links on the right side of ArcMenu + List of default directory paths used for links on the right side of ArcMenu. + + + [["Software","system-software-install-symbolic", "ArcMenu_Software"], ["Settings","preferences-system-symbolic", "gnome-control-center.desktop"], + ["Tweaks","org.gnome.tweaks-symbolic", "org.gnome.tweaks.desktop"],["Terminal","utilities-terminal-symbolic", "org.gnome.Terminal.desktop"], + ["Activities Overview", "view-fullscreen-symbolic", "ArcMenu_ActivitiesOverview"]] + List of default directory paths used for links on the right side of ArcMenu + List of default directory paths used for links on the right side of ArcMenu. + + + [] + List of Unity Layout Pinned Apps + List of Uniity Layout Pinned Apps + + + 5 + Index of Unity Layout Pinned App Separator + Index of Unity Layout Pinned App Separator, 0 = none + + + ["Software","system-software-install-symbolic", "ArcMenu_Software", "Settings","preferences-system-symbolic", "gnome-control-center.desktop"] + List of Brisk Layout Shortcuts + List of Brisk Layout Shortcuts + + + [] + List of Mint Layout Pinned Apps + List of Mint Layout Pinned Apps + + + 5 + Index of Mint Layout Pinned App Separator + Index of Mint Layout Pinned App Separator, 0 = none + + + [['ArcMenu Style', 'rgba(53,53,53,0.987)', 'rgb(223,223,223)', 'rgb(32,32,32)', 'rgb(21,83,158)', 'rgba(255,255,255,1)', 'rgb(32,32,32)', '9', '1', '5', '12', '24', 'false'], + ['Simply Dark', 'rgba(28, 28, 28, 0.98)', 'rgba(211, 218, 227, 1)', 'rgb(63,62,64)', 'rgba(238, 238, 236, 0.1)', 'rgba(255,255,255,1)', 'rgb(63,62,64)', '9', '0', '0', '0', '0', 'false'], + ['Dark Blue Theme', 'rgb(25,31,34)', 'rgb(189,230,251)', 'rgb(41,50,55)', 'rgb(41,50,55)', 'rgba(255,255,255,1)', 'rgb(41,50,55)', '9', '1', '5', '12', '24', 'true'], + ['Light Blue Theme', 'rgb(255,255,255)', 'rgb(51,51,51)', 'rgb(235,235,235)', 'rgba(189,230,251,0.9)', 'rgba(89,89,89,1)', 'rgba(189,230,251,0.9)', '9', '1', '5', '12', '24', 'true']] + List of color-themes + List of color themes. + + + + 0 + Handles which page to open in ArcMenu Settings + See Constants.js PrefsVisiblePage + + + diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/search.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/search.js new file mode 100644 index 0000000..9085c77 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/search.js @@ -0,0 +1,872 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: This file leverages the work from GNOME Shell search.js file + * (https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/master/js/ui/search.js) + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Clutter, Gio, GLib, GObject, Shell, St } = imports.gi; +const AppDisplay = imports.ui.appDisplay; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const { RecentFilesManager } = Me.imports.recentFilesManager; +const RemoteSearch = imports.ui.remoteSearch; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const { OpenWindowSearchProvider } = Me.imports.searchProviders.openWindows; +const { RecentFilesSearchProvider } = Me.imports.searchProviders.recentFiles; + +const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; + +var ListSearchResult = GObject.registerClass(class Arc_Menu_ListSearchResult extends MW.ApplicationMenuItem{ + _init(provider, metaInfo, resultsView) { + let menulayout = resultsView._menuLayout; + let app = appSys.lookup_app(metaInfo['id']); + + super._init(menulayout, app, Constants.DisplayType.LIST, metaInfo) + + this.app = app; + let layoutProperties = this._menuLayout.layoutProperties; + this.searchType = layoutProperties.SearchDisplayType; + this.metaInfo = metaInfo; + this.provider = provider; + this._settings = this._menuLayout._settings; + this.resultsView = resultsView; + this.layout = this._settings.get_enum('menu-layout'); + + if(this.provider.id === 'org.gnome.Nautilus.desktop' || this.provider.id === 'arcmenu.recent-files') + this._path = this.metaInfo['description']; + + let highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + if(highlightSearchResultTerms){ + this._termsChangedId = this.resultsView.connect('terms-changed', this._highlightTerms.bind(this)); + this._highlightTerms(); + } + + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.metaInfo['description'] && this.provider.appInfo.get_id() === 'org.gnome.Calculator.desktop' && !showSearchResultDescriptions) + this.label.text = this.metaInfo['name'] + " " + this.metaInfo['description']; + + if(!this.app && this.metaInfo['description']) + this.description = this.metaInfo['description'].split('\n')[0]; + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._termsChangedId) { + this.resultsView.disconnect(this._termsChangedId); + this._termsChangedId = null; + } + } + + _highlightTerms() { + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.descriptionLabel && showSearchResultDescriptions){ + let descriptionMarkup = this.resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]); + this.descriptionLabel.clutter_text.set_markup(descriptionMarkup); + } + let labelMarkup = this.resultsView.highlightTerms(this.label.text.split('\n')[0]); + this.label.clutter_text.set_markup(labelMarkup); + } +}); + +var AppSearchResult = GObject.registerClass(class Arc_Menu_AppSearchResult extends MW.ApplicationMenuItem{ + _init(provider, metaInfo, resultsView) { + let menulayout = resultsView._menuLayout; + let app = appSys.lookup_app(metaInfo['id']) || appSys.lookup_app(provider.id); + let displayType = menulayout.layoutProperties.SearchDisplayType; + super._init(menulayout, app, displayType, metaInfo); + this.app = app; + this.provider = provider; + this.metaInfo = metaInfo; + this.resultsView = resultsView; + + if(!this.app && this.metaInfo['description']) + this.description = this.metaInfo['description'].split('\n')[0]; + + let highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + if(highlightSearchResultTerms){ + this._termsChangedId = this.resultsView.connect('terms-changed', this._highlightTerms.bind(this)); + this._highlightTerms(); + } + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._termsChangedId) { + this.resultsView.disconnect(this._termsChangedId); + this._termsChangedId = null; + } + } + + _highlightTerms() { + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.descriptionLabel && showSearchResultDescriptions){ + let descriptionMarkup = this.resultsView.highlightTerms(this.descriptionLabel.text.split('\n')[0]); + this.descriptionLabel.clutter_text.set_markup(descriptionMarkup); + } + + let labelMarkup = this.resultsView.highlightTerms(this.label.text.split('\n')[0]); + this.label.clutter_text.set_markup(labelMarkup); + } +}); + +var SearchResultsBase = GObject.registerClass({ + Signals: { 'terms-changed': {}, + 'no-results': {} }, +}, class ArcMenu_SearchResultsBase extends St.BoxLayout { + _init(provider, resultsView) { + super._init({ vertical: true }); + this.provider = provider; + this.resultsView = resultsView; + this._menuLayout = resultsView._menuLayout; + this._terms = []; + + this._resultDisplayBin = new St.Bin({ + x_expand: true, + y_expand: true + }); + + this.add_child(this._resultDisplayBin); + + this._resultDisplays = {}; + this._clipboard = St.Clipboard.get_default(); + + this._cancellable = new Gio.Cancellable(); + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + this._terms = []; + } + + _createResultDisplay(meta) { + if (this.provider.createResultObject) + return this.provider.createResultObject(meta, this.resultsView); + + return null; + } + + clear() { + this._cancellable.cancel(); + for (let resultId in this._resultDisplays) + this._resultDisplays[resultId].destroy(); + this._resultDisplays = {}; + this._clearResultDisplay(); + this.hide(); + } + + _setMoreCount(count) { + } + + _ensureResultActors(results, callback) { + let metasNeeded = results.filter( + resultId => this._resultDisplays[resultId] === undefined + ); + + if (metasNeeded.length === 0) { + callback(true); + } else { + this._cancellable.cancel(); + this._cancellable.reset(); + + this.provider.getResultMetas(metasNeeded, metas => { + if (this._cancellable.is_cancelled()) { + if (metas.length > 0) + log(`Search provider ${this.provider.id} returned results after the request was canceled`); + callback(false); + return; + } + if (metas.length != metasNeeded.length) { + log('Wrong number of result metas returned by search provider ' + this.provider.id + + ': expected ' + metasNeeded.length + ' but got ' + metas.length); + callback(false); + return; + } + if (metas.some(meta => !meta.name || !meta.id)) { + log('Invalid result meta returned from search provider ' + this.provider.id); + callback(false); + return; + } + + metasNeeded.forEach((resultId, i) => { + let meta = metas[i]; + let display = this._createResultDisplay(meta); + this._resultDisplays[resultId] = display; + }); + callback(true); + }, this._cancellable); + } + } + + updateSearch(providerResults, terms, callback) { + this._terms = terms; + if (providerResults.length == 0) { + this._clearResultDisplay(); + this.hide(); + callback(); + } else { + let maxResults = this._getMaxDisplayedResults(); + let results = this.provider.filterResults(providerResults, maxResults); + let moreCount = Math.max(providerResults.length - results.length, 0); + + this._ensureResultActors(results, successful => { + if (!successful) { + this._clearResultDisplay(); + callback(); + return; + } + + // To avoid CSS transitions causing flickering when + // the first search result stays the same, we hide the + // content while filling in the results. + this.hide(); + this._clearResultDisplay(); + results.forEach(resultId => { + this._addItem(this._resultDisplays[resultId]); + }); + + this._setMoreCount(this.provider.canLaunchSearch ? moreCount : 0); + this.show(); + callback(); + }); + } + } +}); + +var ListSearchResults = GObject.registerClass( +class ArcMenu_ListSearchResults extends SearchResultsBase { + _init(provider, resultsView) { + super._init(provider, resultsView); + this._menuLayout = resultsView._menuLayout; + this.searchType = this._menuLayout.layoutProperties.SearchDisplayType; + this._settings = this._menuLayout._settings; + this.layout = this._settings.get_enum('menu-layout'); + + this._container = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + x_expand: true, + y_expand: true, + }); + + if(this.searchType === Constants.DisplayType.GRID){ + this.add_style_class_name('margin-box'); + } + + this.providerInfo = new ArcSearchProviderInfo(provider, this._menuLayout); + this.providerInfo.connect('activate', () => { + if (provider.canLaunchSearch) { + provider.launchSearch(this._terms); + this._menuLayout.arcMenu.toggle(); + } + }); + + this._container.add_child(this.providerInfo); + + this._content = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL + }); + + this._container.add_child(this._content); + this._resultDisplayBin.set_child(this._container); + } + + _setMoreCount(count) { + this.providerInfo.setMoreCount(count); + } + + _getMaxDisplayedResults() { + return this._settings.get_int('max-search-results'); + } + + _clearResultDisplay() { + this._content.remove_all_children(); + } + + _createResultDisplay(meta) { + return super._createResultDisplay(meta, this.resultsView) || + new ListSearchResult(this.provider, meta, this.resultsView); + } + + _addItem(display) { + if(display.get_parent()) + display.get_parent().remove_child(display); + this._content.add_child(display); + } + + getFirstResult() { + if (this._content.get_n_children() > 0) + return this._content.get_child_at_index(0)._delegate; + else + return null; + } +}); + +var AppSearchResults = GObject.registerClass( +class ArcMenu_AppSearchResults extends SearchResultsBase { + _init(provider, resultsView) { + super._init(provider, resultsView); + this._parentContainer = resultsView; + this._menuLayout = resultsView._menuLayout; + this._settings = this._menuLayout._settings; + this.layoutProperties = this._menuLayout.layoutProperties; + this.searchType = this.layoutProperties.SearchDisplayType; + this.layout = this._menuLayout._settings.get_enum('menu-layout'); + + this.itemCount = 0; + this.gridTop = -1; + this.gridLeft = 0; + + this.rtl = this._menuLayout.mainBox.get_text_direction() == Clutter.TextDirection.RTL; + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.searchType === Constants.DisplayType.GRID ? this.layoutProperties.ColumnSpacing : 0, + row_spacing: this.searchType === Constants.DisplayType.GRID ? this.layoutProperties.RowSpacing : 0, + }); + this._grid = new St.Widget({ + x_expand: true, + x_align: this.searchType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this._grid); + + if(this.searchType === Constants.DisplayType.GRID){ + let spacing = this.layoutProperties.ColumnSpacing; + + this._grid.style = "padding: 0px 0px 10px 0px; spacing: " + spacing + "px;"; + this._resultDisplayBin.x_align = Clutter.ActorAlign.CENTER; + } + + this._resultDisplayBin.set_child(this._grid); + } + + _getMaxDisplayedResults() { + let maxDisplayedResults; + if(this.searchType === Constants.DisplayType.GRID) + maxDisplayedResults = this._menuLayout.getColumnsFromGridIconSizeSetting(); + else + maxDisplayedResults = this._settings.get_int('max-search-results'); + return maxDisplayedResults; + } + + _clearResultDisplay() { + this.itemCount = 0; + this.gridTop = -1; + this.gridLeft = 0; + this._grid.remove_all_children(); + } + + _createResultDisplay(meta) { + return new AppSearchResult(this.provider, meta, this.resultsView); + } + + _addItem(display) { + const GridColumns = this.searchType === Constants.DisplayType.LIST ? 1 : this._menuLayout.getColumnsFromGridIconSizeSetting(); + if(!this.rtl && (this.itemCount % GridColumns === 0)){ + this.gridTop++; + this.gridLeft = 0; + } + else if(this.rtl && (this.gridLeft === 0)){ + this.gridTop++; + this.gridLeft = GridColumns; + } + this._grid.layout_manager.attach(display, this.gridLeft, this.gridTop, 1, 1); + display.gridLocation = [this.gridLeft, this.gridTop]; + + if(!this.rtl) + this.gridLeft++; + else if(this.rtl) + this.gridLeft--; + this.itemCount++; + } + + getFirstResult() { + if (this._grid.get_n_children() > 0) + return this._grid.get_child_at_index(0)._delegate; + else + return null; + } +}); + +var SearchResults = GObject.registerClass({ + Signals: { 'terms-changed': {}, + 'have-results': {}, + 'no-results': {} }, +}, class ArcMenu_SearchResults extends St.BoxLayout { + _init(menuLayout) { + super._init({ + vertical: true, + y_expand: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL + }); + this._menuLayout = menuLayout; + this.layoutProperties = this._menuLayout.layoutProperties; + this.searchType = this.layoutProperties.SearchDisplayType; + this._settings = this._menuLayout._settings; + this.layout = this._settings.get_enum('menu-layout'); + + this._content = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.FILL + }); + + this.add_child(this._content); + + this._statusText = new St.Label(); + this._statusBin = new St.Bin({ + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true, + y_expand: true + }); + + if(menuLayout._settings.get_boolean('enable-custom-arc-menu')) + this._statusText.style_class = 'arc-menu-status-text'; + else + this._statusText.style_class = ''; + + this.add_child(this._statusBin); + this._statusBin.set_child(this._statusText); + + this._highlightDefault = true; + this._defaultResult = null; + this._startingSearch = false; + + this._terms = []; + this._results = {}; + + this._providers = []; + + this._highlightRegex = null; + + this.recentFilesManager = new RecentFilesManager(); + + this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA }); + this.disabledID = this._searchSettings.connect('changed::disabled', this._reloadRemoteProviders.bind(this)); + this.enabledID = this._searchSettings.connect('changed::enabled', this._reloadRemoteProviders.bind(this)); + this.disablExternalID = this._searchSettings.connect('changed::disable-external', this._reloadRemoteProviders.bind(this)); + this.sortOrderID = this._searchSettings.connect('changed::sort-order', this._reloadRemoteProviders.bind(this)); + + this._searchTimeoutId = null; + this._cancellable = new Gio.Cancellable(); + + this._registerProvider(new AppDisplay.AppSearchProvider()); + + this.installChangedID = appSys.connect('installed-changed', this._reloadRemoteProviders.bind(this)); + + this._reloadRemoteProviders(); + + this.connect('destroy', this._onDestroy.bind(this)); + } + + get terms() { + return this._terms; + } + + setStyle(style){ + if(this._statusText){ + this._statusText.style_class = style; + } + } + + _onDestroy(){ + this._terms = []; + this._results = {}; + this._clearDisplay(); + this._clearSearchTimeout(); + this._defaultResult = null; + this._startingSearch = false; + if(this.disabledID){ + this._searchSettings.disconnect(this.disabledID); + this.disabledID = null; + } + if(this.enabledID){ + this._searchSettings.disconnect(this.enabledID); + this.enabledID = null; + } + if(this.disablExternalID){ + this._searchSettings.disconnect(this.disablExternalID); + this.disablExternalID = null; + } + if(this.sortOrderID){ + this._searchSettings.disconnect(this.sortOrderID); + this.sortOrderID = null; + } + if(this.installChangedID){ + appSys.disconnect(this.installChangedID); + this.installChangedID = null; + } + let remoteProviders = this._providers.filter(p => p.isRemoteProvider); + remoteProviders.forEach(provider => { + this._unregisterProvider(provider); + }); + + this.recentFilesManager.destroy(); + this.recentFilesManager = null; + + this._content.destroy_all_children(); + } + + _reloadRemoteProviders() { + let currentTerms = this._terms; + //cancel any active search + if (this._terms.length !== 0) + this._reset(); + + this._oldProviders = null; + let remoteProviders = this._providers.filter(p => p.isRemoteProvider); + + remoteProviders.forEach(provider => { + this._unregisterProvider(provider); + }); + + if(this._settings.get_boolean('search-provider-open-windows')) + this._registerProvider(new OpenWindowSearchProvider()); + if(this._settings.get_boolean('search-provider-recent-files')) + this._registerProvider(new RecentFilesSearchProvider(this.recentFilesManager)); + + RemoteSearch.loadRemoteSearchProviders(this._searchSettings, providers => { + providers.forEach(this._registerProvider.bind(this)); + }); + + //restart any active search + if(currentTerms.length > 0) + this.setTerms(currentTerms); + } + + _registerProvider(provider) { + provider.searchInProgress = false; + this._providers.push(provider); + this._ensureProviderDisplay(provider); + } + + _unregisterProvider(provider) { + let index = this._providers.indexOf(provider); + this._providers.splice(index, 1); + + if (provider.display){ + provider.display.destroy(); + } + } + + _gotResults(results, provider) { + this._results[provider.id] = results; + this._updateResults(provider, results); + } + + _clearSearchTimeout() { + if (this._searchTimeoutId) { + GLib.source_remove(this._searchTimeoutId); + this._searchTimeoutId = null; + } + } + + _reset() { + this._terms = []; + this._results = {}; + this._clearDisplay(); + this._clearSearchTimeout(); + this._defaultResult = null; + this._startingSearch = false; + + this._updateSearchProgress(); + } + + _doSearch() { + this._startingSearch = false; + + let previousResults = this._results; + this._results = {}; + + this._providers.forEach(provider => { + provider.searchInProgress = true; + + let previousProviderResults = previousResults[provider.id]; + if (this._isSubSearch && previousProviderResults) + provider.getSubsearchResultSet(previousProviderResults, + this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + else + provider.getInitialResultSet(this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + }); + + this._updateSearchProgress(); + + this._clearSearchTimeout(); + } + + _onSearchTimeout() { + this._searchTimeoutId = null; + this._doSearch(); + return GLib.SOURCE_REMOVE; + } + + setTerms(terms) { + // Check for the case of making a duplicate previous search before + // setting state of the current search or cancelling the search. + // This will prevent incorrect state being as a result of a duplicate + // search while the previous search is still active. + let searchString = terms.join(' '); + let previousSearchString = this._terms.join(' '); + if (searchString == previousSearchString) + return; + + this._startingSearch = true; + + this.recentFilesManager.cancelCurrentQueries(); + + this._cancellable.cancel(); + this._cancellable.reset(); + + if (terms.length == 0) { + this._reset(); + return; + } + + let isSubSearch = false; + if (this._terms.length > 0) + isSubSearch = searchString.indexOf(previousSearchString) == 0; + + this._terms = terms; + this._isSubSearch = isSubSearch; + this._updateSearchProgress(); + + if (this._searchTimeoutId === null) + this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, this._onSearchTimeout.bind(this)); + + + + const escapedTerms = terms + .map(term => Shell.util_regex_escape(term)) + .filter(term => term.length > 0); + + if (escapedTerms.length === 0) + return; + + this._highlightRegex = new RegExp('(%s)'.format( + escapedTerms.join('|')), 'gi'); + + this.emit('terms-changed'); + } + + _ensureProviderDisplay(provider) { + if (provider.display) + return; + + let providerDisplay; + if (provider.appInfo) + providerDisplay = new ListSearchResults(provider, this); + else + providerDisplay = new AppSearchResults(provider, this); + providerDisplay.hide(); + this._content.add_child(providerDisplay); + provider.display = providerDisplay; + } + + _clearDisplay() { + this._providers.forEach(provider => { + provider.display.clear(); + }); + } + + _maybeSetInitialSelection() { + let newDefaultResult = null; + + let providers = this._providers; + for (let i = 0; i < providers.length; i++) { + let provider = providers[i]; + let display = provider.display; + + if (!display.visible) + continue; + + let firstResult = display.getFirstResult(); + if (firstResult) { + newDefaultResult = firstResult; + break; // select this one! + } + } + + if (newDefaultResult !== this._defaultResult) { + this._setSelected(this._defaultResult, false); + this._setSelected(newDefaultResult, this._highlightDefault); + + this._defaultResult = newDefaultResult; + } + } + + get searchInProgress() { + if (this._startingSearch) + return true; + + return this._providers.some(p => p.searchInProgress); + } + + _updateSearchProgress() { + let haveResults = this._providers.some(provider => { + let display = provider.display; + return (display.getFirstResult() != null); + }); + + this._statusBin.visible = !haveResults; + if (haveResults) + this.emit("have-results") + else if (!haveResults) { + if (this.searchInProgress) + this._statusText.set_text(_("Searching...")); + else + this._statusText.set_text(_("No results.")); + + this.emit("no-results") + } + } + + _updateResults(provider, results) { + let terms = this._terms; + let display = provider.display; + display.updateSearch(results, terms, () => { + provider.searchInProgress = false; + + this._maybeSetInitialSelection(); + this._updateSearchProgress(); + }); + } + + highlightDefault(highlight) { + this._highlightDefault = highlight; + this._setSelected(this._defaultResult, highlight); + } + + getTopResult(){ + return this._defaultResult; + } + + getProviders(){ + return this._providers; + } + + setProvider(providerID){ + if(!this._oldProviders) + this._oldProviders = this._providers; + this._clearDisplay(); + this._providers = this._oldProviders; + if(providerID === Constants.CategoryType.ALL_PROGRAMS){ + this._providers = this._providers.filter(p => (p.appInfo ? false : true)); + } + else if(providerID !== Constants.CategoryType.SEARCH_RESULTS){ + this._providers = this._providers.filter(p => (p.appInfo ? p.appInfo.get_id() : p) === providerID); + } + } + + _setSelected(result, selected) { + if(!result) + return; + + if(selected) + result.add_style_pseudo_class('active'); + else + result.remove_style_pseudo_class('active'); + } + + hasActiveResult(){ + return (this._defaultResult ? true : false) && this._highlightDefault; + } + + highlightTerms(text) { + if (!this._highlightRegex) + return GLib.markup_escape_text(text, -1); + + let escaped = []; + let lastMatchEnd = 0; + let match; + while ((match = this._highlightRegex.exec(text))) { + if (match.index > lastMatchEnd) { + let unmatched = GLib.markup_escape_text( + text.slice(lastMatchEnd, match.index), -1); + escaped.push(unmatched); + } + let matched = GLib.markup_escape_text(match[0], -1); + escaped.push('%s'.format(matched)); + lastMatchEnd = match.index + match[0].length; + } + let unmatched = GLib.markup_escape_text( + text.slice(lastMatchEnd), -1); + escaped.push(unmatched); + + return escaped.join(''); + } +}); + +var ArcSearchProviderInfo = GObject.registerClass(class Arc_Menu_ArcSearchProviderInfo extends MW.ArcMenuPopupBaseMenuItem{ + _init(provider, menuLayout) { + super._init(menuLayout); + this.provider = provider; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this.description = this.provider.appInfo.get_description(); + if(this.description) + this.description = this.description.split('\n')[0]; + + this.label = new St.Label({ + text: provider.appInfo.get_name(), + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + style: 'text-align: left;' + }); + + this.label.style = 'font-weight: bold;'; + this.style = "padding: 10px 0px;"; + this.add_child(this.label); + + this._moreText = ""; + } + + setMoreCount(count) { + this._moreText = ngettext("%d more", "%d more", count).format(count); + + if(count > 0) + this.label.text = this.provider.appInfo.get_name() + " (" + this._moreText + ")"; + else + this.label.text = this.provider.appInfo.get_name(); + } +}); diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js new file mode 100644 index 0000000..933a1e6 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js @@ -0,0 +1,93 @@ +const { Meta, Gio, St, Shell } = imports.gi; + +const Main = imports.ui.main; +const { getWindows } = imports.ui.altTab; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +function createIcon(app, size) { + return app + ? app.create_icon_texture(size) + : new St.Icon({ icon_name: 'icon-missing', icon_size: size }); +} + +var OpenWindowSearchProvider = class { + constructor() { + this.id = 'arcmenu.open-windows'; + this.isRemoteProvider = true; + this.canLaunchSearch = false; + + this._appWindows = []; + this._windowTracker = Shell.WindowTracker.get_default(); + + this.appInfo = { + get_description: () => _('List of open windows across all workspaces'), + get_name: () => _('Open Windows'), + get_id: () => 'arcmenu.open-windows', + get_icon: () => Gio.icon_new_for_string('focus-windows-symbolic'), + } + } + + getResultMetas(winIds, callback) { + const metas = winIds.map(winId => { + const aw = this._getAppWindow(winId); + return aw ? { + id: winId, + name: aw.window.title ?? aw.app.get_name(), + description: aw.window.get_workspace() ? _("'%s' on Workspace %d").format(aw.app.get_name(), aw.window.get_workspace().index() + 1) : aw.app.get_name(), + createIcon: (size) => createIcon(aw.app, size), + } : undefined; + }).filter(m => m?.name !== undefined && m?.name !== null); + + callback(metas); + } + + filterResults(results, maxNumber) { + return results.slice(0, maxNumber); + } + + getInitialResultSet(terms, callback, _cancellable) { + this._appWindows = getWindows(null).map(window => { + return { + window, + app: this._windowTracker.get_window_app(window), + } + }); + + callback(this._getFilteredWindowIds(terms, this._appWindows)); + } + + getSubsearchResultSet(previousResults, terms, callback, _cancellable) { + const appWindows = previousResults.map(winId => this._getAppWindow(winId)).filter(aw => aw !== undefined); + callback(this._getFilteredWindowIds(terms, appWindows)); + } + + activateResult(winId, _terms) { + const window = this._getAppWindow(winId)?.window; + if (window) + Main.activateWindow(window); + } + + launchSearch() { + + } + + _getFilteredWindowIds(terms, appWindows) { + terms = terms.map(term => term.toLowerCase()); + appWindows = appWindows.filter(aw => { + const title = aw.window.title?.toLowerCase(); + const appName = aw.app.get_name()?.toLowerCase(); + const appDescription = aw.app.get_description()?.toLowerCase(); + return terms.some(term => title?.includes(term) || appName?.includes(term) || appDescription?.includes(term)); + }); + + return appWindows.map(aw => aw.window.get_id().toString()); + } + + _getAppWindow(winId) { + winId = typeof winId === "string" ? parseInt(winId) : winId; + return this._appWindows.find(aw => aw.window.get_id() === winId); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js new file mode 100644 index 0000000..fb595e4 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js @@ -0,0 +1,100 @@ +const { Meta, Gtk, Gio, GLib, St, Shell } = imports.gi; + +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +function createIcon(mimeType, size) { + let symbolicIcon = mimeType ? Gio.content_type_get_symbolic_icon(mimeType)?.to_string() : null; + return symbolicIcon + ? new St.Icon({ gicon: Gio.icon_new_for_string(symbolicIcon), icon_size: size }) + : new St.Icon({ icon_name: 'icon-missing', icon_size: size }); +} + +var RecentFilesSearchProvider = class { + constructor(recentFilesManager) { + this.id = 'arcmenu.recent-files'; + this.isRemoteProvider = true; + this.canLaunchSearch = false; + this.recentFilesManager = recentFilesManager; + this._recentFiles = []; + + this.appInfo = { + get_description: () => _('Recent Files'), + get_name: () => _('Recent Files'), + get_id: () => 'arcmenu.recent-files', + get_icon: () => Gio.icon_new_for_string('document-open-recent-symbolic'), + } + } + + getResultMetas(fileUris, callback) { + const metas = fileUris.map(fileUri => { + const rf = this._getRecentFile(fileUri); + const file = Gio.File.new_for_uri(rf.get_uri()); + return rf ? { + id: fileUri, + name: rf.get_display_name(), + description: file.get_parent()?.get_path(), // can be null + createIcon: (size) => createIcon(rf.get_mime_type(), size), + } : undefined; + }).filter(m => m?.name !== undefined && m?.name !== null); + + callback(metas); + } + + filterResults(results, maxNumber) { + return results.slice(0, maxNumber); + } + + getInitialResultSet(terms, callback, _cancellable) { + this.recentFilesManager.cancelCurrentQueries(); + this._recentFiles = []; + this.recentFilesManager.filterRecentFiles(recentFile => { + this._recentFiles.push(recentFile); + callback(this._getFilteredFileUris(terms, this._recentFiles)); + }); + } + + getSubsearchResultSet(previousResults, terms, callback, _cancellable) { + const recentFiles = previousResults.map(fileUri => this._getRecentFile(fileUri)).filter(rf => rf !== undefined); + callback(this._getFilteredFileUris(terms, recentFiles)); + } + + activateResult(fileUri, _terms) { + const recentFile = this._getRecentFile(fileUri); + if (recentFile){ + let context = global.create_app_launch_context(0, -1); + + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(recentFile.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + Main.notifyError(_('Failed to open “%s”').format(recentFile.get_display_name()), e.message); + reject(e); + } + }); + }); + } + } + + launchSearch() { + } + + _getFilteredFileUris(terms, recentFiles) { + terms = terms.map(term => term.toLowerCase()); + recentFiles = recentFiles.filter(rf => { + const fileName = rf.get_display_name()?.toLowerCase(); + return terms.some(term => fileName?.includes(term)); + }); + + return recentFiles.map(rf => rf.get_uri()); + } + + _getRecentFile(fileUri) { + return this._recentFiles.find(rf => rf.get_uri() === fileUri); + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js new file mode 100644 index 0000000..6c0613d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js @@ -0,0 +1,376 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var StandaloneRunner = class Arc_Menu_StandaloneRunner{ + constructor(settings) { + this._settings = settings; + + this.tooltipShowing = false; + this.tooltipHidingID = null; + this.tooltipShowingID = null; + this.dtpNeedsRelease = false; + + this.dummyWidget = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyWidget); + + //Create Main Menus - ArcMenu and arcMenu's context menu + this.arcMenu = new ArcMenu(this.dummyWidget, 0.5, St.Side.TOP, this); + this.arcMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.menuManager = new PopupMenu.PopupMenuManager(Main.panel); + this.menuManager._changeMenu = (menu) => {}; + this.menuManager.addMenu(this.arcMenu); + + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + + let rect = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryMonitor.index); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY = rect.y + this.rise; + this.dummyWidget.set_position(positionX, positionY); + + //Context Menus for applications and other menu items + this.contextMenuManager = new PopupMenu.PopupMenuManager(this.dummyWidget); + this.contextMenuManager._changeMenu = (menu) => {}; + this.contextMenuManager._onMenuSourceEnter = (menu) =>{ + if (this.contextMenuManager.activeMenu && this.contextMenuManager.activeMenu != menu) + return Clutter.EVENT_STOP; + + return Clutter.EVENT_PROPAGATE; + } + + //Sub Menu Manager - Control all other popup menus + this.subMenuManager = new PopupMenu.PopupMenuManager(this.dummyWidget); + this.subMenuManager._changeMenu = (menu) => {}; + } + + initiate(){ + this.initiateRecentlyInstalledApps(); + + //Create Basic Layout + this.createLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.createLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + initiateRecentlyInstalledApps(){ + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this._settings.get_boolean('disable-recently-installed-apps')) + return; + + this._appList = this.listAllApps(); + //Update Categories on 'installed-changed' event------------------------------------- + this._installedChangedId = appSys.connect('installed-changed', () => { + this._newAppList = this.listAllApps(); + + //Filter to find if a new application has been installed + let newApps = this._newAppList.filter(app => !this._appList.includes(app)); + + //A New Application has been installed + //Save it in settings + if(newApps.length){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + let newRecentApps = [...new Set(recentApps.concat(newApps))]; + this._settings.set_strv('recently-installed-apps', newRecentApps); + this.MenuLayout.reloadApplications(); + } + + this._appList = this._newAppList; + }); + } + + listAllApps(){ + let appList = appSys.get_installed().filter(appInfo => { + try { + appInfo.get_id(); // catch invalid file encodings + } catch (e) { + return false; + } + return appInfo.should_show(); + }); + return appList.map(app => app.get_id()); + } + + createMenuLayout(){ + this._forcedMenuLocation = false; + this.arcMenu.actor.style = null; + this.arcMenu.removeAll(); + this.section = new PopupMenu.PopupMenuSection(); + this.arcMenu.addMenuItem(this.section); + this.mainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL + }); + this.mainBox._delegate = this.mainBox; + this.section.actor.add_child(this.mainBox); + + const StandaloneRunner = true; + this.MenuLayout = Utils.getMenuLayout(this, Constants.MenuLayout.RUNNER, StandaloneRunner); + this.updateStyle(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + reloadMenuLayout(){ + this._forcedMenuLocation = false; + + this.MenuLayout.destroy(); + this.MenuLayout = null; + + this.arcMenu.actor.style = null; + + const StandaloneRunner = true; + this.MenuLayout = Utils.getMenuLayout(this, Constants.MenuLayout.RUNNER, StandaloneRunner); + + this.updateStyle(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + + this.arcMenu.actor.set_style_class_name(null); + this.arcMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + if(this.MenuLayout) + this.MenuLayout.updateStyle(); + } + + toggleMenu(){ + if(this.contextMenuManager.activeMenu) + this.contextMenuManager.activeMenu.toggle(); + if(this.subMenuManager.activeMenu) + this.subMenuManager.activeMenu.toggle(); + + if(!this.arcMenu.isOpen){ + this.MenuLayout.updateLocation(); + this.arcMenu.toggle(); + if(this.arcMenu.isOpen) + this.mainBox.grab_key_focus(); + } + else if(this.arcMenu.isOpen){ + this.arcMenu.toggle(); + } + } + + getActiveMenu(){ + if(this.contextMenuManager.activeMenu) + return this.contextMenuManager.activeMenu; + else if(this.subMenuManager.activeMenu) + return this.subMenuManager.activeMenu; + else if(this.arcMenu.isOpen) + return this.arcMenu; + else + return null; + } + + destroy(){ + if(this.createLayoutID){ + GLib.source_remove(this.createLayoutID); + this.createLayoutID = null; + } + + if(this.updateMenuLayoutID){ + GLib.source_remove(this.updateMenuLayoutID); + this.updateMenuLayoutID = null; + } + + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this.MenuLayout) + this.MenuLayout.destroy(); + if(this.arcMenu) + this.arcMenu.destroy(); + if(this.dummyWidget){ + Main.uiGroup.remove_child(this.dummyWidget); + this.dummyWidget.destroy(); + } + } + + updateMenuLayout(){ + this.tooltipShowing = false; + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.MenuLayout){ + this.MenuLayout.destroy(); + this.MenuLayout = null; + } + this.updateMenuLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.updateMenuLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + loadExtraPinnedApps(){ + if(this.MenuLayout) + this.MenuLayout.loadExtraPinnedApps(); + } + + updateLocation(){ + if(this.MenuLayout) + this.MenuLayout.updateLocation(); + } + + displayPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.displayPinnedApps(); + } + + loadPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.loadPinnedApps(); + } + + reload(){ + if(this.MenuLayout){ + this.reloadMenuLayout(); + } + } + + shouldLoadPinnedApps(){ + if(this.MenuLayout) + return this.MenuLayout.shouldLoadPinnedApps; + } + + setDefaultMenuView(){ + if(this.MenuLayout) + this.MenuLayout.setDefaultMenuView(); + } + + _onOpenStateChanged(menu, open) { + if(open){ + if(Main.panel.menuManager && Main.panel.menuManager.activeMenu) + Main.panel.menuManager.activeMenu.toggle(); + } + else{ + if(!this.arcMenu.isOpen){ + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + this.tooltipShowing = false; + if(this.activeTooltip){ + this.activeTooltip.hide(); + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + } + } + } +}; + +var ArcMenu = class Arc_Menu_ArcMenu extends PopupMenu.PopupMenu{ + constructor(sourceActor, arrowAlignment, arrowSide, standaloneRunner) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this.standaloneRunner = standaloneRunner; + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + this._boxPointer.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this._menuClosedID = this.connect('menu-closed', () => this.standaloneRunner.setDefaultMenuView()); + this.connect('destroy', () => this._onDestroy()); + } + + open(animate){ + if(!this.isOpen) + this.standaloneRunner.arcMenu.actor._muteInput = false; + super.open(animate); + } + + close(animate){ + if(this.isOpen){ + if(this.standaloneRunner.contextMenuManager.activeMenu) + this.standaloneRunner.contextMenuManager.activeMenu.toggle(); + if(this.standaloneRunner.subMenuManager.activeMenu) + this.standaloneRunner.subMenuManager.activeMenu.toggle(); + } + + super.close(animate); + } + + _onDestroy(){ + if(this._menuClosedID){ + this.disconnect(this._menuClosedID) + this._menuClosedID = null; + } + } +}; diff --git a/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/utils.js b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/utils.js new file mode 100644 index 0000000..92207b5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/arcmenu@arcmenu.com/utils.js @@ -0,0 +1,687 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Constants = Me.imports.constants; +const {Gio, GLib} = imports.gi; + +const PowerManagerInterface = ` + + + + + + + + + + + + + + +`; +const PowerManager = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface); + +function canHibernate(asyncCallback){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHibernateRemote((result, error) => { + if(error) + asyncCallback(false, false); + else{ + let needsAuth = result[0] === 'challenge'; + let canHibernate = needsAuth || result[0] === 'yes'; + asyncCallback(canHibernate, needsAuth); + } + }); +} + +function activateHibernate(){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHibernateRemote((result, error) => { + if(error || result[0] !== 'yes') + imports.ui.main.notifyError(_("ArcMenu - Hibernate Error!"), _("System unable to hibernate.")); + else{ + proxy.HibernateRemote(true); + } + }); +} + +function canHybridSleep(asyncCallback){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHybridSleepRemote((result, error) => { + if(error) + asyncCallback(false, false); + else{ + let needsAuth = result[0] === 'challenge'; + let canHybridSleep = needsAuth || result[0] === 'yes'; + asyncCallback(canHybridSleep, needsAuth); + } + }); +} + +function activateHybridSleep(){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHybridSleepRemote((result, error) => { + if(error || result[0] !== 'yes') + imports.ui.main.notifyError(_("ArcMenu - Hybrid Sleep Error!"), _("System unable to hybrid sleep.")); + else{ + proxy.HybridSleepRemote(true); + } + }); +} + +function getMenuLayout(menuButton, layout, isStandaloneRunner){ + let MenuLayout = Me.imports.menulayouts; + switch(layout){ + case Constants.MenuLayout.ARCMENU: + return new MenuLayout.arcmenu.createMenu(menuButton); + case Constants.MenuLayout.BRISK: + return new MenuLayout.brisk.createMenu(menuButton); + case Constants.MenuLayout.WHISKER: + return new MenuLayout.whisker.createMenu(menuButton); + case Constants.MenuLayout.GNOME_MENU: + return new MenuLayout.gnomemenu.createMenu(menuButton); + case Constants.MenuLayout.MINT: + return new MenuLayout.mint.createMenu(menuButton); + case Constants.MenuLayout.GNOME_OVERVIEW: + return null; + case Constants.MenuLayout.ELEMENTARY: + return new MenuLayout.elementary.createMenu(menuButton); + case Constants.MenuLayout.REDMOND: + return new MenuLayout.redmond.createMenu(menuButton); + case Constants.MenuLayout.SIMPLE: + return new MenuLayout.simple.createMenu(menuButton); + case Constants.MenuLayout.SIMPLE_2: + return new MenuLayout.simple2.createMenu(menuButton); + case Constants.MenuLayout.UNITY: + return new MenuLayout.unity.createMenu(menuButton); + case Constants.MenuLayout.BUDGIE: + return new MenuLayout.budgie.createMenu(menuButton); + case Constants.MenuLayout.INSIDER: + return new MenuLayout.insider.createMenu(menuButton); + case Constants.MenuLayout.RUNNER: + return new MenuLayout.runner.createMenu(menuButton, isStandaloneRunner); + case Constants.MenuLayout.CHROMEBOOK: + return new MenuLayout.chromebook.createMenu(menuButton); + case Constants.MenuLayout.RAVEN: + return new MenuLayout.raven.createMenu(menuButton); + case Constants.MenuLayout.TOGNEE: + return new MenuLayout.tognee.createMenu(menuButton); + case Constants.MenuLayout.PLASMA: + return new MenuLayout.plasma.createMenu(menuButton); + case Constants.MenuLayout.WINDOWS: + return new MenuLayout.windows.createMenu(menuButton); + case Constants.MenuLayout.LAUNCHER: + return new MenuLayout.launcher.createMenu(menuButton); + case Constants.MenuLayout.ELEVEN: + return new MenuLayout.eleven.createMenu(menuButton); + case Constants.MenuLayout.AZ: + return new MenuLayout.az.createMenu(menuButton); + default: + return new MenuLayout.arcmenu.createMenu(menuButton); + } +} + +function getSettings(schema, extensionUUID) { + let extension = imports.ui.main.extensionManager.lookup(extensionUUID); + + if (!extension) + throw new Error('ArcMenu - getSettings() unable to find extension'); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Expect USER extensions to have a schemas/ subfolder, otherwise assume a + // SYSTEM extension that has been installed in the same prefix as the shell + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) { + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + } else { + schemaSource = GioSSS.get_default(); + } + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error(`Schema ${schema} could not be found for extension ${extension.metadata.uuid}. Please check your installation`); + + return new Gio.Settings({ settings_schema: schemaObj }); +} + +function convertToGridLayout(item){ + const Clutter = imports.gi.Clutter; + const settings = item._settings; + const layoutProperties = item._menuLayout.layoutProperties; + + let icon = item._icon ? item._icon : item._iconBin; + + item.vertical = true; + if(item._ornamentLabel) + item.remove_child(item._ornamentLabel); + + item.tooltipLocation = Constants.TooltipLocation.BOTTOM_CENTERED; + item.label.x_align = item.label.y_align = Clutter.ActorAlign.CENTER; + item.label.y_expand = true; + + icon.y_align = Clutter.ActorAlign.CENTER; + icon.y_expand = true; + if(settings.get_boolean('multi-lined-labels')){ + icon.y_align = Clutter.ActorAlign.TOP; + icon.y_expand = false; + + let clutterText = item.label.get_clutter_text(); + clutterText.set({ + line_wrap: true, + line_wrap_mode: imports.gi.Pango.WrapMode.WORD_CHAR, + }); + } + + if(item._indicator){ + item.remove_child(item._indicator); + item.insert_child_at_index(item._indicator, 0); + item._indicator.x_align = Clutter.ActorAlign.CENTER; + item._indicator.y_align = Clutter.ActorAlign.START; + item._indicator.y_expand = false; + } + + const iconSizeEnum = settings.get_enum('menu-item-grid-icon-size'); + let defaultIconStyle = layoutProperties.DefaultIconGridStyle; + + iconSize = getGridIconStyle(iconSizeEnum, defaultIconStyle); + item.name = iconSize; +} + +function getIconSize(iconSizeEnum, defaultIconSize){ + const IconSizeEnum = iconSizeEnum; + let iconSize = defaultIconSize; + if(IconSizeEnum === Constants.IconSize.DEFAULT) + iconSize = defaultIconSize; + else if(IconSizeEnum === Constants.IconSize.EXTRA_SMALL) + iconSize = Constants.EXTRA_SMALL_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.SMALL) + iconSize = Constants.SMALL_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.MEDIUM) + iconSize = Constants.MEDIUM_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.LARGE) + iconSize = Constants.LARGE_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.EXTRA_LARGE) + iconSize = Constants.EXTRA_LARGE_ICON_SIZE; + + return iconSize; +} + +function getGridIconSize(iconSizeEnum, defaultIconStyle){ + let iconSize; + if(iconSizeEnum === Constants.GridIconSize.DEFAULT){ + Constants.GridIconInfo.forEach((info) => { + if(info.NAME === defaultIconStyle){ + iconSize = info.ICON_SIZE; + } + }); + } + else + iconSize = Constants.GridIconInfo[iconSizeEnum - 1].ICON_SIZE; + + return iconSize; +} + +function getGridIconStyle(iconSizeEnum, defaultIconStyle){ + const IconSizeEnum = iconSizeEnum; + let iconStyle = defaultIconStyle; + if(IconSizeEnum === Constants.GridIconSize.DEFAULT) + iconStyle = defaultIconStyle; + else if(IconSizeEnum === Constants.GridIconSize.SMALL) + iconStyle = 'SmallIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.MEDIUM) + iconStyle = 'MediumIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.LARGE) + iconStyle = 'LargeIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.SMALL_RECT) + iconStyle = 'SmallRectIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.MEDIUM_RECT) + iconStyle = 'MediumRectIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.LARGE_RECT) + iconStyle = 'LargeRectIconGrid'; + + return iconStyle; +} + +function getCategoryDetails(currentCategory, categoryIconType){ + let name, gicon, iconName, fallbackIconName; + for(let entry of Constants.Categories){ + if(entry.CATEGORY === currentCategory){ + name = entry.NAME; + if(categoryIconType === Constants.CategoryIconType.FULL_COLOR) + iconName = entry.FULL_COLOR_ICON; + else + iconName = entry.ICON; + return [name, gicon, iconName, fallbackIconName]; + } + } + if(currentCategory === Constants.CategoryType.HOME_SCREEN){ + name = _("Home Screen"); + gicon = Gio.icon_new_for_string(Me.path + '/media/icons/menu_icons/homescreen-symbolic.svg'); + return [name, gicon, iconName, fallbackIconName]; + } + else{ + name = currentCategory.get_name(); + if(categoryIconType === Constants.CategoryIconType.FULL_COLOR) + gicon = currentCategory.get_icon() ? currentCategory.get_icon() : null; + else + iconName = currentCategory.get_icon().to_string() + "-symbolic"; + fallbackIconName = currentCategory.get_icon() ? currentCategory.get_icon().to_string() : null; + return [name, gicon, iconName, fallbackIconName]; + } +} + +function activateCategory(currentCategory, menuLayout, menuItem, extraParams = false){ + if(currentCategory === Constants.CategoryType.HOME_SCREEN){ + menuLayout.activeCategory = _("Pinned Apps"); + menuLayout.displayPinnedApps(); + } + else if(currentCategory === Constants.CategoryType.PINNED_APPS) + menuLayout.displayPinnedApps(); + else if(currentCategory === Constants.CategoryType.FREQUENT_APPS){ + menuLayout.setFrequentAppsList(menuItem); + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + } + else if(currentCategory === Constants.CategoryType.ALL_PROGRAMS) + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + else if(currentCategory === Constants.CategoryType.RECENT_FILES) + menuLayout.displayRecentFiles(); + else + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + + menuLayout.activeCategoryType = currentCategory; +} + +function getMenuButtonIcon(settings, path){ + let iconType = settings.get_enum('menu-button-icon'); + + if(iconType === Constants.MenuIcon.CUSTOM){ + if(path && GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + else if(iconType === Constants.MenuIcon.DISTRO_ICON){ + let iconEnum = settings.get_int('distro-icon'); + path = Me.path + Constants.DistroIcons[iconEnum].PATH; + if(Constants.DistroIcons[iconEnum].PATH === 'start-here-symbolic') + return 'start-here-symbolic'; + else if(GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + else{ + let iconEnum = settings.get_int('arc-menu-icon'); + path = Me.path + Constants.MenuIcons[iconEnum].PATH; + if(GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + + global.log("ArcMenu Error - Failed to set menu button icon. Set to System Default."); + return 'start-here-symbolic'; +} + +function findSoftwareManager(){ + let softwareManager = null; + let appSys = imports.gi.Shell.AppSystem.get_default(); + + for(let softwareManagerID of Constants.SoftwareManagerIDs){ + if(appSys.lookup_app(softwareManagerID)){ + softwareManager = softwareManagerID; + break; + } + } + + return softwareManager; +} + +function createXpmImage(color1, color2, color3, color4){ + let width = 42; + let height = 14; + let colors = 5; + let xpm = [width + " " + height + " " + colors + " " + 1, "1 c " + rgbStringToHex(color1), "2 c " + rgbStringToHex(color2), + "3 c " + rgbStringToHex(color3), "4 c " + rgbStringToHex(color4), "x c #AAAAAA"]; + xpm.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + for(let i = 0; i < height - 2; i++) + xpm.push("x1111111111222222222233333333334444444444x"); + xpm.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + return xpm; +} + +function areaOfTriangle(p1, p2, p3){ + return Math.abs((p1[0] * (p2[1] - p3[1]) + p2[0] * (p3[1] - p1[1]) + p3[0] * (p1[1] - p2[1])) / 2.0); +} + +function ensureActorVisibleInScrollView(actor) { + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2; + + let parent = actor.get_parent(); + while (!(parent instanceof imports.gi.St.ScrollView)) { + if (!parent) + return; + + box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + parent = parent.get_parent(); + } + + let adjustment = parent.vscroll.adjustment; + let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values(); + + let offset = 0; + let vfade = parent.get_effect("fade"); + if (vfade) + offset = vfade.fade_margins.top; + + if (y1 < value + offset) + value = Math.max(0, y1 - offset); + else if (y2 > value + pageSize - offset) + value = Math.min(upper, y2 + offset - pageSize); + else + return; + adjustment.set_value(value); +} + +function getArraysEqual(a, b) { + if(a instanceof Array && b instanceof Array){ + if (a.length !== b.length) + return false; + for(let i = 0; i < a.length; i++) + if (!getArraysEqual(a[i], b[i])) + return false; + return true; + } + else + return a === b; +} + +function createTooltip(button, widget, titleLabel, description, displayType){ + let lbl = titleLabel.clutter_text; + lbl.get_allocation_box(); + let isEllipsized = lbl.get_layout().is_ellipsized(); + if(displayType !== Constants.DisplayType.BUTTON && (isEllipsized || description)){ + let titleText, descriptionText; + if(isEllipsized && description){ + titleText = titleLabel.text.replace(/\n/g, " "); + descriptionText = description; + } + else if(isEllipsized && !description) + titleText = titleLabel.text.replace(/\n/g, " "); + else if(!isEllipsized && description) + descriptionText = description; + widget.tooltip = new Me.imports.menuWidgets.Tooltip(button, widget.actor, titleText, descriptionText); + widget.tooltip._onHover(); + } + else if(displayType === Constants.DisplayType.BUTTON){ + let titleText = titleLabel.text.replace(/\n/g, " "); + widget.tooltip = new Me.imports.menuWidgets.Tooltip(button, widget.actor, titleText, null); + widget.tooltip.location = Constants.TooltipLocation.TOP_CENTERED; + widget.tooltip._onHover(); + } +} + +function getDashToPanelPosition(settings, index){ + var positions = null; + var side; + + try{ + positions = JSON.parse(settings.get_string('panel-positions')) + } catch(e){ + log('Error parsing Dash to Panel positions: ' + e.message); + } + + if(!positions) + side = settings.get_string('panel-position'); + else{ + side = positions[index]; + } + + if (side === 'TOP') + return imports.gi.St.Side.TOP; + else if (side === 'RIGHT') + return imports.gi.St.Side.RIGHT; + else if (side === 'BOTTOM') + return imports.gi.St.Side.BOTTOM; + else if (side === 'LEFT') + return imports.gi.St.Side.LEFT; + else + return imports.gi.St.Side.BOTTOM; +} + +function getStylesheet(){ + let stylesheet = Gio.File.new_for_path(GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + + if(!stylesheet.query_exists(null)){ + GLib.spawn_command_line_sync("mkdir " + GLib.get_home_dir() + "/.local/share/arcmenu"); + GLib.spawn_command_line_sync("touch " + GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + stylesheet = Gio.File.new_for_path(GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + } + + return stylesheet; +} + +function rgbStringToHex(colorString) { + let [r, g, b, a_] = parseRgbString(colorString) + return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); +} + +function clutterColorToRGBA(color) { + return `rgba(${color.red}, ${color.green}, ${color.blue}, ${color.alpha})`; +} + +function parseRgbString(colorString){ + if(colorString.includes('rgba')) + colorString = colorString.replace('rgba(',''); + if(colorString.includes('rgb')) + colorString = colorString.replace('rgb(',''); + colorString = colorString.replace(')',''); + let rgbaColor = colorString.split(","); + + let r = parseFloat(rgbaColor[0]); + let g = parseFloat(rgbaColor[1]); + let b = parseFloat(rgbaColor[2]); + let a; + if(rgbaColor[3] != undefined) + a = parseFloat(rgbaColor[3]); + else + a = 1; + return [r, g, b, a]; +} + +function modifyColorLuminance(colorString, luminanceFactor, overrideAlpha){ + let Clutter = imports.gi.Clutter; + let color = Clutter.color_from_string(colorString)[1]; + let [hue, lum, sat] = color.to_hls(); + let modifiedLum = lum; + + if(lum >= .85) //if lum is too light, force darken + modifiedLum = Math.min((1 - Math.abs(luminanceFactor)) * modifiedLum, 1); + else if(lum <= .15) //if lum is too dark, force lighten + modifiedLum = Math.max((1 - Math.abs(luminanceFactor)) * modifiedLum, 0); + else if(luminanceFactor >= 0) //otherwise, darken or lighten based on luminanceFactor + modifiedLum = Math.min((1 + luminanceFactor) * modifiedLum, 1); + else + modifiedLum = Math.max((1 + luminanceFactor) * modifiedLum, 0); + + let alpha = (color.alpha / 255).toPrecision(3); + if(overrideAlpha) + alpha = overrideAlpha; + + let modifiedColor = Clutter.color_from_hls(hue, modifiedLum, sat); + + return `rgba(${modifiedColor.red}, ${modifiedColor.green}, ${modifiedColor.blue}, ${alpha})` +} + +function createStylesheet(settings){ + let customarcMenu = settings.get_boolean('enable-custom-arc-menu'); + let separatorColor = settings.get_string('separator-color'); + let menuColor = settings.get_string('menu-color'); + let menuForegroundColor = settings.get_string('menu-foreground-color'); + let borderColor = settings.get_string('border-color'); + let highlightColor = settings.get_string('highlight-color'); + let highlightForegroundColor = settings.get_string('highlight-foreground-color'); + let fontSize = settings.get_int('menu-font-size'); + let borderSize = settings.get_int('menu-border-size'); + let cornerRadius = settings.get_int('menu-corner-radius'); + let menuMargin = settings.get_int('menu-margin'); + let menuArrowSize = settings.get_int('menu-arrow-size'); + let leftPanelWidth = settings.get_int('menu-width'); + let leftPanelWidthSmall = settings.get_int('menu-width') - 65; + let rightPanelWidth = settings.get_int('right-panel-width'); + let rightPanelWidthPlus45 = settings.get_int('right-panel-width') + 45; + let rightPanelWidthPlus70 = settings.get_int('right-panel-width') + 70; + let avatarStyle = settings.get_enum('avatar-style'); + let avatarRadius = avatarStyle == 0 ? 999 : 0; + let menuButtonColor = settings.get_string('menu-button-color'); + let menuButtonHoverColor = settings.get_string('menu-button-hover-color'); + let menuButtonActiveColor = settings.get_string('menu-button-active-color'); + let menuButtonHoverBackgroundcolor = settings.get_string('menu-button-hover-backgroundcolor'); + let menuButtonActiveBackgroundcolor = settings.get_string('menu-button-active-backgroundcolor'); + let gapAdjustment = settings.get_int('gap-adjustment'); + let indicatorColor = settings.get_string('indicator-color'); + let indicatorTextBackgroundColor = settings.get_string('indicator-text-color'); + let plasmaSelectedItemColor = settings.get_string('plasma-selected-color'); + let plasmaSelectedItemBackgroundColor = settings.get_string('plasma-selected-background-color'); + let plasmaSearchBarTop = settings.get_enum('searchbar-default-top-location'); + let menuButtonBorderRadius = settings.get_int('menu-button-border-radius'); + let tooltipStyle, separatorColorStyle = "\n", smallButtonHoverStyle = "\n"; + let plasmaButtonStyle = plasmaSearchBarTop === Constants.SearchbarLocation.TOP ? 'border-top-width: 2px;' : 'border-bottom-width: 2px;'; + if(customarcMenu){ + tooltipStyle = ".tooltip-menu-item{\nborder-radius: 8px;\nbox-shadow: 0 0 1px 0px " + separatorColor + ";\nfont-size:" + fontSize + "pt;\npadding: 3px 8px;\nmin-height: 0px;" + + "\ncolor:" + menuForegroundColor+ ";\nbackground-color:" + modifyColorLuminance(menuColor, 0.05, 1) + ";\nmax-width:550px;\n}\n\n"; + separatorColorStyle = ".separator-color-style{\nbackground-color: " + separatorColor + ";\n}\n\n"; + smallButtonHoverStyle = ".arc-menu .popup-menu-item .arcmenu-small-button.selected{\nbackground-color: " + modifyColorLuminance(highlightColor, -0.25) + "\n}\n\n"; + } + else + tooltipStyle = ".tooltip-menu-item{\nborder-radius: 8px;\npadding: 3px 8px;\nmax-width:550px;\nmin-height: 0px;\n}\n\n"; + + let menuButtonStyle = ''; + if(settings.get_boolean('override-menu-button-color')) + menuButtonStyle += ".arc-menu-icon, .arc-menu-text, .arc-menu-arrow{\ncolor: " + menuButtonColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-hover-background-color')) + menuButtonStyle += ".arc-menu-panel-menu:hover{\nbackground-color: " + menuButtonHoverBackgroundcolor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-hover-color')) + menuButtonStyle += ".arc-menu-panel-menu:hover .arc-menu-icon, .arc-menu-panel-menu:hover .arc-menu-text" + +", .arc-menu-panel-menu:hover .arc-menu-arrow{\ncolor: " + menuButtonHoverColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-active-color')) + menuButtonStyle += ".arc-menu-icon:active, .arc-menu-text:active, .arc-menu-arrow:active{\ncolor: " + menuButtonActiveColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-active-background-color')) + menuButtonStyle += ".arc-menu-panel-menu:active{\nbackground-color: " + menuButtonActiveBackgroundcolor + ";\n}\n\n"; + if(settings.get_boolean('menu-button-override-border-radius')){ + let border = menuButtonBorderRadius === 0 ? 1 : 3; + menuButtonStyle += ".arc-menu-panel-menu{\nborder-radius: " + menuButtonBorderRadius + "px;\nborder: " + border + "px solid transparent;\n}\n\n"; + } + + let iconGridStyle = "\ntext-align: center;\n border-radius: 8px;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\n"; + + let stylesheetCSS = "#arc-search{\nwidth: " + leftPanelWidth + "px;\n}\n\n" + +".arc-menu-status-text{\ncolor:" + menuForegroundColor + ";\nfont-size:" + fontSize + "pt;\n}\n\n" + +".search-statustext{\nfont-size:11pt;\n}\n\n" + + +"#ExtraLargeIconGrid{\nwidth: 150px;\n height: 150px;" + iconGridStyle + "}\n\n" + + +"#LargeIconGrid{\nwidth: 95px;\n height: 95px;" + iconGridStyle + "}\n\n" + + +"#MediumIconGrid{\nwidth: 87px;\n height: 87px;" + iconGridStyle + "}\n\n" + + +"#SmallIconGrid{\nwidth: 80px;\n height: 80px;" + iconGridStyle + "}\n\n" + + +"#LargeRectIconGrid{\nwidth: 95px;\n height: 85px;" + iconGridStyle + "}\n\n" + + +"#MediumRectIconGrid{\nwidth: 92px;\n height: 78px;" + iconGridStyle + "}\n\n" + + +"#SmallRectIconGrid{\nwidth: 85px;\n height: 70px;" + iconGridStyle + "}\n\n" + + +".left-panel{\nwidth:" + leftPanelWidth + "px;\n}\n\n" + +".left-panel-small{\nwidth:" + leftPanelWidthSmall + "px;\n}\n\n" + +".right-panel{\nwidth:" + rightPanelWidth + "px;\n}\n\n" + +".right-panel-plus45{\nwidth:" + rightPanelWidthPlus45 + "px;\n}\n\n" + +".right-panel-plus70{\nwidth:" + rightPanelWidthPlus70 + "px;\n}\n\n" + +".default-search-entry{\nmax-width: 17.667em;\n}\n\n" + +".arc-search-entry{\nmax-width: 17.667em;\nfont-size:" + fontSize + "pt;\nborder-color:" + separatorColor + ";\nborder-width: 1px;\n" + +"color:" + menuForegroundColor + ";\nbackground-color:" + modifyColorLuminance(menuColor, -0.1, 1) + ";\n}\n\n" + +".arc-search-entry:focus{\nborder-color:" + highlightColor + ";\nborder-width: 1px;\nbox-shadow: inset 0 0 0 1px " + modifyColorLuminance(highlightColor, 0.05) + ";\n}\n\n" + +".arc-search-entry StLabel.hint-text{\ncolor: " + modifyColorLuminance(menuForegroundColor, 0, 0.6) + ";\n}\n\n" + +"#ArcSearchEntry{\nmin-height: 0px;\nborder-radius: 8px;\nborder-width: 1px;\npadding: 7px 9px;\n}\n\n" + +"#ArcSearchEntryRound{\nmin-height: 0px;\nborder-radius: 18px;\nborder-width: 1px;\npadding: 7px 12px;\n}\n\n" + + menuButtonStyle + +".symbolic-icons{\n-st-icon-style: symbolic;\n}\n\n" + +".regular-icons{\n-st-icon-style: regular;\n}\n\n" + +".arcmenu-menu-item{\nborder-radius: 8px;\n}\n\n" + +".margin-box{\nmargin: 0px 4px;\n}\n\n" + +"#arc-menu-launcher-button{\nmax-width: 90px;\nborder-radius: 0px;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\nborder-color: transparent;\nborder-bottom-width: 3px;\n}\n\n" + +"#arc-menu-launcher-button.active-item, #arc-menu-launcher-button:active{\nbackground-color: " + plasmaSelectedItemBackgroundColor + ";\n" + +"\nborder-color: " + plasmaSelectedItemColor + ";\nborder-bottom-width: 3px;\n}\n\n" + + +"#arc-menu-plasma-button{\nwidth: 90px;\n height: 65px;\nborder-radius: 8px;\n text-align: center;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\n\n" + plasmaButtonStyle + ";\nborder-color: transparent;\n}\n\n" + +"#arc-menu-plasma-button:active-item, .arc-menu-plasma-button:active{\nbackground-color: " + plasmaSelectedItemBackgroundColor + ";\n" + + plasmaButtonStyle + "\nborder-color: " + plasmaSelectedItemColor + ";\n}\n\n" + + +"StScrollView .small-vfade{\n-st-vfade-offset: 44px;\n}\n\n" + + +".arc-menu-button{\n-st-icon-style: symbolic;\nborder-width: 1px;\nborder-radius: 8px;\npadding: 8px;\n}\n\n" + +".arcmenu-small-button{\n-st-icon-style: symbolic;\nborder-radius: 8px;\npadding: 3px 8px;\n}\n\n" + +smallButtonHoverStyle + + +".arc-menu-menu-item-indicator{\ncolor: " + indicatorColor + ";\n}\n\n" + +".arc-menu-menu-item-text-indicator{\nbackground-color: " + indicatorTextBackgroundColor + ";\n}\n\n" + + +tooltipStyle + + +".arc-menu{\n-boxpointer-gap: " + gapAdjustment + "px;\nmin-width: 15em;\ncolor: #D3DAE3;\nborder-image: none;\n" + +"box-shadow: none;\nfont-size:" + fontSize + "pt;\n}\n\n" + +".arc-menu .popup-sub-menu{\npadding-bottom: 1px;\nbackground-color: " + modifyColorLuminance(menuColor, 0.04) + ";\n}\n\n" + +".arc-menu .popup-menu-item{\nspacing: 6px; \nborder: none;\ncolor:" + menuForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:active{\nbackground-color:" + modifyColorLuminance(highlightColor, -0.15) + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item.selected{\nbackground-color:" + highlightColor + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:checked{\nbackground-color:" + highlightColor + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:insensitive{\ncolor:" + modifyColorLuminance(menuForegroundColor, 0, 0.6) + ";\n}\n\n" + +".arc-menu-boxpointer{ \n-arrow-border-radius:" + cornerRadius + "px;\n" + +"-arrow-background-color:" + menuColor + ";\n" + +"-arrow-border-color:" + borderColor + ";\n" + +"-arrow-border-width:" + borderSize + "px;\n" + +"-arrow-base:" + menuMargin + "px;\n" + +"-arrow-rise:" + menuArrowSize + "px;\n}\n\n" + +".arc-menu .popup-menu-content{\npadding: 16px 0px;\nmargin: 0;\nbackground-color: transparent;\nborder-radius: 0px;\nbox-shadow: 0;\n}\n\n" + + +".arcmenu-separator{\npadding: 0px;\nheight: 1px;\nmargin: 0px 20px;\n}\n\n" + + separatorColorStyle + +".menu-user-avatar{\nbackground-size: contain;\nborder-radius: " + avatarRadius + "px;\n}\n\n"; + + let stylesheet = getStylesheet(); + if(stylesheet){ + try{ + stylesheet.replace_contents(stylesheetCSS, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null); + } + catch(e){ + global.log("ArcMenu Error - Failed to update stylesheet. " + e.message); + } + } + else + global.log("ArcMenu Error - Failed to find stylesheet."); +} diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/appfolders.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/appfolders.js new file mode 100644 index 0000000..9548559 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/appfolders.js @@ -0,0 +1,225 @@ +'use strict'; + +const { Shell, GLib, Clutter } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +const transparent = Clutter.Color.from_pixel(0x00000000); +const FOLDER_DIALOG_ANIMATION_TIME = 200; +const FRAME_UPDATE_PERIOD = 16; + +let original_zoomAndFadeIn = null; +let original_zoomAndFadeOut = null; +let sigma = 30; +let brightness = 0.6; + +let _zoomAndFadeIn = function () { + let [sourceX, sourceY] = + this._source.get_transformed_position(); + let [dialogX, dialogY] = + this.child.get_transformed_position(); + + this.child.set({ + translation_x: sourceX - dialogX, + translation_y: sourceY - dialogY, + scale_x: this._source.width / this.child.width, + scale_y: this._source.height / this.child.height, + opacity: 0, + }); + + this.set_background_color(transparent); + + let effect = this.get_effect("appfolder-blur"); + + effect.sigma = 0; + Utils.ease_property(effect, 'sigma', 0, sigma, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + effect.brightness = 1.0; + Utils.ease_property(effect, 'brightness', 1.0, brightness, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + this.child.ease({ + translation_x: 0, + translation_y: 0, + scale_x: 1, + scale_y: 1, + opacity: 255, + duration: FOLDER_DIALOG_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + }); + + this._needsZoomAndFade = false; + + if (this._sourceMappedId === 0) { + this._sourceMappedId = this._source.connect( + 'notify::mapped', this._zoomAndFadeOut.bind(this)); + } +} + +let _zoomAndFadeOut = function () { + if (!this._isOpen) + return; + + if (!this._source.mapped) { + this.hide(); + return; + } + + let [sourceX, sourceY] = + this._source.get_transformed_position(); + let [dialogX, dialogY] = + this.child.get_transformed_position(); + + this.set_background_color(transparent); + + let effect = this.get_effect("appfolder-blur"); + + Utils.ease_property(effect, 'sigma', effect.sigma, 0, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + Utils.ease_property(effect, 'brightness', effect.brightness, 1.0, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + this.child.ease({ + translation_x: sourceX - dialogX, + translation_y: sourceY - dialogY, + scale_x: this._source.width / this.child.width, + scale_y: this._source.height / this.child.height, + opacity: 0, + duration: FOLDER_DIALOG_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => { + this.child.set({ + translation_x: 0, + translation_y: 0, + scale_x: 1, + scale_y: 1, + opacity: 255, + }); + this.hide(); + + this._popdownCallbacks.forEach(func => func()); + this._popdownCallbacks = []; + }, + }); + + this._needsZoomAndFade = false; +} + + +var AppFoldersBlur = class AppFoldersBlur { + constructor(connections, prefs) { + this.connections = connections; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.prefs = prefs; + } + + enable() { + this._log("blurring appfolders"); + + if (Main.overview._overview.controls._appDisplay._folderIcons.length > 0) { + this.blur_appfolders(); + } + this.connections.connect(Main.overview._overview.controls._appDisplay, 'view-loaded', () => { + this.blur_appfolders(); + }) + } + + blur_appfolders() { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + icon._ensureFolderDialog(); + + if (original_zoomAndFadeIn == null) { + original_zoomAndFadeIn = icon._dialog._zoomAndFadeIn; + } + if (original_zoomAndFadeOut == null) { + original_zoomAndFadeOut = icon._dialog._zoomAndFadeOut; + } + + let effect = new Shell.BlurEffect({ + name: "appfolder-blur", + sigma: sigma, + brightness: brightness, + mode: 1 + }); + icon._dialog.remove_effect_by_name("appfolder-blur"); + icon._dialog.add_effect(effect); + + // HACK + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("appfolders hack level 1"); + this.paint_signals.disconnect_all(); + + Utils.setTimeout(() => { + this.paint_signals.connect(Main.overview._overview, effect); + this.paint_signals.connect(icon._dialog, effect); + }, 100); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("appfolders hack level 2"); + this.paint_signals.disconnect_all(); + + Utils.setTimeout(() => { + this.paint_signals.connect(Main.overview._overview, effect); + this.paint_signals.connect(icon._dialog, effect); + }, 100); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + + icon._dialog._viewBox.set_style_class_name('app-folder-dialog transparent-app-folder-dialogs-' + 100 * this.prefs.APPFOLDER_DIALOG_OPACITY.get()); + + icon._dialog._zoomAndFadeIn = _zoomAndFadeIn; + icon._dialog._zoomAndFadeOut = _zoomAndFadeOut; + }); + } + + set_sigma(s) { + sigma = s; + if (this.prefs.BLUR_APPFOLDERS.get()) + this.blur_appfolders(); + } + + set_brightness(b) { + brightness = b; + if (this.prefs.BLUR_APPFOLDERS.get()) + this.blur_appfolders(); + } + + disable() { + this._log("removing blur from appfolders"); + + if (original_zoomAndFadeIn != null) { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) + icon._dialog._zoomAndFadeIn = original_zoomAndFadeIn; + }); + } + if (original_zoomAndFadeOut != null) { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) + icon._dialog._zoomAndFadeOut = original_zoomAndFadeOut; + }); + } + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) { + icon._dialog.remove_effect_by_name("appfolder-blur") + icon._dialog._viewBox.remove_style_class_name('transparent-app-folder-dialogs-' + 100 * this.prefs.APPFOLDER_DIALOG_OPACITY.get()); + } + }); + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/applications.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/applications.js new file mode 100644 index 0000000..e044464 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/applications.js @@ -0,0 +1,274 @@ +'use strict'; + +const { Shell, Clutter, Meta, GLib } = imports.gi; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; +const BlurMode = Shell.BlurMode; + +var ApplicationsBlur = class ApplicationsBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + + this.windowMap = new Map(); + this.blurActorMap = new Map(); + } + + enable() { + this._log("blurring applications..."); + + // iterate through existing windows and add blur as needed + for (let workspace = 0; workspace < global.workspace_manager.get_n_workspaces(); ++workspace) { + let metaWorkspace = global.workspace_manager.get_workspace_by_index(workspace); + let windows = metaWorkspace.list_windows(); + windows.forEach((meta_window) => { + let window_actor = meta_window.get_compositor_private(); + this.track_new(window_actor, meta_window); + }) + } + + // blur every new window + this.connections.connect(global.display, 'window-created', (meta_display, meta_window) => { + this._log("window created"); + if (meta_window) { + let window_actor = meta_window.get_compositor_private(); + this.track_new(window_actor, meta_window); + } + }); + + // workaround for blur being in front of target windows + this.connections.connect(global.display, 'notify::focus-window', () => { + if (this.blurActorMap.size > 0) { + let callbackId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this.blurActorMap.forEach((blurActor, pid) => { + let actor = this.windowMap.get(pid).get_compositor_private(); + if (actor !== null && actor.get_parent() === blurActor.get_parent()) { + global.window_group.set_child_below_sibling(blurActor, actor); + } + }) + }) + } + }) + } + + // Blurs and add the needed signals to every new tracked window + track_new(window_actor, meta_window) { + // TODO change the pid to a more unique one, to prevent collisions? + let pid = Date.now(); + + window_actor['blur_provider_pid'] = pid; + meta_window['blur_provider_pid'] = pid; + + // remove the blur when the window is destroyed + this.connections.connect(window_actor, 'destroy', (window_actor) => { + let pid = window_actor.blur_provider_pid; + if (this.blurActorMap.has(pid)) { + this.remove_blur(pid) + } + }); + + // update the blur when the mutter-hint is changed + this.connections.connect(meta_window, 'notify::mutter-hints', (meta_window) => { + this._log("mutter-hint changed"); + let pid = meta_window.blur_provider_pid; + let window_actor = meta_window.get_compositor_private(); + this.update_blur(window_actor, meta_window, pid) + }); + + this.update_blur(window_actor, meta_window, pid); + } + + // This method is basically a catch-all for blurring windows. It handles the decisions + // to call different methods that handle removing, setting, and updating blur + update_blur(window_actor, meta_window, pid) { + let mutter_hint = meta_window.get_mutter_hints(); + + // check if the window wants blur and update it accordingly + if (mutter_hint != null && mutter_hint.includes("blur-provider")) { + // get blur effect parameters + let sigma = this.parse_sigma_value(mutter_hint); + let brightness = this.prefs.BRIGHTNESS.get(); + + // if the provided sigma value is incorrect + if (sigma == null || sigma < 0 || sigma > 111) { + this._log("sigma value is null or outside of range (0-111), defaulting to extension setting") + sigma = this.prefs.SIGMA.get(); + } + + // check wether the actor is already blurred and act consequently + if (this.blurActorMap.has(pid)) { + if (sigma == 0) { + // actor already blurred, should not be anymore + this.remove_blur(pid); + } else { + // actor already blurred, update it + this.update_blur_effect( + this.blurActorMap.get(pid), + sigma, + brightness + ); + } + } else if (sigma != 0) { + // actor not blurred, blur it + this.set_blur( + pid, + window_actor, + meta_window, + this.create_blur_effect(sigma, brightness) + ) + } + } else if (this.blurActorMap.has(pid)) { + // remove blur if the mutter_hint no longer contains our blur-provider value + this.remove_blur(pid); + } + } + + // Returns a new blur effect + create_blur_effect(sigma, brightness) { + return new Shell.BlurEffect({ + sigma: sigma, + brightness: brightness, + mode: BlurMode.BACKGROUND + }); + } + + // Add the blur effect to the actor + set_blur(pid, window_actor, meta_window, blurEffect) { + let blurActor = this.create_blur_actor(meta_window, window_actor, blurEffect); + + // if hacks are selected, force the repaint the window to prevent artifacts + if (this.prefs.HACKS_LEVEL.get() >= 1) { + this._log("applications hack level 1 or 2"); + this.paint_signals.disconnect_all(); + this.paint_signals.connect(blurActor, blurEffect); + } else { + this.paint_signals.disconnect_all(); + } + + global.window_group.insert_child_below(blurActor, window_actor); + + // registed the blur actor/effect + blurActor['blur_provider_pid'] = pid; + this.blurActorMap.set(pid, blurActor); + this.windowMap.set(pid, meta_window); + + // hide if window become invisible + this.connections.connect(window_actor, 'notify::visible', (window_actor) => { + let pid = window_actor.blur_provider_pid; + if (window_actor.visible) { + this.blurActorMap.get(pid).show(); + } else { + this.blurActorMap.get(pid).hide(); + } + }); + } + + // Returns a new already blurred widget, configured to follow the size and + // position of its target window + create_blur_actor(meta_window, window_actor, blurEffect) { + // create the constraints in size and position to its target window + let frame = meta_window.get_frame_rect(); + let buffer = meta_window.get_buffer_rect(); + + const offsetX = frame.x - buffer.x; + const offsetY = frame.y - buffer.y; + const offsetWidth = buffer.width - frame.width; + const offsetHeight = buffer.height - frame.height; + + let constraintPosX = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.X, + offset: offsetX + }); + let constraintPosY = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.Y, + offset: offsetY + }); + + let constraintSizeX = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.WIDTH, + offset: -offsetWidth + }); + let constraintSizeY = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.HEIGHT, + offset: -offsetHeight + }); + + // create the actor and add the constraints + let blurActor = new Clutter.Actor(); + blurActor.add_constraint(constraintPosX); + blurActor.add_constraint(constraintPosY); + blurActor.add_constraint(constraintSizeX); + blurActor.add_constraint(constraintSizeY); + + // add the effect + blurActor.add_effect_with_name('blur-effect', blurEffect); + + return blurActor; + } + + // Updates the blur effect by overwriting its sigma and brightness values + update_blur_effect(blur_actor, sigma, brightness) { + let effect = blur_actor.get_effect('blur-effect'); + effect.sigma = sigma; + effect.brightness = brightness; + } + + // Removes the blur actor from the shell and unregister it + remove_blur(pid) { + // global.window_group is null when restarting the shell, causing an innocent crash crash + if (global.window_group == null) + return + + global.window_group.remove_actor(this.blurActorMap.get(pid)); + this.blurActorMap.delete(pid); + this.windowMap.delete(pid); + } + + // When given the xprop property, returns either a valid sigma value between 0 and 111 + // or null if the parsing is incorrect + parse_sigma_value(property) { + let result = property.match("(blur-provider=)(\\d{1,3})") + if (result == null) { + return null; + } else { + return result[2]; + } + } + + disable() { + this._log("removing blur from applications..."); + + this.blurActorMap.forEach(((value, key) => { + this.remove_blur(key) + })); + this.connections.disconnect_all(); + this.paint_signals.disconnect_all(); + } + + // Updates each blur effect to use new sigma value + set_sigma(s) { + this.blurActorMap.forEach((actor, _) => { + actor.get_effect('blur-effect').set_sigma(s) + }) + } + + // Updates each blur effect to use new brightness value + set_brightness(b) { + this.blurActorMap.forEach((actor, _) => { + actor.get_effect('blur-effect').set_brightness(b) + }) + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/connections.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/connections.js new file mode 100644 index 0000000..3517a27 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/connections.js @@ -0,0 +1,81 @@ +'use strict'; + +const GObject = imports.gi.GObject; + + +var Connections = class Connections { + constructor() { + this.buffer = []; + } + + process_connection(actor, id) { + let infos = { + actor: actor, + id: id + }; + + if (actor.connect && (!(actor instanceof GObject.Object) || GObject.signal_lookup('destroy', actor))) { + let destroy_id = actor.connect('destroy', () => { + actor.disconnect(id); + actor.disconnect(destroy_id); + + let index = this.buffer.indexOf(infos); + if (index >= 0) { + this.buffer.splice(index, 1) + } + }) + } + + this.buffer.push(infos) + } + + connect(actor, signal, handler) { + let id = actor.connect(signal, handler); + this.process_connection(actor, id); + } + + connect_after(actor, signal, handler) { + let id = actor.connect_after(signal, handler); + + this.process_connection(actor, id); + } + + disconnect_all_for(actor) { + let actor_connections = [] + + this.buffer.forEach((infos) => { + if (infos.actor == actor) { + actor_connections.push(infos) + } + }); + + actor_connections.forEach((connection) => { + // disconnect + try { + connection.actor.disconnect(connection.id) + } catch (e) { + this._log(`error removing connection: ${e}; continuing`) + } + + // remove from buffer + let index = this.buffer.indexOf(connection); + this.buffer.splice(index, 1); + }) + } + + disconnect_all() { + this.buffer.forEach((connection) => { + try { + connection.actor.disconnect(connection.id) + } catch (e) { + this._log(`error removing connection: ${e}; continuing`) + } + }) + this.buffer = []; + } + + // no need to check if DEBUG here, the log function is only used on error + _log(str) { + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash.js new file mode 100644 index 0000000..650bf69 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash.js @@ -0,0 +1,51 @@ +'use strict'; + +const { St, Shell, Meta } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; + + +var DashBlur = class DashBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + } + + enable() { + this._log("blurring dash"); + this.update(); + } + + update() { + if (Main.overview.dash.constructor.name == "Dash") { + Main.overview.dash.get_child_at_index(0).style = "background-color:rgba(0,0,0," + this.prefs.DASH_OPACITY.get() + ")"; + } + + // set search entry the same opacity as the dash + Main.overview._overview._controls._searchEntry.style = "background-color:rgba(0,0,0," + this.prefs.DASH_OPACITY.get() + ")"; + } + + disable() { + this._log("removing blur from dash"); + + if (Main.overview.dash.constructor.name == "Dash") { + if (Main.screenShield && !Main.screenShield.locked) { + try { + Main.overview.dash.get_child_at_index(0).style = null; + } catch (e) { + this._log(e); + } + } + } + Main.overview._overview._controls._searchEntry.style = null; + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`); + } +}; \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js new file mode 100644 index 0000000..166f147 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js @@ -0,0 +1,235 @@ +'use strict'; + +const { St, Shell, GLib } = imports.gi; +const Main = imports.ui.main; +const Signals = imports.signals; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +// This type of object is created for every dash found, and talks to the main DashBlur thanks +// to signals. This allows to dynamically track the created dashes for each screen. +class DashInfos { + constructor(dash_blur, dash, dash_box, background_parent, effect, prefs) { + // the parent DashBlur object, to communicate + this.dash_blur = dash_blur; + // the blurred dash + this.dash = dash; + // the actually blurred box + this.dash_box = dash_box; + this.background_parent = background_parent; + this.effect = effect; + this.prefs = prefs; + + dash_blur.connections.connect(dash_blur, 'remove-dashes', () => { + this._log("removing blur from dash"); + this.dash.get_parent().remove_child(this.background_parent); + this.dash.remove_style_class_name('blurred-dash'); + }); + + dash_blur.connections.connect(dash_blur, 'update-sigma', () => { + this.effect.sigma = this.dash_blur.sigma; + }); + + dash_blur.connections.connect(dash_blur, 'update-brightness', () => { + this.effect.brightness = this.dash_blur.brightness; + }); + + dash_blur.connections.connect(dash_blur, 'show', () => { + this.effect.sigma = this.dash_blur.sigma; + }); + + dash_blur.connections.connect(dash_blur, 'hide', () => { + this.effect.sigma = 0; + }); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + +var DashBlur = class DashBlur { + constructor(connections, prefs) { + this.dashes = []; + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.sigma = prefs.SIGMA.get(); + this.brightness = prefs.BRIGHTNESS.get(); + } + + enable() { + this.connections.connect(Main.uiGroup, 'actor-added', (_, actor) => { + if ((actor.get_name() == "dashtodockContainer") && (actor.constructor.name == 'DashToDock')) + this.try_blur(actor); + }); + + this.blur_existing_dashes(); + } + + // Finds all existing dashes on every monitor, and call `try_blur` on them + // We cannot only blur `Main.overview.dash`, as there could be multiple screens + blur_existing_dashes() { + this._log("searching for dash"); + // blur every dash found + Main.uiGroup.get_children().filter((child) => { + // filter by name + return (child.get_name() == "dashtodockContainer") && (child.constructor.name == 'DashToDock') + }).forEach(this.try_blur.bind(this)); + } + + // Tries to blur the dash contained in the given actor + try_blur(dash_container) { + let dash_box = dash_container._slider.get_child(); + // verify that we did not already blur that dash + if (!dash_box.get_children().some((c) => { + return c.get_name() == "dash-blurred-background-parent" + })) { + // finally blur the dash + this._log("dash to dock found, blurring it"); + let dash = dash_box.get_children().find(c => { return c.get_name() == 'dash' }) + this.dashes.push(this.blur_dash_from(dash, dash_container)); + } + } + + // Blurs the dash and returns a `DashInfos` containing its informations + blur_dash_from(dash, dash_container) { + // the effect to be applied + let effect = new Shell.BlurEffect({ + brightness: this.brightness, + sigma: this.sigma, + mode: 1 + }); + + // dash background parent, not visible + let background_parent = new St.Widget({ + name: 'dash-blurred-background-parent', + style_class: 'dash-blurred-background-parent', + width: 0, + height: 0 + }); + + // dash background widget + let background = new St.Widget({ + name: 'dash-blurred-background', + style_class: 'dash-blurred-background', + x: 0, + y: dash_container._slider.y, + width: dash.width, + height: dash.height, + }); + + // updates size and position on change + this.connections.connect(dash_container._slider, 'notify::y', _ => { + background.y = dash_container._slider.y; + }); + this.connections.connect(dash, 'notify::width', _ => { + background.width = dash.width; + }); + this.connections.connect(dash, 'notify::height', _ => { + background.height = dash.height; + }); + + + // HACK + { + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the dash buttons to cause artefacts on the dash itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("dash hack level 1"); + this.paint_signals.disconnect_all(); + + let rp = () => { + effect.queue_repaint() + }; + + dash._box.get_children().forEach((icon) => { + try { + let zone = icon.get_child_at_index(0); + this.connections.connect(zone, 'enter-event', rp); + this.connections.connect(zone, 'leave-event', rp); + this.connections.connect(zone, 'button-press-event', rp); + } catch (e) { + this._log(`${e}, continuing`); + } + }) + + this.connections.connect(dash._box, 'actor-added', (_, actor) => { + try { + let zone = actor.get_child_at_index(0); + this.connections.connect(zone, 'enter-event', rp); + this.connections.connect(zone, 'leave-event', rp); + this.connections.connect(zone, 'button-press-event', rp); + } catch (e) { + this._log(`${e}, continuing`); + } + }) + + this.connections.connect(dash._showAppsIcon, 'enter-event', rp); + this.connections.connect(dash._showAppsIcon, 'leave-event', rp); + this.connections.connect(dash._showAppsIcon, 'button-press-event', rp); + + this.connections.connect(dash, 'leave-event', rp); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("dash hack level 2"); + + this.paint_signals.connect(background, effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + } + + // add the widget to the dash + background.add_effect(effect); + background_parent.add_child(background); + dash.get_parent().insert_child_at_index(background_parent, 0); + + // remove background color + dash.set_style_class_name('blurred-dash'); + + // returns infos + return new DashInfos(this, dash, dash._background, background_parent, effect, this.prefs); + } + + set_sigma(sigma) { + this.sigma = sigma; + this.emit('update-sigma', true); + } + + set_brightness(brightness) { + this.brightness = brightness; + this.emit('update-brightness', true); + } + + disable() { + this._log("removing blur from dashes"); + + this.emit('remove-dashes', true); + + this.dashes = []; + this.connections.disconnect_all(); + } + + show() { + this.emit('show', true); + } + hide() { + this.emit('hide', true); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + +Signals.addSignalMethods(DashBlur.prototype); \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/extension.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/extension.js new file mode 100644 index 0000000..4d5c4c9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/extension.js @@ -0,0 +1,224 @@ +'use strict'; + +const { St, Shell } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const Settings = Me.imports.settings; +const Connections = Me.imports.connections; + +const Panel = Me.imports.panel; +const Dash = Me.imports.dash; +const Overview = Me.imports.overview; +const DashToDock = Me.imports.dash_to_dock; +const Lockscreen = Me.imports.lockscreen; +const AppFolders = Me.imports.appfolders; +const WindowList = Me.imports.window_list; +const Applications = Me.imports.applications; + + +class Extension { + constructor() { } + + enable() { + this._prefs = new Settings.Prefs; + + this._log("enabling extension..."); + this._connections = []; + + this._panel_blur = new Panel.PanelBlur(new Connections.Connections, this._prefs); + this._dash_blur = new Dash.DashBlur(new Connections.Connections, this._prefs); + this._dash_to_dock_blur = new DashToDock.DashBlur(new Connections.Connections, this._prefs); + this._overview_blur = new Overview.OverviewBlur(new Connections.Connections, this._prefs); + this._lockscreen_blur = new Lockscreen.LockscreenBlur(new Connections.Connections, this._prefs); + this._appfolders_blur = new AppFolders.AppFoldersBlur(new Connections.Connections, this._prefs); + this._window_list_blur = new WindowList.WindowListBlur(new Connections.Connections, this._prefs); + this._applications_blur = new Applications.ApplicationsBlur(new Connections.Connections, this._prefs); + + + this._connections.push(this._panel_blur.connections, this._dash_blur.connections, + this._dash_to_dock_blur.connections, this._overview_blur.connections, + this._lockscreen_blur.connections, this._appfolders_blur.connections, + this._window_list_blur.connections, this._applications_blur.connections); + + this._connect_to_settings(); + + if (this._prefs.BLUR_PANEL.get()) { + this._panel_blur.enable(); + } + if (this._prefs.BLUR_DASH.get()) { + this._dash_blur.enable(); + this._dash_to_dock_blur.enable(); + } + if (this._prefs.BLUR_OVERVIEW.get()) { + this._overview_blur.enable(); + } + if (this._prefs.BLUR_LOCKSCREEN.get()) { + this._lockscreen_blur.enable(); + } + if (this._prefs.BLUR_APPFOLDERS.get()) { + this._appfolders_blur.enable(); + } + if (this._prefs.BLUR_WINDOW_LIST.get()) { + this._window_list_blur.enable(); + } + if (this._prefs.BLUR_APPLICATIONS.get()) { + this._applications_blur.enable(); + } + + this._update_sigma(); + this._update_brightness(); + + this._log("extension enabled."); + } + + disable() { + this._log("disabling extension..."); + + this._panel_blur.disable(); + this._dash_blur.disable(); + this._dash_to_dock_blur.disable(); + this._overview_blur.disable(); + this._lockscreen_blur.disable(); + this._appfolders_blur.disable(); + this._window_list_blur.disable(); + this._applications_blur.disable(); + + this._panel_blur = null; + this._dash_blur = null; + this._dash_to_dock_blur = null; + this._overview_blur = null; + this._lockscreen_blur = null; + this._appfolders_blur = null; + this._window_list_blur = null; + this._applications_blur = null; + + this._disconnect_settings(); + + // in theory, this shouldn't be needed if we switch to making modules responsible for disconnecting their own + // signals. For now, I will leave this small bit of code in. Calling disable on all modules has already + // done the same thing + this._connections.forEach((connections) => { + connections.disconnect_all(); + }) + this._connections = []; + + this._log("extension disabled."); + + this._prefs = null; + } + + _connect_to_settings() { + this._prefs.SIGMA.changed(() => { + this._update_sigma(); + }); + this._prefs.BRIGHTNESS.changed(() => { + this._update_brightness(); + }); + + this._prefs.BLUR_DASH.changed(() => { + if (this._prefs.BLUR_DASH.get()) { + this._dash_blur.enable(); + this._dash_to_dock_blur.enable(); + } else { + this._dash_blur.disable(); + this._dash_to_dock_blur.disable(); + } + }); + this._prefs.BLUR_PANEL.changed(() => { + if (this._prefs.BLUR_PANEL.get()) { + this._panel_blur.enable(); + } else { + this._panel_blur.disable(); + } + }); + this._prefs.BLUR_OVERVIEW.changed(() => { + if (this._prefs.BLUR_OVERVIEW.get()) { + this._overview_blur.enable(); + } else { + this._overview_blur.disable(); + } + }); + this._prefs.BLUR_LOCKSCREEN.changed(() => { + if (this._prefs.BLUR_LOCKSCREEN.get()) { + this._lockscreen_blur.enable(); + } else { + this._lockscreen_blur.disable(); + } + }); + this._prefs.BLUR_APPFOLDERS.changed(() => { + if (this._prefs.BLUR_APPFOLDERS.get()) { + this._appfolders_blur.enable(); + } else { + this._appfolders_blur.disable(); + } + }); + this._prefs.BLUR_WINDOW_LIST.changed(() => { + if (this._prefs.BLUR_WINDOW_LIST.get()) { + this._window_list_blur.enable(); + } else { + this._window_list_blur.disable(); + } + }); + this._prefs.BLUR_APPLICATIONS.changed(() => { + if (this._prefs.BLUR_APPLICATIONS.get()) { + this._applications_blur.enable(); + } else { + this._applications_blur.disable(); + } + }) + this._prefs.DASH_OPACITY.changed(() => { + this._dash_blur.update(); + }); + this._prefs.APPFOLDER_DIALOG_OPACITY.changed(() => { + this._appfolders_blur.blur_appfolders(); + }); + this._prefs.STATIC_BLUR.changed(() => { + this._panel_blur.change_blur_type(); + }); + this._prefs.HIDETOPBAR.changed(() => { + this._panel_blur.connect_to_overview(); + }); + } + + _disconnect_settings() { + this._prefs.SIGMA.disconnect(); + this._prefs.BRIGHTNESS.disconnect(); + } + + _update_sigma() { + let sigma = this._prefs.SIGMA.get(); + + this._panel_blur.set_sigma(sigma); + this._dash_to_dock_blur.set_sigma(sigma); + this._overview_blur.set_sigma(sigma); + this._lockscreen_blur.set_sigma(sigma); + this._appfolders_blur.set_sigma(sigma); + this._window_list_blur.set_sigma(sigma); + this._applications_blur.set_sigma(sigma); + } + + _update_brightness() { + let brightness = this._prefs.BRIGHTNESS.get(); + + this._panel_blur.set_brightness(brightness); + this._dash_to_dock_blur.set_brightness(brightness); + this._overview_blur.set_brightness(brightness); + this._lockscreen_blur.set_brightness(brightness); + this._appfolders_blur.set_brightness(brightness); + this._window_list_blur.set_brightness(brightness); + this._applications_blur.set_brightness(brightness); + } + + _log(str) { + if (this._prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + + +// Called on gnome-shell loading, even if extension is deactivated +function init() { + return new Extension(); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/lockscreen.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/lockscreen.js new file mode 100644 index 0000000..e6d39b5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/lockscreen.js @@ -0,0 +1,64 @@ +'use strict'; + +const { St, Shell } = imports.gi; +const Main = imports.ui.main; +const Background = imports.ui.background; + +let sigma = 30; +let brightness = 0.6; + +const original_createBackground = imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects; + + +var LockscreenBlur = class LockscreenBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + } + + enable() { + this._log("blurring lockscreen"); + + this.update_lockscreen(); + } + + update_lockscreen() { + imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects = this._createBackground; + } + + _createBackground() { + for (const widget of this._backgroundGroup) { + const effect = widget.get_effect('blur'); + + if (effect) { + effect.set({ + brightness: brightness, + sigma: sigma, + }); + } + } + } + + set_sigma(s) { + sigma = s; + this.update_lockscreen(); + } + + set_brightness(b) { + brightness = b; + this.update_lockscreen(); + } + + disable() { + this._log("removing blur from lockscreen"); + + imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects = original_createBackground; + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/metadata.json b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/metadata.json new file mode 100644 index 0000000..820fa02 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/metadata.json @@ -0,0 +1,12 @@ +{ + "_generated": "Generated by SweetTooth, do not edit", + "description": "Adds a blur look to different parts of the GNOME Shell, including the top panel, dash and overview.\n\nYou can support my work by sponsoring me on:\n- github: https://github.com/sponsors/aunetx\n- ko-fi: https://ko-fi.com/aunetx\n\nNote: if the extension shows an error after updating, please make sure to restart your session to see if it persists. This is due to a bug in gnome shell, which I can't fix by myself.", + "name": "Blur my Shell", + "shell-version": [ + "40", + "41" + ], + "url": "https://github.com/aunetx/gnome-shell-extension-blur-my-shell", + "uuid": "blur-my-shell@aunetx", + "version": 29 +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/overview.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/overview.js new file mode 100644 index 0000000..ffd86f9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/overview.js @@ -0,0 +1,161 @@ +'use strict'; + +const { Shell, Gio, Meta } = imports.gi; +const Main = imports.ui.main; +const WorkspaceAnimationController = imports.ui.workspaceAnimation.WorkspaceAnimationController; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; + + +var OverviewBlur = class OverviewBlur { + constructor(connections, prefs) { + this.connections = connections; + this.effects = []; + this.prefs = prefs; + this._workspace_switch_bg_actors = []; + } + + enable() { + this._log("blurring overview"); + + // connect to every background change (even without changing image) + this.connections.connect(Main.layoutManager._backgroundGroup, 'notify', () => { + this._log("updated background"); + this.update_backgrounds(); + }); + + // connect to monitors change + this.connections.connect(Main.layoutManager, 'monitors-changed', () => { + if (Main.screenShield && !Main.screenShield.locked) { + this._log("changed monitors"); + this.update_backgrounds(); + } + }); + + // add css class names, to change folders and workspace-switch background + Main.uiGroup.add_style_class_name("blurred-overview"); + + // update background on extension activation + // the try/catch behaviour is used to prevent bugs like #136 and #137 + try { + this.update_backgrounds(); + } catch (error) { this._log(`could not blur overview: ${error}`); } + + // store original methods for restoring them on disable() + this._origPrepareSwitch = WorkspaceAnimationController.prototype._prepareWorkspaceSwitch; + this._origFinishSwitch = WorkspaceAnimationController.prototype._finishWorkspaceSwitch; + + const outerThis = this; + + // create blurred background actors for each monitor during a workspace switch + WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = function (...params) { + outerThis._log("prepare workspace switch"); + outerThis._origPrepareSwitch.apply(this, params); + + Main.layoutManager.monitors.forEach(monitor => { + if (!(Meta.prefs_get_workspaces_only_on_primary() && (monitor != Main.layoutManager.primaryMonitor))) { + const bg_actor = outerThis.create_background_actor(monitor); + Main.uiGroup.insert_child_above(bg_actor, global.window_group); + + // store the actors so that we can delete them later + outerThis._workspace_switch_bg_actors.push(bg_actor); + } + }); + }; + + // remove the workspace-switch actors when the switch is done + WorkspaceAnimationController.prototype._finishWorkspaceSwitch = function (...params) { + outerThis._log("finish workspace switch"); + outerThis._origFinishSwitch.apply(this, params); + + outerThis._workspace_switch_bg_actors.forEach(actor => { + actor.destroy(); + }); + outerThis._workspace_switch_bg_actors = []; + }; + } + + update_backgrounds() { + // remove every old background + Main.layoutManager.overviewGroup.get_children().forEach(actor => { + if (actor.constructor.name == 'Meta_BackgroundActor') { + Main.layoutManager.overviewGroup.remove_child(actor); + actor.destroy(); + } + }); + this.effects = []; + + // add new backgrounds + Main.layoutManager.monitors.forEach(monitor => { + const bg_actor = this.create_background_actor(monitor); + Main.layoutManager.overviewGroup.insert_child_at_index(bg_actor, monitor.index); + }); + } + + create_background_actor(monitor) { + let bg_actor = new Meta.BackgroundActor; + + let background = Main.layoutManager._backgroundGroup.get_child_at_index(Main.layoutManager.monitors.length - monitor.index - 1); + + if (!background) { + this._log("could not get background for overview"); + return bg_actor; + } + + bg_actor.set_content(background.get_content()); + + let effect = new Shell.BlurEffect({ + brightness: this.prefs.BRIGHTNESS.get(), + sigma: this.prefs.SIGMA.get(), + mode: 0 + }); + bg_actor.add_effect(effect); + this.effects.push(effect); + + bg_actor.set_x(monitor.x); + bg_actor.set_y(monitor.y); + + return bg_actor; + } + + set_sigma(s) { + this.effects.forEach(effect => { + effect.sigma = s; + }); + } + + set_brightness(b) { + this.effects.forEach(effect => { + effect.brightness = b; + }); + } + + disable() { + this._log("removing blur from overview"); + Main.layoutManager.overviewGroup.get_children().forEach(actor => { + if (actor.constructor.name == 'Meta_BackgroundActor') { + Main.layoutManager.overviewGroup.remove_child(actor); + } + }); + Main.uiGroup.remove_style_class_name("blurred-overview"); + + this.effects = []; + this.connections.disconnect_all(); + + // restore original behavior + if (this._origPrepareSwitch) { + WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = this._origPrepareSwitch; + } + + if (this._origFinishSwitch) { + WorkspaceAnimationController.prototype._finishWorkspaceSwitch = this._origFinishSwitch; + } + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`); + } +}; diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/paint_signals.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/paint_signals.js new file mode 100644 index 0000000..0c3dc4f --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/paint_signals.js @@ -0,0 +1,59 @@ +'use strict' + +const { GObject, Clutter } = imports.gi; + + +var PaintSignals = class PaintSignals { + constructor(connections) { + this.buffer = []; + this.connections = connections + } + + connect(actor, blur_effect) { + let paint_effect = new EmitPaintSignal(); + let infos = { + actor: actor, + paint_effect: paint_effect + }; + let counter = 0; + + actor.add_effect(paint_effect); + this.connections.connect(paint_effect, 'update-blur', () => { + try { + // checking if blur_effect.queue_repaint() has been recently called + if (counter === 0) { + counter = 2; + blur_effect.queue_repaint(); + } + else counter--; + } catch (e) { } + }); + + this.buffer.push(infos) + } + + disconnect_all() { + this.buffer.forEach((infos) => { + this.connections.disconnect_all_for(infos.paint_effect); + infos.actor.remove_effect(infos.paint_effect); + }); + + this.buffer = [] + } +} + +var EmitPaintSignal = GObject.registerClass({ + GTypeName: 'EmitPaintSignal', + Signals: { + 'update-blur': { + param_types: [] + }, + } +}, + class EmitPaintSignal extends Clutter.Effect { + vfunc_paint(node, paint_context, paint_flags) { + this.emit("update-blur"); + super.vfunc_paint(node, paint_context, paint_flags); + } + } +); \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/panel.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/panel.js new file mode 100644 index 0000000..930ca4d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/panel.js @@ -0,0 +1,245 @@ +'use strict'; + +const { St, Shell, Meta, Gio, GLib } = imports.gi; +const Main = imports.ui.main; +const Config = imports.misc.config; +const backgroundSettings = new Gio.Settings({ schema: 'org.gnome.desktop.background' }) + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +const [GS_MAJOR, GS_MINOR] = Config.PACKAGE_VERSION.split('.'); + + +var PanelBlur = class PanelBlur { + constructor(connections, prefs) { + this.connections = connections; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.prefs = prefs; + this.effect = new Shell.BlurEffect({ + brightness: prefs.BRIGHTNESS.get(), + sigma: prefs.SIGMA.get(), + mode: prefs.STATIC_BLUR.get() ? 0 : 1 + }); + this.background_parent = new St.Widget({ + name: 'topbar-blurred-background-parent', + style_class: 'topbar-blurred-background-parent', + x: this.monitor.x, + y: this.monitor.y, + width: this.monitor.width, + height: 0, + }); + this.background = prefs.STATIC_BLUR.get() ? new Meta.BackgroundActor : new St.Widget({ + style_class: 'topbar-blurred-background', + x: 0, + y: 0, + width: this.monitor.width, + height: Main.panel.height, + }); + this.background_parent.add_child(this.background); + } + + enable() { + this._log("blurring top panel"); + + if (GS_MAJOR < 42) { + // hide corners, can't style them + Main.panel._leftCorner.hide(); + Main.panel._rightCorner.hide(); + this.connections.connect(Main.panel._leftCorner, 'show', () => { Main.panel._leftCorner.hide(); }); + this.connections.connect(Main.panel._rightCorner, 'show', () => { Main.panel._rightCorner.hide(); }); + } + + // insert background parent + let children = Main.layoutManager.panelBox.get_children(); + for (let i = 0; i < children.length; ++i) + if (children[i].name == 'topbar-blurred-background-parent') + Main.layoutManager.panelBox.remove_child(children[i]); + Main.layoutManager.panelBox.insert_child_at_index(this.background_parent, 0); + + // remove background + Main.panel.add_style_class_name('transparent-panel'); + + // perform updates + this.change_blur_type(); + Utils.setTimeout(() => { this.change_blur_type() }, 500); + + // connect to panel size change + this.connections.connect(Main.panel, 'notify::height', () => { + this.update_size(this.prefs.STATIC_BLUR.get()); + }); + + // connect to every background change (even without changing image) + this.connections.connect(Main.layoutManager._backgroundGroup, 'notify', () => { + this.update_wallpaper(this.prefs.STATIC_BLUR.get()); + }) + + // connect to monitors change + this.connections.connect(Main.layoutManager, 'monitors-changed', () => { + if (Main.screenShield && !Main.screenShield.locked) { + this.update_wallpaper(this.prefs.STATIC_BLUR.get()); + this.update_size(this.prefs.STATIC_BLUR.get()); + } + }); + + this.connect_to_overview(); + } + + change_blur_type() { + let is_static = this.prefs.STATIC_BLUR.get(); + + // reset widgets to right state + this.background_parent.remove_child(this.background); + this.background.remove_effect(this.effect); + this.background = is_static ? new Meta.BackgroundActor : new St.Widget({ + style_class: 'topbar-blurred-background', + x: 0, + y: 0, + width: this.monitor.width, + height: Main.panel.height, + }); + this.effect.set_mode(is_static ? 0 : 1); + this.background.add_effect(this.effect); + this.background_parent.add_child(this.background); + + // perform updates + this.update_wallpaper(is_static); + this.update_size(is_static); + + // HACK + if (!is_static) { + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("panel hack level 1"); + this.paint_signals.disconnect_all(); + + let rp = () => { this.effect.queue_repaint() }; + + this.connections.connect(Main.panel, 'enter-event', rp); + this.connections.connect(Main.panel, 'leave-event', rp); + this.connections.connect(Main.panel, 'button-press-event', rp); + + Main.panel.get_children().forEach(child => { + this.connections.connect(child, 'enter-event', rp); + this.connections.connect(child, 'leave-event', rp); + this.connections.connect(child, 'button-press-event', rp); + }); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("panel hack level 2"); + this.paint_signals.disconnect_all(); + + this.paint_signals.connect(this.background, this.effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + } + } + + update_wallpaper(is_static) { + // if static blur, get right wallpaper and update blur with it + if (is_static) { + // the try/catch behaviour is used to prevent bugs like #136 and #137 + try { + let bg = Main.layoutManager._backgroundGroup.get_child_at_index(Main.layoutManager.monitors.length - this.monitor.index - 1); + this.background.set_content(bg.get_content()); + } catch (error) { this._log(`could not blur panel: ${error}`) } + } + } + + update_size(is_static) { + this.background_parent.width = Main.panel.width; + this.background.width = Main.panel.width; + let panel_box = Main.layoutManager.panelBox; + this.background.height = panel_box.height; + let clip_box = panel_box.get_parent(); + if (is_static) { + this.background.set_clip( + clip_box.x, + clip_box.y, + panel_box.width, + panel_box.height + ); + this.background.x = -clip_box.x; + this.background.y = -clip_box.y; + } + } + + // returns either the primary monitor, or a dummy one if none is connected + get monitor() { + if (Main.layoutManager.primaryMonitor != null) { + return Main.layoutManager.primaryMonitor + } else { + return { x: 0, y: 0, width: 0, index: 0 } + } + } + + // connect when overview if opened/closed to hide/show the blur in consequence + // if HIDETOPBAR set, we need just to hide the blur when showing appgrid (so no shadow is cropped) + connect_to_overview() { + this.connections.disconnect_all_for(Main.overview._overview._controls._appDisplay); + this.connections.disconnect_all_for(Main.overview); + + if (!this.prefs.HIDETOPBAR.get()) { + this.connections.connect(Main.overview, 'showing', () => { + this.hide(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } else { + this.connections.connect(Main.overview._overview._controls._appDisplay, 'show', () => { + this.hide(); + }); + this.connections.connect(Main.overview._overview._controls._appDisplay, 'hide', () => { + this.show(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } + } + + set_sigma(s) { + this.effect.sigma = s; + } + + set_brightness(b) { + this.effect.brightness = b; + } + + disable() { + this._log("removing blur from top panel"); + Main.panel.remove_style_class_name('transparent-panel'); + + if (GS_MAJOR < 42) { + Main.panel._leftCorner.show(); + Main.panel._rightCorner.show(); + } + + try { + Main.layoutManager.panelBox.remove_child(this.background_parent); + } catch (e) { } + + this.connections.disconnect_all(); + } + + show() { + this.background_parent.show(); + } + hide() { + this.background_parent.hide(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.js new file mode 100644 index 0000000..b8c1c41 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.js @@ -0,0 +1,187 @@ +'use strict'; + +const { GObject, Gtk } = imports.gi; + +const ExtensionUtils = imports.misc.extensionUtils; +const Extension = ExtensionUtils.getCurrentExtension(); +let Settings = Extension.imports.settings; +let config = new Settings.Prefs(); + + +const BlurMyShellPrefsWidget = GObject.registerClass({ + GTypeName: 'BlurMyShellPrefsWidget', + Template: Extension.dir.get_child('prefs.ui').get_uri(), + InternalChildren: [ + 'sigma_scale', + 'brightness_scale', + 'blur_dash', + 'blur_panel', + 'blur_overview', + 'blur_applications', + 'blur_lockscreen', + 'blur_appfolders', + 'blur_window_list', + 'hacks_level0', + 'hacks_level1', + 'hacks_level2', + 'dash_opacity_scale', + 'appfolder_dialog_opacity_scale', + 'static_blur', + 'hidetopbar', + 'debug_mode' + ], +}, class BlurMyShellPrefsWidget extends Gtk.Box { + _init(params = {}) { + super._init(params); + + // ! sigma + this._sigma_scale.set_value(config.SIGMA.get()); + + // ! brightness + this._brightness_scale.set_value(config.BRIGHTNESS.get()); + + // ! blur dash + this._blur_dash.set_active(config.BLUR_DASH.get()); + + // ! blur panel + this._blur_panel.set_active(config.BLUR_PANEL.get()); + + // ! blur overview + this._blur_overview.set_active(config.BLUR_OVERVIEW.get()); + + // ! blur applications + this._blur_applications.set_active(config.BLUR_APPLICATIONS.get()); + + // ! blur lockscreen + this._blur_lockscreen.set_active(config.BLUR_LOCKSCREEN.get()); + + // ! blur appfolders + this._blur_appfolders.set_active(config.BLUR_APPFOLDERS.get()); + + // ! blur window list + this._blur_window_list.set_active(config.BLUR_WINDOW_LIST.get()); + + // ! dash hacks + if (config.HACKS_LEVEL.get() == 0) { + this._hacks_level0.set_active(true); + } else if (config.HACKS_LEVEL.get() == 1) { + this._hacks_level1.set_active(true); + } else if (config.HACKS_LEVEL.get() == 2) { + this._hacks_level2.set_active(true); + } else { + this._log(`hack level out-of-bound: ${hack_level}, defaulting to 1.`); + this._hacks_level0.set_active(true); + } + + // ! dash opacity + this._dash_opacity_scale.set_value(config.DASH_OPACITY.get()); + + // ! appfolder dialog opacity + this._appfolder_dialog_opacity_scale.set_value(config.APPFOLDER_DIALOG_OPACITY.get()); + + // ! static panel blur + this._static_blur.set_active(config.STATIC_BLUR.get()); + + // ! hidetopbar compatibility + this._hidetopbar.set_active(config.HIDETOPBAR.get()); + + // ! debug mode + this._debug_mode.set_active(config.DEBUG.get()); + } + + sigma_changed(w) { + let value = w.get_value(); + config.SIGMA.set(value); + } + + brightness_changed(w) { + let value = w.get_value(); + config.BRIGHTNESS.set(value); + } + + blur_dash_toggled(w) { + let value = w.get_active(); + config.BLUR_DASH.set(value); + } + + blur_panel_toggled(w) { + let value = w.get_active(); + config.BLUR_PANEL.set(value); + } + + blur_overview_toggled(w) { + let value = w.get_active(); + config.BLUR_OVERVIEW.set(value); + } + + blur_applications_toggled(w) { + let value = w.get_active(); + config.BLUR_APPLICATIONS.set(value); + } + + blur_lockscreen_toggled(w) { + let value = w.get_active(); + config.BLUR_LOCKSCREEN.set(value); + } + + blur_appfolders_toggled(w) { + let value = w.get_active(); + config.BLUR_APPFOLDERS.set(value); + } + + blur_window_list_toggled(w) { + let value = w.get_active(); + config.BLUR_WINDOW_LIST.set(value); + } + + hacks_level0_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(0) } + } + + hacks_level1_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(1) } + } + + hacks_level2_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(2) } + } + + dash_opacity_changed(w) { + let value = w.get_value(); + config.DASH_OPACITY.set(value); + } + + appfolder_dialog_opacity_changed(w) { + let value = w.get_value(); + config.APPFOLDER_DIALOG_OPACITY.set(value); + } + + static_blur_toggled(w) { + let value = w.get_active(); + config.STATIC_BLUR.set(value); + } + + hidetopbar_toggled(w) { + let value = w.get_active(); + config.HIDETOPBAR.set(value); + } + + debug_mode_toggled(w) { + let value = w.get_active(); + config.DEBUG.set(value); + } + + _log(str) { + if (config.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +}); + +function init() { } + +function buildPrefsWidget() { + return new BlurMyShellPrefsWidget(); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.ui b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.ui new file mode 100644 index 0000000..a5d30c7 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/prefs.ui @@ -0,0 +1,410 @@ + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..ca00e0c1e8f8d52f8e95fc81aade8ebd4d10af00 GIT binary patch literal 1064 zcmY*YJ!lj`7#)93P44uPLOd)|gcKXd-WGyrA=*ezuuzag6eM%EjrO&U!Z-<#WbX5jJOzMc7I_M5l!bs1|Jq#_>` z@XevN4(8qg@b=c9S7g4kL`^J#T}&vP6k-=+<}eI#Rgf(pjJ>KCgdJ5)TFUpU>VB$% zM2A6AZTQ{T?kw8o1r}M8T$&H=u?Ox?9LjM7d<+=NQ3RjJQ3kKR`&d5;=DCU@6A`!z z%-7D|qfb2se+j%yKb&5mPdyI*Dfk&M*S}JxPhEh&2JQnJ^=}{OQ%}GjfZqUj;`gic zsgJ||1pWeKw{B0+r)Hf^@D_F6GivsXJcEzCcK)R~Cv_R~&w(!hZy!D?vd7e{Qv-K_ zofmC~^{F|31^gIzvb$h>>Ph%(;68BU(r;6rn*DhV9sup_l~b%kU4p*>{tWEMug~dI zvp<{QpTOm5>ok4p3Veb4E&=Ov-yhJY=KKnnc}P;3>ZZ+m$K6_uS(5-)CN17Io?F^g zX&5zRjMaE{Rio=cnz1*(rvo?a*}hH~)=`}>Q*owMZ#didiS{~j_&i0j^epo+4lpy! z7jskqm>(Pw_sP2(W~~I~)i7@y=D2>?Y$wfFsla$)w%3cRx~ z@DBQ63>igtL*G?#!u6x?f$!@kI);CRZ`dD+y=`A*%IDenJ?x$xMzX2XMOuTYlcOP4%-{aK>2yye_PqEmVW5{w{YLOSbMEBPzm-uW5y3tkM;ioejD3L literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml new file mode 100644 index 0000000..4417dce --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml @@ -0,0 +1,95 @@ + + + + + + 30 + Global sigma (gaussian blur radius) to use + + + + + 0.6 + Global brightness to use + + + + + true + Boolean, whether to blur the dash or not + + + + + true + Boolean, whether to blur the panel or not + + + + + true + Boolean, whether to blur the overview or not + + + + + true + Boolean, whether to blur lockscreen or not + + + + + true + Boolean, whether to blur appfolders or not + + + + + true + Boolean, whether to blur window list extension or not + + + + + false + Boolean, whether to blur applications that request it or not + + + + + 1 + Level of hacks to use (from 0 to 2) + + + + + 0.12 + Opacity of dash to use + + + + + 0.12 + Opacity of appfolder dialog to use + + + + + true + Boolean, whether to have a static blur on panel or a dynamic one + + + + + false + Boolean, whether to try compatibility with hidetopbar@mathieu.bidon.ca or not + + + + + false + Boolean, set to true to activate debug mode (more verbose journalctl logs) + + + + \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/settings.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/settings.js new file mode 100644 index 0000000..69a0093 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/settings.js @@ -0,0 +1,274 @@ +'use strict'; + +const Gio = imports.gi.Gio; +const Extension = imports.misc.extensionUtils.getCurrentExtension(); + +const SCHEMA_PATH = 'org.gnome.shell.extensions.blur-my-shell'; + +function get_local_gsettings(schema_path) { + const GioSSS = Gio.SettingsSchemaSource; + let schemaDir = Extension.dir.get_child('schemas'); + let schemaSource = GioSSS.get_default(); + + if (schemaDir.query_exists(null)) { + schemaSource = GioSSS.new_from_directory( + schemaDir.get_path(), + schemaSource, + false); + } + + let schemaObj = schemaSource.lookup(schema_path, true); + if (!schemaObj) { + throw new Error( + `Schema ${schema_path} could not be found for extension ${Extension.metadata.uuid}` + ); + } + return new Gio.Settings({ + settings_schema: schemaObj + }); +}; + +var Prefs = class Prefs { + constructor() { + var settings = this.settings = get_local_gsettings(SCHEMA_PATH); + this.SIGMA = { + key: 'sigma', + get: function () { + return settings.get_int(this.key); + }, + set: function (v) { + settings.set_int(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.BRIGHTNESS = { + key: 'brightness', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.BLUR_DASH = { + key: 'blur-dash', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_PANEL = { + key: 'blur-panel', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_OVERVIEW = { + key: 'blur-overview', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_LOCKSCREEN = { + key: 'blur-lockscreen', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_APPLICATIONS = { + key: 'blur-applications', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_APPFOLDERS = { + key: 'blur-appfolders', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_WINDOW_LIST = { + key: 'blur-window-list', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.HACKS_LEVEL = { + key: 'hacks-level', + get: function () { + return settings.get_int(this.key); + }, + set: function (v) { + settings.set_int(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.DASH_OPACITY = { + key: 'dash-opacity', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.APPFOLDER_DIALOG_OPACITY = { + key: 'appfolder-dialog-opacity', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.STATIC_BLUR = { + key: 'static-blur', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.HIDETOPBAR = { + key: 'hidetopbar', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.DEBUG = { + key: 'debug', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + } +}; \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/stylesheet.css b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/stylesheet.css new file mode 100644 index 0000000..a094537 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/stylesheet.css @@ -0,0 +1,436 @@ +#panel.transparent-panel { + background: transparent; + transition-duration: 500ms; +} + +.blurred-overview .app-folder { + background-color: rgba(0, 0, 0, 0.12); +} + + +.blurred-overview .workspace-animation { + background-color: transparent !important; +} + +.transparent-app-folder-dialogs .edit-folder-button { + background: transparent; + border-radius: 19px; +} + +.blurred-dash .dash-background { + background: transparent; +} + +/* +! TRANSPARENT APPFOLDER DIALOGS + +python generator: + +```py +for e in range(0,101):print(".transparent-app-folder-dialogs-"+str(e)+"\n{background-color: rgba(0, 0, 0, "+str(round(e/100,2))+");}") +``` +*/ + +.transparent-app-folder-dialogs-0 { + background-color: rgba(0, 0, 0, 0.0); +} + +.transparent-app-folder-dialogs-1 { + background-color: rgba(0, 0, 0, 0.01); +} + +.transparent-app-folder-dialogs-2 { + background-color: rgba(0, 0, 0, 0.02); +} + +.transparent-app-folder-dialogs-3 { + background-color: rgba(0, 0, 0, 0.03); +} + +.transparent-app-folder-dialogs-4 { + background-color: rgba(0, 0, 0, 0.04); +} + +.transparent-app-folder-dialogs-5 { + background-color: rgba(0, 0, 0, 0.05); +} + +.transparent-app-folder-dialogs-6 { + background-color: rgba(0, 0, 0, 0.06); +} + +.transparent-app-folder-dialogs-7 { + background-color: rgba(0, 0, 0, 0.07); +} + +.transparent-app-folder-dialogs-8 { + background-color: rgba(0, 0, 0, 0.08); +} + +.transparent-app-folder-dialogs-9 { + background-color: rgba(0, 0, 0, 0.09); +} + +.transparent-app-folder-dialogs-10 { + background-color: rgba(0, 0, 0, 0.1); +} + +.transparent-app-folder-dialogs-11 { + background-color: rgba(0, 0, 0, 0.11); +} + +.transparent-app-folder-dialogs-12 { + background-color: rgba(0, 0, 0, 0.12); +} + +.transparent-app-folder-dialogs-13 { + background-color: rgba(0, 0, 0, 0.13); +} + +.transparent-app-folder-dialogs-14 { + background-color: rgba(0, 0, 0, 0.14); +} + +.transparent-app-folder-dialogs-15 { + background-color: rgba(0, 0, 0, 0.15); +} + +.transparent-app-folder-dialogs-16 { + background-color: rgba(0, 0, 0, 0.16); +} + +.transparent-app-folder-dialogs-17 { + background-color: rgba(0, 0, 0, 0.17); +} + +.transparent-app-folder-dialogs-18 { + background-color: rgba(0, 0, 0, 0.18); +} + +.transparent-app-folder-dialogs-19 { + background-color: rgba(0, 0, 0, 0.19); +} + +.transparent-app-folder-dialogs-20 { + background-color: rgba(0, 0, 0, 0.2); +} + +.transparent-app-folder-dialogs-21 { + background-color: rgba(0, 0, 0, 0.21); +} + +.transparent-app-folder-dialogs-22 { + background-color: rgba(0, 0, 0, 0.22); +} + +.transparent-app-folder-dialogs-23 { + background-color: rgba(0, 0, 0, 0.23); +} + +.transparent-app-folder-dialogs-24 { + background-color: rgba(0, 0, 0, 0.24); +} + +.transparent-app-folder-dialogs-25 { + background-color: rgba(0, 0, 0, 0.25); +} + +.transparent-app-folder-dialogs-26 { + background-color: rgba(0, 0, 0, 0.26); +} + +.transparent-app-folder-dialogs-27 { + background-color: rgba(0, 0, 0, 0.27); +} + +.transparent-app-folder-dialogs-28 { + background-color: rgba(0, 0, 0, 0.28); +} + +.transparent-app-folder-dialogs-29 { + background-color: rgba(0, 0, 0, 0.29); +} + +.transparent-app-folder-dialogs-30 { + background-color: rgba(0, 0, 0, 0.3); +} + +.transparent-app-folder-dialogs-31 { + background-color: rgba(0, 0, 0, 0.31); +} + +.transparent-app-folder-dialogs-32 { + background-color: rgba(0, 0, 0, 0.32); +} + +.transparent-app-folder-dialogs-33 { + background-color: rgba(0, 0, 0, 0.33); +} + +.transparent-app-folder-dialogs-34 { + background-color: rgba(0, 0, 0, 0.34); +} + +.transparent-app-folder-dialogs-35 { + background-color: rgba(0, 0, 0, 0.35); +} + +.transparent-app-folder-dialogs-36 { + background-color: rgba(0, 0, 0, 0.36); +} + +.transparent-app-folder-dialogs-37 { + background-color: rgba(0, 0, 0, 0.37); +} + +.transparent-app-folder-dialogs-38 { + background-color: rgba(0, 0, 0, 0.38); +} + +.transparent-app-folder-dialogs-39 { + background-color: rgba(0, 0, 0, 0.39); +} + +.transparent-app-folder-dialogs-40 { + background-color: rgba(0, 0, 0, 0.4); +} + +.transparent-app-folder-dialogs-41 { + background-color: rgba(0, 0, 0, 0.41); +} + +.transparent-app-folder-dialogs-42 { + background-color: rgba(0, 0, 0, 0.42); +} + +.transparent-app-folder-dialogs-43 { + background-color: rgba(0, 0, 0, 0.43); +} + +.transparent-app-folder-dialogs-44 { + background-color: rgba(0, 0, 0, 0.44); +} + +.transparent-app-folder-dialogs-45 { + background-color: rgba(0, 0, 0, 0.45); +} + +.transparent-app-folder-dialogs-46 { + background-color: rgba(0, 0, 0, 0.46); +} + +.transparent-app-folder-dialogs-47 { + background-color: rgba(0, 0, 0, 0.47); +} + +.transparent-app-folder-dialogs-48 { + background-color: rgba(0, 0, 0, 0.48); +} + +.transparent-app-folder-dialogs-49 { + background-color: rgba(0, 0, 0, 0.49); +} + +.transparent-app-folder-dialogs-50 { + background-color: rgba(0, 0, 0, 0.5); +} + +.transparent-app-folder-dialogs-51 { + background-color: rgba(0, 0, 0, 0.51); +} + +.transparent-app-folder-dialogs-52 { + background-color: rgba(0, 0, 0, 0.52); +} + +.transparent-app-folder-dialogs-53 { + background-color: rgba(0, 0, 0, 0.53); +} + +.transparent-app-folder-dialogs-54 { + background-color: rgba(0, 0, 0, 0.54); +} + +.transparent-app-folder-dialogs-55 { + background-color: rgba(0, 0, 0, 0.55); +} + +.transparent-app-folder-dialogs-56 { + background-color: rgba(0, 0, 0, 0.56); +} + +.transparent-app-folder-dialogs-57 { + background-color: rgba(0, 0, 0, 0.57); +} + +.transparent-app-folder-dialogs-58 { + background-color: rgba(0, 0, 0, 0.58); +} + +.transparent-app-folder-dialogs-59 { + background-color: rgba(0, 0, 0, 0.59); +} + +.transparent-app-folder-dialogs-60 { + background-color: rgba(0, 0, 0, 0.6); +} + +.transparent-app-folder-dialogs-61 { + background-color: rgba(0, 0, 0, 0.61); +} + +.transparent-app-folder-dialogs-62 { + background-color: rgba(0, 0, 0, 0.62); +} + +.transparent-app-folder-dialogs-63 { + background-color: rgba(0, 0, 0, 0.63); +} + +.transparent-app-folder-dialogs-64 { + background-color: rgba(0, 0, 0, 0.64); +} + +.transparent-app-folder-dialogs-65 { + background-color: rgba(0, 0, 0, 0.65); +} + +.transparent-app-folder-dialogs-66 { + background-color: rgba(0, 0, 0, 0.66); +} + +.transparent-app-folder-dialogs-67 { + background-color: rgba(0, 0, 0, 0.67); +} + +.transparent-app-folder-dialogs-68 { + background-color: rgba(0, 0, 0, 0.68); +} + +.transparent-app-folder-dialogs-69 { + background-color: rgba(0, 0, 0, 0.69); +} + +.transparent-app-folder-dialogs-70 { + background-color: rgba(0, 0, 0, 0.7); +} + +.transparent-app-folder-dialogs-71 { + background-color: rgba(0, 0, 0, 0.71); +} + +.transparent-app-folder-dialogs-72 { + background-color: rgba(0, 0, 0, 0.72); +} + +.transparent-app-folder-dialogs-73 { + background-color: rgba(0, 0, 0, 0.73); +} + +.transparent-app-folder-dialogs-74 { + background-color: rgba(0, 0, 0, 0.74); +} + +.transparent-app-folder-dialogs-75 { + background-color: rgba(0, 0, 0, 0.75); +} + +.transparent-app-folder-dialogs-76 { + background-color: rgba(0, 0, 0, 0.76); +} + +.transparent-app-folder-dialogs-77 { + background-color: rgba(0, 0, 0, 0.77); +} + +.transparent-app-folder-dialogs-78 { + background-color: rgba(0, 0, 0, 0.78); +} + +.transparent-app-folder-dialogs-79 { + background-color: rgba(0, 0, 0, 0.79); +} + +.transparent-app-folder-dialogs-80 { + background-color: rgba(0, 0, 0, 0.8); +} + +.transparent-app-folder-dialogs-81 { + background-color: rgba(0, 0, 0, 0.81); +} + +.transparent-app-folder-dialogs-82 { + background-color: rgba(0, 0, 0, 0.82); +} + +.transparent-app-folder-dialogs-83 { + background-color: rgba(0, 0, 0, 0.83); +} + +.transparent-app-folder-dialogs-84 { + background-color: rgba(0, 0, 0, 0.84); +} + +.transparent-app-folder-dialogs-85 { + background-color: rgba(0, 0, 0, 0.85); +} + +.transparent-app-folder-dialogs-86 { + background-color: rgba(0, 0, 0, 0.86); +} + +.transparent-app-folder-dialogs-87 { + background-color: rgba(0, 0, 0, 0.87); +} + +.transparent-app-folder-dialogs-88 { + background-color: rgba(0, 0, 0, 0.88); +} + +.transparent-app-folder-dialogs-89 { + background-color: rgba(0, 0, 0, 0.89); +} + +.transparent-app-folder-dialogs-90 { + background-color: rgba(0, 0, 0, 0.9); +} + +.transparent-app-folder-dialogs-91 { + background-color: rgba(0, 0, 0, 0.91); +} + +.transparent-app-folder-dialogs-92 { + background-color: rgba(0, 0, 0, 0.92); +} + +.transparent-app-folder-dialogs-93 { + background-color: rgba(0, 0, 0, 0.93); +} + +.transparent-app-folder-dialogs-94 { + background-color: rgba(0, 0, 0, 0.94); +} + +.transparent-app-folder-dialogs-95 { + background-color: rgba(0, 0, 0, 0.95); +} + +.transparent-app-folder-dialogs-96 { + background-color: rgba(0, 0, 0, 0.96); +} + +.transparent-app-folder-dialogs-97 { + background-color: rgba(0, 0, 0, 0.97); +} + +.transparent-app-folder-dialogs-98 { + background-color: rgba(0, 0, 0, 0.98); +} + +.transparent-app-folder-dialogs-99 { + background-color: rgba(0, 0, 0, 0.99); +} + +.transparent-app-folder-dialogs-100 { + background-color: rgba(0, 0, 0, 1.0); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/utilities.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/utilities.js new file mode 100644 index 0000000..5dbc319 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/utilities.js @@ -0,0 +1,39 @@ +'use strict' + +const GLib = imports.gi.GLib; + +let clearTimeout, clearInterval; +clearInterval = clearTimeout = GLib.Source.remove; + +var setTimeout = function(func, delay, ...args) { + return GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { + func(...args); + return GLib.SOURCE_REMOVE; + }); +}; + +var setInterval = function(func, delay, ...args) { + return GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { + func(...args); + return GLib.SOURCE_CONTINUE; + }); +}; + +var easeOutQuad = function(t, begin, end, duration) { + t /= duration + return begin + (t * (2 - t) * (end - begin)) +}; + +var ease_property = function(object, property, begin, end, duration, update) { + let start = Date.now(); + GLib.timeout_add(GLib.PRIORITY_DEFAULT, update, () => { + let time = Date.now() - start; + if (time < duration) { + object[property] = easeOutQuad(time, begin, end, duration); + return GLib.SOURCE_CONTINUE; + } else { + object[property] = end; + return GLib.SOURCE_REMOVE; + } + }); +}; \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/window_list.js b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/window_list.js new file mode 100644 index 0000000..ca8708d --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/blur-my-shell@aunetx/window_list.js @@ -0,0 +1,128 @@ +'use strict'; + +const { St, Shell, Meta, Gio } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + + +var WindowListBlur = class WindowListBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.blur_effects = []; + } + + enable() { + this._log("blurring window list"); + + // add the blur if window-list found + Main.layoutManager.uiGroup.get_children().forEach(child => this.try_blur(child)); + + // listen to new actors in `Main.layoutManager.uiGroup` and blur if window-list + this.connections.connect(Main.layoutManager.uiGroup, 'actor-added', (_, child) => this.try_blur(child)); + + // connect to overview + this.connections.connect(Main.overview, 'showing', () => { + this.hide(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } + + try_blur(child) { + if (child.constructor.name == "WindowList" && child.style != "background:transparent;") { + this._log("found window list to blur"); + + child.style = "background:transparent;"; + let effect = new Shell.BlurEffect({ + name: 'window-list-blur', + sigma: this.prefs.SIGMA.get(), + brightness: this.prefs.BRIGHTNESS.get(), + mode: 1 + }); + child.add_effect(effect); + this.blur_effects.push(effect); + + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("window list hack level 1"); + + child._windowList.get_children().forEach(child => { + this.connections.connect(child, 'button-press-event', () => { effect.queue_repaint(); }); + }); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("window list hack level 2"); + + this.paint_signals.connect(child, effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + + child._windowList.get_children().forEach(window => this.blur_window_button(window)); + this.connections.connect(child._windowList, 'actor-added', (_, window) => { + this.blur_window_button(window); + }) + } + } + + blur_window_button(window) { + window.get_child_at_index(0).style = "box-shadow:none;background-color:rgba(0,0,0,0.2);border-radius:5px;"; + } + + try_remove_blur(child) { + if (child.constructor.name == "WindowList" && child.style == "background:transparent;") { + child.style = null; + child.remove_effect_by_name('window-list-blur'); + + child._windowList.get_children().forEach(child => { + child.get_child_at_index(0).style = null; + }); + } + } + + set_sigma(s) { + this.blur_effects.forEach(effect => { + effect.sigma = s; + }); + } + + set_brightness(b) { + this.blur_effects.forEach(effect => { + effect.brightness = b; + }); + } + + hide() { + this.set_sigma(0); + } + + show() { + this.set_sigma(this.prefs.SIGMA.get()); + } + + disable() { + this._log("removing blur from window list"); + + Main.layoutManager.uiGroup.get_children().forEach(child => this.try_remove_blur(child)) + + this.blur_effects = []; + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING new file mode 100644 index 0000000..8d61b15 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/README.md b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/README.md new file mode 100644 index 0000000..5000de1 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/README.md @@ -0,0 +1,189 @@ +

      + +

      +
      + +![](media/design/png/dtp-main-p2.png) + +### Introduction + +Dash to Panel is an icon taskbar for Gnome Shell. This extension moves the dash into the gnome main panel so that the application launchers and system tray are combined into a single panel, similar to that found in KDE Plasma and Windows 7+. A separate dock is no longer needed for easy access to running and favorited applications. + +Beyond that, just about every aspect of the panel is fully customizable. From positioning and scaling panel elements to running indicators to multi-monitor display, to window previews and even intellihide, Dash to Panel has everything you need to make your workspace feel like home. + +### Features + +|Customizable appearance| +|:-----:| +|![screenshot](media/design/gif/customizable.gif)| +|Hide & show panel elements and set their positions, sizes & colors| + +## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Customizable running indicators
      MetroCiliora/Dashes
      CilioraSquares/Segmented
      DashesDots/Solid
      Set position, style, weight & color of running indicators to easily and quickly identify focused and unfocused applications
      + +## + +|Live Previews on Hover| +|:-----:| +|![screenshot](media/design/gif/previews.gif)| +|Hover over the launcher icon for an open application to get a live window preview| + +## +|Launch by Number| +|:-----:| +|![](media/design/png/indicators-num.png.png)| +|Optionally launch your favorite applications via keyboard| + +## + +|Panel Intellihide| +|:-----:| +|![Intellihide](media/design/gif/Intellihide.gif)| +|Hide and reveal the panel according to your set preferences| + +## +|Additional Features|Feature Implemented| +|:-----|:-----:| +|Add "Show Desktop" button to panel|![](media/design/png/done.png)| +|Isolate running apps by workspaces and/or monitors|![](media/design/png/done.png)| +|Custom click behaviors (launch new window, cycle open windows, minimize, etc)|![](media/design/png/done.png)| +|Integrate native Gnome appMenu into right-click secondary menu|![](media/design/png/done.png)| +|Multi-monitor support|![](media/design/png/done.png)| +|Dynamic transparency|![](media/design/png/done.png)| +|Ungroup application windows|![](media/design/png/done.png)| +|Export and import settings|![](media/design/png/done.png)| +## + +### Installation + +**To install the most recent official release: +[Visit Dash-to-Panel at GNOME Extensions](https://extensions.gnome.org/extension/1160/dash-to-panel/)** + +To install a development version from source, please see the [Installation wiki page](https://github.com/jderose9/dash-to-panel/wiki/Installation). + +## +### FAQ + +How do I customize the panel? [See the Wiki](https://github.com/home-sweet-gnome/dash-to-panel/wiki/Enable-and-Customize#customize-it) + +How do I embed my bottom left notification drawer into the panel like a system tray? [Top Icons Plus](https://extensions.gnome.org/extension/2311/topicons-plus) or [(K)StatusNotifierItem/AppIndicator Support](https://extensions.gnome.org/extension/615/appindicator-support) + +How do I add a traditional start menu? [Arc Menu](https://extensions.gnome.org/extension/3628/arcmenu/) + +How do I disable the hot corner? [No Topleft Hot Corner](https://extensions.gnome.org/extension/118/no-topleft-hot-corner) + +How do I move the notifications to somewhere other than the top center? [Panel OSD](https://extensions.gnome.org/extension/708/panel-osd) + +How do I display Minimize & Maximize buttons? In the Tweak Tool application, turn on `Windows > Titlebar Buttons > Minimize & Maximize`. + +How do I reset the extension to its default settings? `dconf reset -f /org/gnome/shell/extensions/dash-to-panel/`. + +## +### Themes +While this extension works well with most popular Gnome Shell themes, the following themes are known to have explicitly added custom styles for this extension: +- [Ciliora Tertia](https://github.com/zagortenay333/ciliora-tertia-shell) / [Ciliora Secunda](https://github.com/zagortenay333/ciliora-secunda-shell) +- [Plano](https://github.com/lassekongo83/plano-theme) + + +## +### Compatibility + +This extension has been tested with Gnome 3.18+. + +This extension manipulates the Gnome Main Panel, aka Top Bar. So, most other extensions which operate on the top bar should be compatible. + +## +### Volunteers needed! + +This extension could be even better with your help! Any items in the issue tracker labelled `help wanted` or `good first issue` are up for grabs. For more info, see the [Contributing wiki page](https://github.com/jderose9/dash-to-panel/wiki/Contributing). + +## +### Credits + +This extension is developed and maintained by [@jderose9](https://github.com/jderose9) and [@charlesg99](https://github.com/charlesg99). + +Significant portions of code in this extension were derived from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html). + +Additional credits: This extension leverages the work for [ZorinOS Taskbar](https://github.com/ZorinOS/zorin-taskbar) (used in [ZorinOS](https://zorinos.com/)) to show window previews and allow the dash from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html) to be embedded in the Gnome main panel. +Code to set anchor position taken from [Thoma5/gnome-shell-extension-bottompanel](https://github.com/Thoma5/gnome-shell-extension-bottompanel). +Pattern for moving panel contents based on [Frippery Move Clock](http://frippery.org/extensions/) by R M Yorston. +Ideas for recursing child actors and assigning inline styles are based on code from the extension [StatusAreaHorizontalSpacing](https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension). +## + +#### Thanks to the following people for contributing via pull requests: + +- @franglais125 for launching apps by number (w/ overlay), bug fixes, and issue support +- @LinxGem33 and @sbarrett322 for artwork, logos, screenshots and design effort +- @dziku1337 for peek mode in window previews +- @robrobinbin for configuring appMenu on/off in the panel +- @MartinPL for toggling favorites on/off in panel +- @jackwickham for thumbnail middle and right click actions +- @abakkk for centering the taskbar icons in the panel, and animated taskbar hovering +- @quasoft for changing of font weight of ungrouped application titles +- @jordanribera for using icon's dominant color as running indicator color +- @tper0700 for dynamically building context menu based on system capabilities +- @levacic for configurable minimized application title font color +- @l3nn4rt for toggling workspace switch popup +- @hlechner for adjustable show desktop line color and window preview icon size +- @ArtyomZorin for animated urgent icons +- @jvpessoa10 for additional click window cycle options +- @marksvc for assigning percent of display for panel length +- @philippun1 for GNOME 40 support :rocket: + +#### Bug Fixes: +@imrvelj, @Teslator, @bil-elmoussaoui, @brandon-schumann, @sw9, @rockon999 , @lexruee, @3v1n0, @freeroot, @moqmar, @ArtyomZorin, @lkc0987, @saibotk, @vanillajonathan, @Zkdc, @leebickmtu, @l3nn4rt, @Melix19, @Aikatsui, @melix99, @kyrillzorin, @oneshadab, , @CorvetteCole + +#### Documentation Improvements: +@BoQsc, @zakkak, @dandv + +#### Translations: +@frnogueira / @victorwpbastos (pt_BR), @zeten30 (cs), @franglais125 / @calotam / @oeramirez (es), @LaurentTreguier / @SolarLiner (fr), @elsieholmes (uk), @hosiet (zh\_CN), @jonnius / @linuxr01 (de), @urbalazs / @pappfer (hu), @crayxt (kk), @pkomur / @MartinPL / @alex4401 (pl), @AlexGluck / @GoodNike / @rjapolov / @vantu5z (ru), @sicklylife-jp / @ryonakano (ja), @oltulu / @TeknoMobil / @daenney (tr), @sbadux / @kowalski7cc / @l3nn4rt (it), @OriginCode / @pan93412 (zh\_TW), @ojn (sv), @frandieguez (gl) + + +## +### License & Terms ![](media/design/png/copyleft-16.png) + +Dash to Panel is available under the terms of the GPL-v2 or later license See [`COPYING`](https://github.com/jderose9/dash-to-panel/blob/master/COPYING) for details. + +![](https://img.shields.io/badge/Language-JavaScript-yellow.svg) ![](https://img.shields.io/badge/Licence-GPL--2.0-blue.svg) diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui new file mode 100644 index 0000000..ed7ef90 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui @@ -0,0 +1,7508 @@ + + + + + + True + False + vertical + 1 + 1 + + + True + True + False + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Animation type + 0 + + + + + True + False + center + + Simple + Ripple + Plank + + + + + + + + + + True + True + False + + + True + False + 12 + 12 + 12 + 12 + 24 + 32 + + + True + False + 12 + Duration + True + 0 + end + + 0 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_duration_adjustment + 0 + 0 + right + True + + 0 + 1 + + + + + + True + False + Rotation + 0 + end + + 1 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_rotation_adjustment + 0 + 0 + right + True + + 1 + 1 + + + + + + True + False + Travel + 0 + end + + 2 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_travel_adjustment + 0 + 0 + right + True + + 2 + 1 + + + + + + True + False + Zoom + 0 + end + + 3 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_zoom_adjustment + 0 + 0 + right + True + + 3 + 1 + + + + + + True + False + Convexity + 0 + end + + 4 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_convexity_adjustment + 1 + 1 + right + True + + 4 + 1 + + + + + + True + False + Extent + 0 + end + + 5 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_extent_adjustment + 0 + 0 + right + True + + 5 + 1 + + + + + + + + + + 100 + 1 + 10 + + + 0 + 300 + 1 + 5 + + + -30 + 30 + 1 + 5 + + + 0 + 100 + 1 + 5 + + + 100 + 250 + 1 + 5 + + + 0 + 3 + 0.1 + 1 + + + 1 + 10 + 0.1 + 1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + True + Nothing yet! + True + + + + + + + + + + + True + False + 12 + 12 + 12 + 12 + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + When set to minimize, double clicking minimizes all the windows of the application. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Shift+Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Toggle single / Cycle multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Middle-Click. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Middle-Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Shift+Middle-Click. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Shift+Middle-Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + + + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + center + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Integrate <i>AppMenu</i> items + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + 100 + 80 + True + True + + + True + False + center + 12 + 12 + 12 + 12 + 32 + + + True + False + True + <i>Show Details</i> menu item + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + 10 + 1 + 5 + + + 5 + 1 + 5 + + + 50 + 9999 + 25 + 100 + + + 5 + 100 + 5 + 5 + + + True + False + 12 + 12 + vertical + 1 + 1 + + + True + False + 12 + 12 + 12 + 12 + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Highlight focused application + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 8 + + + True + False + True + Icon dominant color + 0 + + 0 + 0 + + + + + + True + True + end + center + + + + + True + False + True + Custom color + 0 + + 1 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + False + True + Highlight opacity + 0 + + 2 + 0 + + + + + + True + True + end + 5 + focus_highlight_opacity_adjustment + 5 + + 2 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Indicator size (px) + 0 + + 0 + 0 + + + + + + True + True + end + 0 + dot_size_adjustment + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Indicator color - Icon Dominant + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + vertical + + + True + False + + + True + False + True + Indicator color - Override Theme + 0 + + + + + True + True + end + center + + + + + + + True + False + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 1 window open (or ungrouped) + 0 + + 0 + 0 + + + + + + True + False + end + + + Apply to all + True + True + True + + + + + True + True + True + end + + + + 0 + 1 + + + + + + True + False + True + 2 windows open + 0 + + 1 + 0 + + + + + + True + False + True + 3 windows open + 0 + + 2 + 0 + + + + + + True + False + True + 4+ windows open + 0 + + 3 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + True + True + end + + 2 + 1 + + + + + + True + True + True + end + + 3 + 1 + + + + + + + + True + False + vertical + + + True + False + 12 + + + True + False + True + Use different for unfocused + 0 + + + + + True + True + end + center + + + + + + + True + False + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 1 window open (or ungrouped) + 0 + + 0 + 0 + + + + + + True + False + end + + + Apply to all + True + True + True + + + + + True + True + True + end + + + + 0 + 1 + + + + + + True + False + True + 2 windows open + 0 + + 1 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + False + True + 3 windows open + 0 + + 2 + 0 + + + + + + True + True + True + end + + 2 + 1 + + + + + + True + False + True + 4+ windows open + 0 + + 3 + 0 + + + + + + True + True + True + end + + 3 + 1 + + + + + + + + + + + + + + + + + + 6 + 24 + 1 + 100 + + + 1000 + 10 + 100 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 0 + group_apps_label_font_size_adjustment + True + + 0 + 1 + + + + + + True + False + True + Font size (px) of the application titles (default is 14) + True + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font weight of application titles + 0 + + 0 + 0 + + + + + + True + False + center + + inherit from theme + normal + lighter + bold + bolder + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font color of the application titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font color of the minimized application titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Maximum width (px) of the application titles (default is 160) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + group_apps_label_max_width_adjustment + True + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use a fixed width for the application titles + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Display running indicators on unfocused applications + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use the favorite icons as application launchers + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + 10 + 2000 + 10 + 100 + + + 10 + 4000 + 10 + 100 + + + 10000 + 10 + 100 + + + 1 + 9990 + 10 + 100 + + + 1 + 5000 + 10 + 100 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + True + + + True + False + True + Only hide the panel when it is obstructed by windows + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 4 + + + True + False + True + The panel hides from + 0 + + 0 + 0 + + + + + + True + False + center + + All windows + Focused windows + Maximized windows + + + 0 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Require pressure at the edge of the screen to reveal the panel + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 4 + + + True + False + True + Required pressure threshold (px) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_pressure_threshold_adjustment + True + + 0 + 1 + + + + + + True + False + True + Required pressure timeout (ms) + True + 0 + + 1 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_pressure_time_adjustment + True + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Allow the panel to be revealed while in fullscreen mode + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Only hide secondary panels (requires multi-monitors option) + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>i + + 0 + 1 + 2 + + + + + + True + False + True + Keyboard shortcut to reveal and hold the panel + 0 + + 0 + 0 + + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Hide and reveal animation duration (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_animation_time_adjustment + True + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Delay before hiding the panel (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 10 + intellihide_close_delay_adjustment + True + 10 + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Delay before enabling intellihide on start (ms) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 10 + intellihide_enable_hide_delay_adjustment + True + 10 + + 0 + 1 + + + + + + + + + + + + + + 9999 + 25 + 100 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 255 + 10 + 25 + + + 1000 + 10 + 50 + + + 50 + 500 + 10 + 50 + + + 100 + 5 + 10 + + + 50 + 1 + 5 + + + 100 + 800 + 10 + 50 + + + 9999 + 25 + 100 + + + 6 + 24 + 1 + 100 + + + 8 + 48 + 1 + 100 + + + True + True + 460 + 480 + + + True + False + True + True + natural + natural + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 0 + preview_timeout_adjustment + True + + 0 + 1 + + + + + + True + False + True + Time (ms) before showing (400 is default) + True + 0 + + 0 + 0 + + + + + + True + False + True + Animation time (ms) + 0 + + 2 + 0 + + + + + + True + True + end + 4 + 0 + preview_animation_time_adjustment + True + + 2 + 1 + + + + + + True + False + vertical + + + True + False + True + Time (ms) before hiding (100 is default) + 0 + + + + + True + True + False + 12 + 4 + + + 4 + True + False + start + 4 + Immediate on application icon click + True + + + + + + 1 + 0 + + + + + + True + True + end + center + 4 + 25 + leave_timeout_adjustment + True + 25 + + 1 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Middle click on the preview to close the window + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Window previews preferred size (px) + True + 0 + + 0 + 0 + 2 + + + + + + True + True + end + 4 + 100 + preview_size_adjustment + True + 100 + + + + + True + False + True + Window previews aspect ratio Y (height) + True + 0 + + 2 + 0 + + + + + + True + False + True + Window previews padding (px) + True + 0 + + 3 + 0 + + + + + + True + True + end + 4 + 50 + preview_padding_adjustment + True + 50 + + 3 + 1 + + + + + + True + False + end + 2 + True + + + True + False + end + center + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + + + + + + Fixed + True + True + True + end + + + + 1 + 1 + + + + + + True + False + True + Window previews aspect ratio X (width) + True + 0 + + 1 + 0 + + + + + + True + False + end + 2 + True + + + True + False + end + center + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + + + + + + Fixed + True + True + True + end + + + + 2 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use custom opacity for the previews background + True + 0 + + 0 + 0 + + + + + + True + False + True + If disabled, the previews background have the same opacity as the panel + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + True + False + 8 + + + True + True + end + center + + + + + True + True + end + center + 5 + preview_opacity_adjustment + 5 + + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Close button and header position + 0 + + + + + True + False + end + 32 + + + Bottom + True + True + False + center + center + True + + + + + + Top + True + True + False + center + center + preview_title_position_bottom_button + + + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Display window preview headers + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 32 + + + True + False + 8 + + + True + True + end + center + + + + + True + True + end + 4 + 6 + preview_custom_icon_size_adjustment + True + 6 + + + + 0 + 1 + + + + + + True + False + True + Icon size (px) of the window preview + True + 0 + + 1 + 0 + + + + + + True + False + True + If disabled, the previews icon size will be based on headerbar size + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 1 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + True + end + 4 + 6 + preview_title_font_size_adjustment + True + 6 + + 0 + 1 + + + + + + True + False + True + Font size (px) of the preview titles + True + 0 + + 0 + 0 + + + + + 2 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Font weight of the preview titles + 0 + + 0 + 0 + + + + + + True + False + end + center + + inherit from theme + normal + lighter + bold + bolder + + + 0 + 1 + + + + + 3 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Font color of the preview titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + 4 + 0 + 2 + + + + + + + + + + True + True + 6 + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable window peeking + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + When hovering over a window preview for some time, the window gets distinguished. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Enter window peeking mode timeout (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 50 + enter_peek_mode_timeout_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Time of inactivity while hovering over a window preview needed to enter the window peeking mode. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 2 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Window peeking mode opacity + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + peek_mode_opacity_adjustment + True + + 0 + 1 + + + + + + True + False + True + All windows except for the peeked one have their opacity set to the same value. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 3 + 0 + 2 + + + + + + + + + + + + + + 2000 + 10 + 50 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + 4 + 50 + scroll_icon_options_delay_adjustment + True + 50 + + 0 + 1 + 2 + + + + + + True + False + True + Delay between mouse scroll events (ms) + True + 0 + + 0 + 0 + + + + + + True + False + True + Use this value to limit the number of captured mouse scroll events. + True + 0 + + + 1 + 0 + + + + + + + + + + + + 2000 + 10 + 50 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + 4 + 50 + scroll_panel_options_delay_adjustment + True + 50 + + 0 + 1 + 2 + + + + + + True + False + True + Delay between mouse scroll events (ms) + True + 0 + + 0 + 0 + + + + + + True + False + True + Use this value to limit the number of captured mouse scroll events. + True + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show popup when changing workspace + True + 0 + + 0 + 0 + + + + + + True + False + True + This affects workspace popup when scrolling on the panel only. + True + 0 + + + 1 + 0 + + + + + + True + True + end + center + + 0 + 1 + 2 + + + + + + + + + + + + 10000 + 250 + 1000 + + + True + False + 12 + 12 + 12 + 12 + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Super + Super + Alt + + + 0 + 1 + 2 + + + + + + True + False + True + Hotkeys prefix + 0 + + 0 + 0 + + + + + + True + False + Hotkeys will either be Super+Number or Super+Alt+Num + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Never + Show temporarily + Always visible + + + 0 + 1 + 2 + + + + + + True + False + True + Number overlay + 0 + + 0 + 0 + + + + + + True + False + Temporarily show the application numbers over the icons when using the hotkeys. + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + True + 6 + 32 + + + True + True + end + shortcut_time_adjustment + + 0 + 1 + + + + + + True + False + True + Hide timeout (ms) + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>q + + 0 + 1 + 2 + + + + + + True + False + True + Shortcut to show the overlay for 2 seconds + 0 + + 0 + 0 + + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show window previews on hotkey + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + 2 + + + + + + True + False + True + Show previews when the application have multiple instances + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + end + center + + Number row + Numeric keypad + Both + + + 0 + 1 + 2 + + + + + + True + False + True + Hotkeys are activated with + 0 + + 0 + 0 + + + + + + True + False + Select which keyboard number keys are used to activate the hotkeys + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + + + + + 100 + 1 + 10 + + + True + False + vertical + 1 + 1 + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Current Show Applications icon + True + 0 + + 0 + 0 + + + + + + 32 + 32 + True + False + end + gtk-missing-image + 32 + + 0 + 1 + + + + + + 140 + True + + 1 + 1 + + + + + + True + False + True + Custom Show Applications image icon + True + 0 + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + True + 6 + 32 + + + True + True + end + 0 + show_applications_side_padding_adjustment + + 0 + 1 + + + + + + True + False + True + Show Applications icon side padding (px) + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Override escape key and return to desktop + True + 0 + + 0 + 0 + + + + + + + + + + 5000 + 10 + 100 + + + 5000 + 10 + 100 + + + 1 + 40 + 1 + 10 + + + True + False + vertical + + + True + False + none + 1 + 1 + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_width_adjustment + True + 1 + + 0 + 1 + + + + + + True + False + True + Override Show Desktop line color + 0 + + 1 + 0 + + + + + + True + False + 12 + end + + + True + True + True + end + True + + + + + True + True + end + center + + + + 1 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Reveal the desktop when hovering the Show Desktop button + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 4 + + + True + False + True + Delay before revealing the desktop (ms) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_delay_adjustment + True + 1 + + 0 + 1 + + + + + + True + False + True + Fade duration (ms) + True + 0 + + 1 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_time_adjustment + True + 1 + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + 0.33 + 1 + 0.01 + 0.1 + + + 2000 + 1 + 10 + + + 200 + 1 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + + + True + False + True + The panel background opacity is affected by + 0 + + 0 + 0 + + + + + + True + False + center + + All windows + Focused windows + Maximized windows + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 50 + trans_distance_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Change opacity when a window gets closer than (px) + True + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + + + True + False + 12 + Change opacity to (%) + True + 0 + + + + + True + True + end + 0 + trans_opacity_min_adjustment + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 50 + trans_anim_time_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Opacity change animation duration (ms) + True + 0 + + 0 + 0 + + + + + + + + + + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + True + True + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + 32 + + + True + False + True + Display the main panel on + 0 + + 0 + 0 + + + + + + True + False + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Display panels on all monitors + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Panel Intellihide + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + 2 + + + + + + True + False + True + Hide and reveal the panel according to preferences + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + + + True + False + True + Order and positions on monitor + 0 + + 0 + 0 + + + + + + True + False + center + + 0 + 1 + + + + + + Apply changes to all monitors + True + True + False + 12 + 4 + 4 + + 1 + 0 + 2 + + + + + + True + False + 6 + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 6 + 6 + 12 + 32 + + + True + True + baseline + True + panel_size_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + True + False + Panel thickness (default is 48) + 0 + + 1 + 0 + + + + + + True + False + Panel length (%) (default is 100) + 0 + + 2 + 0 + + + + + + True + True + baseline + True + panel_length_adjustment + 0 + 0 + right + True + + 2 + 1 + + + + + + True + False + center + + Start + Middle + End + + + 3 + 1 + + + + + + True + False + Anchor + 0 + + 3 + 0 + + + + + + True + False + True + Panel screen position + 0 + + 0 + 0 + + + + + + True + False + 32 + + + Bottom + True + True + False + center + center + + True + + + + + + Top + True + True + False + center + center + + position_bottom_button + + + + + + Left + True + True + False + center + center + + position_bottom_button + + + + + + Right + True + True + False + center + center + + position_bottom_button + + + + 0 + 1 + + + + + + + 1 + 0 + + + + + + + + + + 2 + 0 + 2 + + + + + + + + True + False + 6 + none + + + + + + + + + + + + + + + + True + False + Position + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 12 + 32 + + + True + False + App Icon Margin (default is 8) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + appicon_margin_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 32 + + + True + False + App Icon Padding (default is 4) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + appicon_padding_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator position + 0 + + + + + True + False + 32 + + + Bottom + True + True + False + center + True + + + + + + Top + True + True + False + center + dots_bottom_button + + + + + + Left + True + True + False + center + dots_bottom_button + + + + + + Right + True + True + False + center + dots_bottom_button + + + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator style (Focused app) + 0 + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + False + end + center + + Dots + Squares + Dashes + Segmented + Solid + Ciliora + Metro + + + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator style (Unfocused apps) + 0 + + + + + True + False + end + center + + Dots + Squares + Dashes + Segmented + Solid + Ciliora + Metro + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme background color + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + end + + + + + True + True + end + center + + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme background opacity + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 12 + 6 + + + True + False + True + Panel background opacity (%) + True + 0 + + 0 + 0 + + + + + + True + True + end + center + 0 + trans_opacity_adjustment + + 0 + 1 + + + + + + True + False + True + vertical + + + True + False + True + Dynamic background opacity + True + 0 + + + + + True + False + True + Change opacity when a window gets close to the panel + True + 40 + 0 + + + + + 1 + 0 + + + + + + True + False + end + center + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme gradient + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 12 + 6 + + + True + False + True + Gradient top color and opacity (%) + 0 + + 0 + 0 + + + + + + True + False + True + Gradient bottom color and opacity (%) + 0 + + 1 + 0 + + + + + + True + False + 6 + + + True + True + True + + + + + True + True + end + center + 0 + trans_gradient_opacity1_adjustment + + + + 0 + 1 + + + + + + True + False + 6 + + + True + True + True + + + + + True + True + end + center + 0 + trans_gradient_opacity2_adjustment + + + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Animate hovering app icons + 0 + + 2 + 0 + + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 2 + 1 + + + + + + + + + + + + + + + + + + True + False + Style + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Show favorite applications + 0 + + 0 + 0 + + + + + + True + False + True + Show running applications + 0 + + 2 + 0 + + + + + + True + True + end + center + + 2 + 1 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Show favorite applications on secondary panels + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + + 0 + 1 + 2 + + + + + + True + False + True + Show <i>AppMenu</i> button + True + 0 + + 0 + 0 + + + + + + True + False + True + Top Bar > Show App Menu must be enabled in Tweak Tool + True + True + 0 + + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + + + + + + True + False + True + Show window previews on hover + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Show tooltip on hover + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Isolate Workspaces + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Isolate monitors + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Click empty space to close overview + True + 0 + + 0 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Disable show overview on startup + True + 0 + + 0 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Ungroup applications + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + + + + + + + + + + + + + + + + + + + + + True + False + Behavior + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behaviour when clicking on the icon of a running application. + True + 0 + + + 1 + 0 + + + + + + True + False + True + Click action + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + False + center + + Cycle windows + minimize + Cycle through windows + Toggle single / Preview multiple + Toggle windows + Raise windows + Launch new instance + + + + + 0 + 1 + 2 + + + + + + + + + + + + + + + + + False + 0 + + + True + False + 12 + 12 + 12 + 12 + 16 + 6 + + + True + False + vertical + + + True + False + True + Scroll panel action + 0 + + + + + True + False + True + Behavior when mouse scrolling over the panel. + True + 0 + + + + + 0 + 0 + + + + + + True + False + vertical + + + True + False + True + Scroll icon action + 0 + + + + + True + False + True + Behavior when mouse scrolling over an application icon. + True + 0 + + + + + 1 + 0 + + + + + + True + True + True + end + center + + + True + False + emblem-system-symbolic + + + + + 0 + 1 + + + + + + True + False + center + True + + Do nothing + Switch workspace + Cycle windows + Change volume + + + 0 + 2 + + + + + + True + False + center + True + + Do nothing + Cycle windows + Same as panel + + + 1 + 2 + + + + + + True + True + True + end + center + + + True + False + emblem-system-symbolic + + + + + 1 + 1 + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl. + True + True + 0 + + + 1 + 0 + + + + + + True + False + True + Use hotkeys to activate apps + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + 2 + + + + + + + + + + + + + + + + + + + + + True + False + Action + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + True + none + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 12 + 32 + + + True + False + Tray Font Size (0 = theme default) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + tray_size_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + True + False + LeftBox Font Size (0 = theme default) + 0 + + 1 + 0 + + + + + + True + True + baseline + True + leftbox_size_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + Tray Item Padding (-1 = theme default) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + tray_padding_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + True + False + Status Icon Padding (-1 = theme default) + 0 + + 1 + 0 + + + + + + True + True + baseline + True + statusicon_padding_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + True + False + LeftBox Padding (-1 = theme default) + 0 + + 2 + 0 + + + + + + True + True + baseline + True + leftbox_padding_adjustment + 0 + 0 + right + True + + + 2 + 1 + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Animate switching applications + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Animate launching new windows + 0 + + 1 + 0 + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Keep original gnome-shell dash (overview) + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Force Activities hot corner on primary monitor + 0 + + 3 + 0 + + + + + + True + True + end + center + + 3 + 1 + + + + + + True + False + True + Activate panel menu buttons (e.g. date menu) on click only + 0 + + 2 + 0 + + + + + + True + True + end + center + + 2 + 1 + + + + + + True + False + True + Keep original gnome-shell top panel + 0 + + 1 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 20 + 32 + + + True + False + True + App icon secondary (right-click) menu + 0 + + 0 + 0 + + + + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + 0 + 1 + + + + + + + + + + + + + + + + + Advanced Options + False + True + True + start + + + + + + + + + True + False + center + Fine-Tune + + + + + + + False + 24 + 24 + 24 + 24 + True + True + vertical + 5 + + + True + False + vertical + + + True + False + <b>Dash-to-Panel</b> + True + + + + + True + False + center + + + True + False + end + version: + + + + + True + False + start + ... + + + + + + + GitHub + True + True + True + center + https://github.com/jderose9/dash-to-panel + + + + + + + False + 20 + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + 12 + True + Use the buttons below to create a settings file from your current preferences that can be imported on a different machine. + True + 0 + + + 1 + 0 + 2 + + + + + + True + False + start + Export and import settings + + 0 + 0 + 2 + + + + + + Export to file + True + True + True + + 2 + 0 + + + + + + Import from file + True + True + True + + 2 + 1 + + + + + + + + + + + + + + + + + True + True + end + <span size="small">This program comes with ABSOLUTELY NO WARRANTY. See the <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2 or later</a> for details.</span> + True + center + True + + + + + + + + + True + False + About + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js new file mode 100644 index 0000000..e79eae8 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js @@ -0,0 +1,1964 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + + +const Clutter = imports.gi.Clutter; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const Signals = imports.signals; +const Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; + +const Config = imports.misc.config; +const AppDisplay = imports.ui.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Util = imports.misc.util; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; +const Panel = Me.imports.panel; +const PanelSettings = Me.imports.panelSettings; +const Taskbar = Me.imports.taskbar; +const Progress = Me.imports.progress; +const _ = imports.gettext.domain(Utils.TRANSLATION_DOMAIN).gettext; + +//timeout names +const T1 = 'setStyleTimeout'; +const T2 = 'mouseScrollTimeout'; +const T3 = 'showDotsTimeout'; +const T4 = 'overviewWindowDragEndTimeout'; +const T5 = 'switchWorkspaceTimeout'; +const T6 = 'displayProperIndicatorTimeout'; + +//right padding defined for .overview-label in stylesheet.css +const TITLE_RIGHT_PADDING = 8; + +let LABEL_GAP = 5; +let MAX_INDICATORS = 4; +var DEFAULT_PADDING_SIZE = 4; + +let DOT_STYLE = { + DOTS: "DOTS", + SQUARES: "SQUARES", + DASHES: "DASHES", + SEGMENTED: "SEGMENTED", + CILIORA: "CILIORA", + METRO: "METRO", + SOLID: "SOLID" +} + +let DOT_POSITION = { + TOP: "TOP", + BOTTOM: "BOTTOM", + LEFT: 'LEFT', + RIGHT: 'RIGHT' +} + +let recentlyClickedAppLoopId = 0; +let recentlyClickedApp = null; +let recentlyClickedAppWindows = null; +let recentlyClickedAppIndex = 0; +let recentlyClickedAppMonitorIndex; + +let tracker = Shell.WindowTracker.get_default(); +let menuRedisplayFunc = !!(AppDisplay.AppMenu || AppDisplay.AppIconMenu).prototype._rebuildMenu ? '_rebuildMenu' : '_redisplay'; + +/** + * Extend AppIcon + * + * - Apply a css class based on the number of windows of each application (#N); + * - Draw a dot for each window of the application based on the default "dot" style which is hidden (#N); + * a class of the form "running#N" is applied to the AppWellIcon actor. + * like the original .running one. + * - add a .focused style to the focused app + * - Customize click actions. + * - Update minimization animation target + * + */ + +var taskbarAppIcon = Utils.defineClass({ + Name: 'DashToPanel.TaskbarAppIcon', + Extends: AppDisplay.AppIcon, + ParentConstrParams: [[0, 'app'], [2]], + + _init: function(appInfo, panel, iconParams, previewMenu, iconAnimator) { + this.dtpPanel = panel; + this._nWindows = 0; + this.window = appInfo.window; + this.isLauncher = appInfo.isLauncher; + this._previewMenu = previewMenu; + this.iconAnimator = iconAnimator; + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + // Fix touchscreen issues before the listener is added by the parent constructor. + this._onTouchEvent = function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) { + // Open the popup menu on long press. + this._setPopupTimeout(); + } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { + // Activate/launch the application. + this.activate(1); + this._removeMenuTimeout(); + } + // Disable dragging via touch screen as it's buggy as hell. Not perfect for tablet users, but the alternative is way worse. + // Also, EVENT_PROPAGATE launches applications twice with this solution, so this.activate(1) above must only be called if there's already a window. + return Clutter.EVENT_STOP; + }; + // Hack for missing TOUCH_END event. + this._onLeaveEvent = function(actor, event) { + this.actor.fake_release(); + if (this._menuTimeoutId != 0) this.activate(1); // Activate/launch the application if TOUCH_END didn't fire. + this._removeMenuTimeout(); + }; + + this.callParent('_init', appInfo.app, iconParams); + + Utils.wrapActor(this.icon); + Utils.wrapActor(this); + + this._dot.set_width(0); + this._isGroupApps = Me.settings.get_boolean('group-apps'); + + this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); + this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._dtpIconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), style: getIconContainerStyle(panel.checkIfVertical()) }); + + this.actor.remove_actor(this._iconContainer); + + this._dtpIconContainer.add_child(this._iconContainer); + + if (appInfo.window) { + let box = new St.BoxLayout(); + + this._windowTitle = new St.Label({ + y_align: Clutter.ActorAlign.CENTER, + x_align: Clutter.ActorAlign.START, + style_class: 'overview-label' + }); + + this._updateWindowTitle(); + this._updateWindowTitleStyle(); + + this._scaleFactorChangedId = Utils.getStageTheme().connect('changed', () => this._updateWindowTitleStyle()); + + box.add_child(this._dtpIconContainer); + box.add_child(this._windowTitle); + + this._dotsContainer.add_child(box); + } else { + this._dotsContainer.add_child(this._dtpIconContainer); + } + + this._container.add_child(this._dotsContainer); + this.actor.set_child(this._container); + + if (panel.checkIfVertical()) { + this.actor.set_width(panel.geom.w); + } + + // Monitor windows-changes instead of app state. + // Keep using the same Id and function callback (that is extended) + if(this._stateChangedId > 0) { + this.app.disconnect(this._stateChangedId); + this._stateChangedId = 0; + } + + this._onAnimateAppiconHoverChanged(); + this._setAppIconPadding(); + this._showDots(); + + this._focusWindowChangedId = global.display.connect('notify::focus-window', + Lang.bind(this, this._onFocusAppChanged)); + + this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; + this._stateChangedId = this.app.connect('windows-changed', Lang.bind(this, this.onWindowsChanged)); + + if (!this.window) { + if (Me.settings.get_boolean('isolate-monitors')) { + this._windowEnteredMonitorId = Utils.DisplayWrapper.getScreen().connect('window-entered-monitor', this.onWindowEnteredOrLeft.bind(this)); + this._windowLeftMonitorId = Utils.DisplayWrapper.getScreen().connect('window-left-monitor', this.onWindowEnteredOrLeft.bind(this)); + } + + this._titleWindowChangeId = 0; + this._minimizedWindowChangeId = 0; + } else { + this._titleWindowChangeId = this.window.connect('notify::title', + Lang.bind(this, this._updateWindowTitle)); + + this._minimizedWindowChangeId = this.window.connect('notify::minimized', + Lang.bind(this, this._updateWindowTitleStyle)); + } + + this._scrollEventId = this.actor.connect('scroll-event', this._onMouseScroll.bind(this)); + + this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', + Lang.bind(this, this._onOverviewWindowDragEnd)); + + this._switchWorkspaceId = global.window_manager.connect('switch-workspace', + Lang.bind(this, this._onSwitchWorkspace)); + + this._hoverChangeId = this.actor.connect('notify::hover', () => this._onAppIconHoverChanged()); + + this._dtpSettingsSignalIds = [ + Me.settings.connect('changed::animate-appicon-hover', Lang.bind(this, this._onAnimateAppiconHoverChanged)), + Me.settings.connect('changed::dot-position', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-size', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-focused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-unfocused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-dominant', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-override', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-1', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-2', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-3', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-4', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-different', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-1', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-2', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-3', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-4', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-dominant', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-color', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-opacity', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::group-apps-label-font-size', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-weight', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-color', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-color-minimized', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-max-width', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-use-fixed-width', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-underline-unfocused', Lang.bind(this, this._settingsChangeRefresh)) + ] + + this.forcedOverview = false; + + this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); + + this._numberOverlay(); + }, + + getDragActor: function() { + return this.app.create_icon_texture(this.dtpPanel.taskbar.iconSize); + }, + + // Used by TaskbarItemContainer to animate appIcons on hover + getCloneButton: function() { + // The source of the clone is this._container, + // using this.actor directly would break DnD style. + let clone = new Clutter.Clone({ + source: this.actor.child, + x: this.actor.child.x, y: this.actor.child.y, + width: this.actor.child.width, height: this.actor.child.height, + pivot_point: new Utils.getPoint({ x: 0.5, y: 0.5 }), + opacity: 255, + reactive: false, + x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, + }); + + // "clone" of this.actor + return new St.Button({ + child: clone, + x: this.actor.x, y: this.actor.y, + width: this.actor.width, height: this.actor.height, + reactive: false, + }); + }, + + shouldShowTooltip: function() { + if (!Me.settings.get_boolean('show-tooltip') || + (!this.isLauncher && Me.settings.get_boolean("show-window-previews") && + this.getAppIconInterestingWindows().length > 0)) { + return false; + } else { + return this.actor.hover && !this.window && + (!this._menu || !this._menu.isOpen) && + (this._previewMenu.getCurrentAppIcon() !== this); + } + }, + + _onAppIconHoverChanged: function() { + if (!Me.settings.get_boolean('show-window-previews') || + (!this.window && !this._nWindows)) { + return; + } + + if (this.actor.hover) { + this._previewMenu.requestOpen(this); + } else { + this._previewMenu.requestClose(); + } + }, + + _onDestroy: function() { + this.callParent('_onDestroy'); + this._destroyed = true; + + this._timeoutsHandler.destroy(); + + this._previewMenu.close(true); + + // Disconect global signals + // stateChangedId is already handled by parent) + + if(this._overviewWindowDragEndId) + Main.overview.disconnect(this._overviewWindowDragEndId); + + if(this._focusWindowChangedId) + global.display.disconnect(this._focusWindowChangedId); + + if(this._titleWindowChangeId) + this.window.disconnect(this._titleWindowChangeId); + + if(this._minimizedWindowChangeId) + this.window.disconnect(this._minimizedWindowChangeId); + + if (this._windowEnteredMonitorId) { + Utils.DisplayWrapper.getScreen().disconnect(this._windowEnteredMonitorId); + Utils.DisplayWrapper.getScreen().disconnect(this._windowLeftMonitorId); + } + + if(this._switchWorkspaceId) + global.window_manager.disconnect(this._switchWorkspaceId); + + if(this._scaleFactorChangedId) + Utils.getStageTheme().disconnect(this._scaleFactorChangedId); + + if (this._hoverChangeId) { + this.actor.disconnect(this._hoverChangeId); + } + + if (this._scrollEventId) { + this.actor.disconnect(this._scrollEventId); + } + + for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { + Me.settings.disconnect(this._dtpSettingsSignalIds[i]); + } + }, + + onWindowsChanged: function() { + this._updateWindows(); + this.updateIcon(); + }, + + onWindowEnteredOrLeft: function() { + if (this._checkIfFocusedApp()) { + this._updateWindows(); + this._displayProperIndicator(); + } + }, + + updateTitleStyle: function() { + this._updateWindowTitleStyle(); + }, + + // Update indicator and target for minimization animation + updateIcon: function() { + + // If (for unknown reason) the actor is not on the stage the reported size + // and position are random values, which might exceeds the integer range + // resulting in an error when assigned to the a rect. This is a more like + // a workaround to prevent flooding the system with errors. + if (this.actor.get_stage() == null) + return; + + let rect = new Meta.Rectangle(); + + [rect.x, rect.y] = this.actor.get_transformed_position(); + [rect.width, rect.height] = this.actor.get_transformed_size(); + + let windows = this.window ? [this.window] : this.getAppIconInterestingWindows(true); + windows.forEach(function(w) { + w.set_icon_geometry(rect); + }); + }, + + _onAnimateAppiconHoverChanged: function() { + if (Me.settings.get_boolean('animate-appicon-hover')) { + this._container.add_style_class_name('animate-appicon-hover'); + + // Workaround to prevent scaled icon from being ugly when it is animated on hover. + // It increases the "resolution" of the icon without changing the icon size. + this.icon.createIcon = (iconSize) => this.app.create_icon_texture(2 * iconSize); + this._iconIconBinActorAddedId = this.icon._iconBin.connect('actor-added', () => { + if (this.icon._iconBin.child.mapped) { + this.icon._iconBin.child.set_size(this.icon.iconSize, this.icon.iconSize); + } else { + let iconMappedId = this.icon._iconBin.child.connect('notify::mapped', () => { + this.icon._iconBin.child.set_size(this.icon.iconSize, this.icon.iconSize); + this.icon._iconBin.child.disconnect(iconMappedId); + }); + } + }); + if (this.icon._iconBin.child) + this.icon._createIconTexture(this.icon.iconSize); + } else { + this._container.remove_style_class_name('animate-appicon-hover'); + + if (this._iconIconBinActorAddedId) { + this.icon._iconBin.disconnect(this._iconIconBinActorAddedId); + this._iconIconBinActorAddedId = 0; + this.icon.createIcon = Lang.bind(this, this._createIcon); + } + } + }, + + _onMouseScroll: function(actor, event) { + let scrollAction = Me.settings.get_string('scroll-icon-action'); + + if (scrollAction === 'PASS_THROUGH') { + return this.dtpPanel._onPanelMouseScroll(actor, event); + } else if (scrollAction === 'NOTHING' || (!this.window && !this._nWindows)) { + return; + } + + let direction = Utils.getMouseScrollDirection(event); + + if (direction && !this._timeoutsHandler.getId(T2)) { + this._timeoutsHandler.add([T2, Me.settings.get_int('scroll-icon-delay'), () => {}]); + + let windows = this.getAppIconInterestingWindows(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + Utils.activateSiblingWindow(windows, direction, this.window); + } + }, + + _showDots: function() { + // Just update style if dots already exist + if (this._focusedDots && this._unfocusedDots) { + this._updateWindows(); + return; + } + + if (!this._isGroupApps) { + this._focusedDots = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + visible: false + }); + + let mappedId = this.actor.connect('notify::mapped', () => { + this._displayProperIndicator(); + this.actor.disconnect(mappedId); + }); + } else { + this._focusedDots = new St.DrawingArea(), + this._unfocusedDots = new St.DrawingArea(); + this._focusedDots._tweeningToSize = null, + this._unfocusedDots._tweeningToSize = null; + + this._focusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._focusedDots, Me.settings.get_string('dot-style-focused'), true); + this._displayProperIndicator(); + })); + + this._unfocusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._unfocusedDots, Me.settings.get_string('dot-style-unfocused'), false); + this._displayProperIndicator(); + })); + + this._dotsContainer.add_child(this._unfocusedDots); + + this._updateWindows(); + + this._timeoutsHandler.add([T3, 0, () => { + this._resetDots(); + this._displayProperIndicator(); + }]); + } + + this._dotsContainer.add_child(this._focusedDots); + }, + + _resetDots: function() { + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + [this._focusedDots, this._unfocusedDots].forEach(d => { + d._tweeningToSize = null; + d.set_size(-1, -1); + d.x_expand = d.y_expand = false; + + d[isHorizontalDots ? 'width' : 'height'] = 1; + d[(isHorizontalDots ? 'y' : 'x') + '_expand'] = true; + }); + }, + + _settingsChangeRefresh: function() { + if (this._isGroupApps) { + this._updateWindows(); + this._resetDots(); + this._focusedDots.queue_repaint(); + this._unfocusedDots.queue_repaint(); + } + + this._displayProperIndicator(true); + }, + + _updateWindowTitleStyle: function() { + if (this._windowTitle) { + let useFixedWidth = Me.settings.get_boolean('group-apps-use-fixed-width'); + let variableWidth = !useFixedWidth || this.dtpPanel.checkIfVertical() || this.dtpPanel.taskbar.fullScrollView; + let fontWeight = Me.settings.get_string('group-apps-label-font-weight'); + let fontScale = Me.desktopSettings.get_double('text-scaling-factor'); + let fontColor = this.window.minimized ? + Me.settings.get_string('group-apps-label-font-color-minimized') : + Me.settings.get_string('group-apps-label-font-color'); + let scaleFactor = Utils.getScaleFactor(); + let maxLabelWidth = Me.settings.get_int('group-apps-label-max-width') * scaleFactor; + + this._windowTitle[(maxLabelWidth > 0 ? 'show' : 'hide')](); + + this._windowTitle.clutter_text.natural_width = useFixedWidth ? maxLabelWidth : 0; + this._windowTitle.clutter_text.natural_width_set = useFixedWidth; + this._windowTitle.set_width(variableWidth ? -1 : maxLabelWidth + TITLE_RIGHT_PADDING * scaleFactor); + + this._windowTitle.set_style('font-size: ' + Me.settings.get_int('group-apps-label-font-size') * fontScale + 'px;' + + 'font-weight: ' + fontWeight + ';' + + (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + + 'color: ' + fontColor); + } + }, + + _updateWindowTitle: function() { + if (this._windowTitle.text != this.window.title) { + this._windowTitle.text = (this.window.title ? this.window.title : this.app.get_name()).replace(/\r?\n|\r/g, '').trim(); + + if (this._focusedDots) { + this._displayProperIndicator(); + } + } + }, + + _setIconStyle: function(isFocused) { + let inlineStyle = 'margin: 0;'; + + if(Me.settings.get_boolean('focus-highlight') && + this._checkIfFocusedApp() && !this.isLauncher && + (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { + let focusedDotStyle = Me.settings.get_string('dot-style-focused'); + let isWide = this._isWideDotStyle(focusedDotStyle); + let pos = Me.settings.get_string('dot-position'); + let highlightMargin = isWide ? Me.settings.get_int('dot-size') : 0; + + if(!this.window) { + let containerWidth = this._dtpIconContainer.get_width() / Utils.getScaleFactor();; + let backgroundSize = containerWidth + "px " + + (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; + + if (focusedDotStyle == DOT_STYLE.CILIORA || focusedDotStyle == DOT_STYLE.SEGMENTED) + highlightMargin += 1; + + if (this._nWindows > 1 && focusedDotStyle == DOT_STYLE.METRO) { + let bgSvg = '/img/highlight_stacked_bg'; + + if (pos == DOT_POSITION.LEFT || pos == DOT_POSITION.RIGHT) { + bgSvg += (this.dtpPanel.checkIfVertical() ? '_2' : '_3'); + } + + inlineStyle += "background-image: url('" + Me.path + bgSvg + ".svg');" + + "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + + "background-size: " + backgroundSize; + } + } + + let highlightColor = this._getFocusHighlightColor(); + inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, Me.settings.get_int('focus-highlight-opacity') * 0.01); + } + + if(this._dotsContainer.get_style() != inlineStyle && this._dotsContainer.mapped) { + if (!this._isGroupApps) { + //when the apps are ungrouped, set the style synchronously so the icons don't jump around on taskbar redraw + this._dotsContainer.set_style(inlineStyle); + } else if (!this._timeoutsHandler.getId(T1)) { + //graphical glitches if i dont set this on a timeout + this._timeoutsHandler.add([T1, 0, () => this._dotsContainer.set_style(inlineStyle)]); + } + } + }, + + _checkIfFocusedApp: function() { + return tracker.focus_app == this.app; + }, + + _checkIfMonitorHasFocus: function() { + return global.display.focus_window && + (!Me.settings.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. + !Me.settings.get_boolean('isolate-monitors') || + global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); + }, + + _setAppIconPadding: function() { + let padding = getIconPadding(this.dtpPanel.monitor.index); + let margin = Me.settings.get_int('appicon-margin'); + + this.actor.set_style('padding:' + (this.dtpPanel.checkIfVertical() ? margin + 'px 0' : '0 ' + margin + 'px;')); + this._iconContainer.set_style('padding: ' + padding + 'px;'); + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + + if (this._draggable) { + this._draggable.fakeRelease(); + } + + if (this.isDragged) { + return; + } + + if (!this._menu) { + this._menu = new taskbarSecondaryMenu(this, this.dtpPanel); + this._menu.connect('activate-window', Lang.bind(this, function (menu, window) { + this.activateWindow(window, Me.settings); + })); + this._menu.connect('open-state-changed', Lang.bind(this, function (menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + + this._menuManager.addMenu(this._menu); + } + + this.emit('menu-state-changed', true); + + this._previewMenu.close(true); + + this.actor.set_hover(true); + this._menu.actor.add_style_class_name('dashtopanelSecondaryMenu'); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + _onFocusAppChanged: function(windowTracker) { + this._displayProperIndicator(true); + }, + + _onOverviewWindowDragEnd: function(windowTracker) { + this._timeoutsHandler.add([T4, 0, () => this._displayProperIndicator()]); + }, + + _onSwitchWorkspace: function(windowTracker) { + if (this._isGroupApps) { + this._timeoutsHandler.add([T5, 0, () => this._displayProperIndicator(true)]); + } else { + this._displayProperIndicator(); + } + }, + + _displayProperIndicator: function (force) { + let isFocused = this._isFocusedWindow(); + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + this._setIconStyle(isFocused); + + if(!this._isGroupApps) { + if (this.window && (Me.settings.get_boolean('group-apps-underline-unfocused') || isFocused)) { + let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; + + this._focusedDots.set_size(0, 0); + this._focusedDots[isHorizontalDots ? 'height' : 'width'] = this._getRunningIndicatorSize(); + + this._focusedDots.y_align = this._focusedDots.x_align = Clutter.ActorAlign.FILL; + this._focusedDots[(isHorizontalDots ? 'y' : 'x') + '_align'] = align; + this._focusedDots.background_color = this._getRunningIndicatorColor(isFocused); + this._focusedDots.show(); + } else if (this._focusedDots.visible) { + this._focusedDots.hide(); + } + } else { + let sizeProp = isHorizontalDots ? 'width' : 'height'; + let containerSize = this._container[sizeProp]; + let focusedDotStyle = Me.settings.get_string('dot-style-focused'); + let unfocusedDotStyle = Me.settings.get_string('dot-style-unfocused'); + let focusedIsWide = this._isWideDotStyle(focusedDotStyle); + let unfocusedIsWide = this._isWideDotStyle(unfocusedDotStyle); + + let newFocusedDotsSize = 0; + let newFocusedDotsOpacity = 0; + let newUnfocusedDotsSize = 0; + let newUnfocusedDotsOpacity = 0; + + isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + this._timeoutsHandler.add([T6, 0, () => { + if (!this._destroyed) { + if(isFocused) + this.actor.add_style_class_name('focused'); + else + this.actor.remove_style_class_name('focused'); + } + }]); + + if(focusedIsWide) { + newFocusedDotsSize = (isFocused && this._nWindows > 0) ? containerSize : 0; + newFocusedDotsOpacity = 255; + } else { + newFocusedDotsSize = containerSize; + newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; + } + + if(unfocusedIsWide) { + newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? containerSize : 0; + newUnfocusedDotsOpacity = 255; + } else { + newUnfocusedDotsSize = containerSize; + newUnfocusedDotsOpacity = (!isFocused && this._nWindows > 0) ? 255 : 0; + } + + // Only animate if... + // animation is enabled in settings + // AND (going from a wide style to a narrow style indicator or vice-versa + // OR going from an open app to a closed app or vice versa) + if(Me.settings.get_boolean('animate-app-switch') && + ((focusedIsWide != unfocusedIsWide) || + (this._focusedDots[sizeProp] != newUnfocusedDotsSize || this._unfocusedDots[sizeProp] != newFocusedDotsSize))) { + this._animateDotDisplay(this._focusedDots, newFocusedDotsSize, this._unfocusedDots, newUnfocusedDotsOpacity, force, sizeProp); + this._animateDotDisplay(this._unfocusedDots, newUnfocusedDotsSize, this._focusedDots, newFocusedDotsOpacity, force, sizeProp); + } else { + this._focusedDots.opacity = newFocusedDotsOpacity; + this._unfocusedDots.opacity = newUnfocusedDotsOpacity; + this._focusedDots[sizeProp] = newFocusedDotsSize; + this._unfocusedDots[sizeProp] = newUnfocusedDotsSize; + } + } + }, + + _animateDotDisplay: function (dots, newSize, otherDots, newOtherOpacity, force, sizeProp) { + if((dots[sizeProp] != newSize && dots._tweeningToSize !== newSize) || force) { + let tweenOpts = { + time: Taskbar.DASH_ANIMATION_TIME, + transition: 'easeInOutCubic', + onComplete: Lang.bind(this, function() { + if(newOtherOpacity > 0) + otherDots.opacity = newOtherOpacity; + dots._tweeningToSize = null; + }) + }; + + if(newOtherOpacity == 0) + otherDots.opacity = newOtherOpacity; + + tweenOpts[sizeProp] = newSize; + dots._tweeningToSize = newSize; + + Utils.animate(dots, tweenOpts); + } + }, + + _isFocusedWindow: function() { + let focusedWindow = global.display.focus_window; + + while (focusedWindow) { + if (focusedWindow == this.window) { + return true; + } + + focusedWindow = focusedWindow.get_transient_for(); + } + + return false; + }, + + _isWideDotStyle: function(dotStyle) { + return dotStyle == DOT_STYLE.SEGMENTED || + dotStyle == DOT_STYLE.CILIORA || + dotStyle == DOT_STYLE.METRO || + dotStyle == DOT_STYLE.SOLID; + }, + + _isThemeProvidingIndicator: function () { + // This is an attempt to determine if the theme is providing their own + // running indicator by way of a border image on the icon, for example in + // the theme Ciliora + return (this.icon.actor.get_stage() && + this.icon.actor.get_theme_node().get_border_image()); + }, + + activate: function(button, handleAsGrouped) { + let event = Clutter.get_current_event(); + let modifiers = event ? event.get_state() : 0; + + // Only consider SHIFT and CONTROL as modifiers (exclude SUPER, CAPS-LOCK, etc.) + modifiers = modifiers & (Clutter.ModifierType.SHIFT_MASK | Clutter.ModifierType.CONTROL_MASK); + + // We don't change the CTRL-click behaviour: in such case we just chain + // up the parent method and return. + if (modifiers & Clutter.ModifierType.CONTROL_MASK) { + // Keep default behaviour: launch new window + // By calling the parent method I make it compatible + // with other extensions tweaking ctrl + click + this.callParent('activate', button); + return; + } + + // We check what type of click we have and if the modifier SHIFT is + // being used. We then define what buttonAction should be for this + // event. + let buttonAction = 0; + if (button && button == 2 ) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = Me.settings.get_string('shift-middle-click-action'); + else + buttonAction = Me.settings.get_string('middle-click-action'); + } + else if (button && button == 1) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = Me.settings.get_string('shift-click-action'); + else + buttonAction = Me.settings.get_string('click-action'); + } + + let appCount = this.getAppIconInterestingWindows().length; + let previewedAppIcon = this._previewMenu.getCurrentAppIcon(); + this._previewMenu.close(Me.settings.get_boolean('window-preview-hide-immediate-click')); + + // We check if the app is running, and that the # of windows is > 0 in + // case we use workspace isolation, + let appIsRunning = this.app.state == Shell.AppState.RUNNING && appCount > 0; + + // We customize the action only when the application is already running + if (appIsRunning && !this.isLauncher) { + if (this.window && !handleAsGrouped) { + //ungrouped applications behaviors + switch (buttonAction) { + case 'RAISE': case 'CYCLE': case 'CYCLE-MIN': case 'MINIMIZE': case 'TOGGLE-SHOWPREVIEW': case 'TOGGLE-CYCLE': + if (!Main.overview._shown && + (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && + (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { + this.window.minimize(); + } else { + Main.activateWindow(this.window); + } + + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "QUIT": + this.window.delete(global.get_current_time()); + break; + } + } else { + //grouped application behaviors + let monitor = this.dtpPanel.monitor; + let appHasFocus = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + switch (buttonAction) { + case "RAISE": + activateAllWindows(this.app, monitor); + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "MINIMIZE": + // In overview just activate the app, unless the acion is explicitely + // requested with a keyboard modifier + if (!Main.overview._shown || modifiers){ + // If we have button=2 or a modifier, allow minimization even if + // the app is not focused + if (appHasFocus || button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK) { + // minimize all windows on double click and always in the case of primary click without + // additional modifiers + let all_windows = (button == 1 && ! modifiers) || event.get_click_count() > 1; + minimizeWindow(this.app, all_windows, monitor); + } + else + activateAllWindows(this.app, monitor); + } + else + this.app.activate(); + break; + + case "CYCLE": + if (!Main.overview._shown){ + if (appHasFocus) + cycleThroughWindows(this.app, false, false, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "CYCLE-MIN": + if (!Main.overview._shown){ + if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) + cycleThroughWindows(this.app, false, true, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "TOGGLE-SHOWPREVIEW": + if (!Main.overview._shown) { + if (appCount == 1) { + if (appHasFocus) + minimizeWindow(this.app, false, monitor); + else + activateFirstWindow(this.app, monitor); + } else { + if (event.get_click_count() > 1) { + // minimize all windows if double clicked + minimizeWindow(this.app, true, monitor); + } else if (previewedAppIcon != this) { + this._previewMenu.open(this); + } + + this.emit('sync-tooltip'); + } + } + else + this.app.activate(); + break; + case "TOGGLE-CYCLE": + if (!Main.overview._shown) { + if (appCount == 1) { + if (appHasFocus) + minimizeWindow(this.app, false, monitor); + else + activateFirstWindow(this.app, monitor); + } else { + cycleThroughWindows(this.app, false, false, monitor); + } + } + else + this.app.activate(); + break; + case "QUIT": + closeAllWindows(this.app, monitor); + break; + } + } + } + else { + this._launchNewInstance(); + } + + Main.overview.hide(); + }, + + _launchNewInstance: function() { + if (this.app.can_open_new_window()) { + let appActions = this.app.get_app_info().list_actions(); + let newWindowIndex = appActions.indexOf('new-window'); + + if(Me.settings.get_boolean('animate-window-launch')) { + this.animateLaunch(); + } + + if (newWindowIndex < 0) { + this.app.open_new_window(-1); + } else { + this.app.launch_action(appActions[newWindowIndex], global.get_current_time(), -1); + } + } else { + let windows = this.window ? [this.window] : this.app.get_windows(); + + if (windows.length) { + Main.activateWindow(windows[0]); + } else { + this.app.activate(); + } + } + }, + + _updateWindows: function() { + let windows = [this.window]; + + if (!this.window) { + windows = this.getAppIconInterestingWindows(); + + this._nWindows = windows.length; + + for (let i = 1; i <= MAX_INDICATORS; i++){ + let className = 'running'+i; + if(i != this._nWindows) + this.actor.remove_style_class_name(className); + else + this.actor.add_style_class_name(className); + } + } + + this._previewMenu.update(this, windows); + }, + + _getRunningIndicatorCount: function() { + return Math.min(this._nWindows, MAX_INDICATORS); + }, + + _getRunningIndicatorSize: function() { + return Me.settings.get_int('dot-size') * Utils.getScaleFactor(); + }, + + _getRunningIndicatorColor: function(isFocused) { + let color; + const fallbackColor = new Clutter.Color({ red: 82, green: 148, blue: 226, alpha: 255 }); + + if (Me.settings.get_boolean('dot-color-dominant')) { + let dce = new Utils.DominantColorExtractor(this.app); + let palette = dce._getColorPalette(); + if (palette) { + color = Clutter.color_from_string(palette.original)[1]; + } else { // unable to determine color, fall back to theme + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + } else if(Me.settings.get_boolean('dot-color-override')) { + let dotColorSettingPrefix = 'dot-color-'; + + if(!isFocused && Me.settings.get_boolean('dot-color-unfocused-different')) + dotColorSettingPrefix = 'dot-color-unfocused-'; + + color = Clutter.color_from_string(Me.settings.get_string(dotColorSettingPrefix + (this._getRunningIndicatorCount() || 1) ))[1]; + } else { + // Re-use the style - background color, and border width and color - + // of the default dot + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + + return color; + }, + + _getFocusHighlightColor: function() { + if (Me.settings.get_boolean('focus-highlight-dominant')) { + let dce = new Utils.DominantColorExtractor(this.app); + let palette = dce._getColorPalette(); + if (palette) return palette.original; + } + return Me.settings.get_string('focus-highlight-color'); + }, + + _drawRunningIndicator: function(area, type, isFocused) { + let n = this._getRunningIndicatorCount(); + + if (!n) { + return; + } + + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + let bodyColor = this._getRunningIndicatorColor(isFocused); + let [areaWidth, areaHeight] = area.get_surface_size(); + let cr = area.get_context(); + let size = this._getRunningIndicatorSize(); + + let areaSize = areaWidth; + let startX = 0; + let startY = 0; + + if (isHorizontalDots) { + if (position == DOT_POSITION.BOTTOM) { + startY = areaHeight - size; + } + } else { + areaSize = areaHeight; + + if (position == DOT_POSITION.RIGHT) { + startX = areaWidth - size; + } + } + + if (type == DOT_STYLE.SOLID || type == DOT_STYLE.METRO) { + if (type == DOT_STYLE.SOLID || n <= 1) { + cr.translate(startX, startY); + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [areaSize, size] : [size, areaSize])); + cr.fill(); + } else { + let blackenedLength = (1 / 48) * areaSize; // need to scale with the SVG for the stacked highlight + let darkenedLength = isFocused ? (2 / 48) * areaSize : (10 / 48) * areaSize; + let blackenedColor = bodyColor.shade(.3); + let darkenedColor = bodyColor.shade(.7); + let solidDarkLength = areaSize - darkenedLength; + let solidLength = solidDarkLength - blackenedLength; + + cr.translate(startX, startY); + + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [solidLength, size] : [size, solidLength])); + cr.fill(); + Clutter.cairo_set_source_color(cr, blackenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidLength, 0, 1, size] : [0, solidLength, size, 1]); + cr.fill(); + Clutter.cairo_set_source_color(cr, darkenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidDarkLength, 0, darkenedLength, size] : [0, solidDarkLength, size, darkenedLength]); + cr.fill(); + } + } else { + let spacing = Math.ceil(areaSize / 18); // separation between the indicators + let length; + let dist; + let indicatorSize; + let translate; + let preDraw = () => {}; + let draw; + let drawDash = (i, dashLength) => { + dist = i * dashLength + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0, dashLength, size] : [0, dist, size, dashLength])); + }; + + switch (type) { + case DOT_STYLE.CILIORA: + spacing = size; + length = areaSize - (size * (n - 1)) - (spacing * (n - 1)); + translate = () => cr.translate(startX, startY); + preDraw = () => { + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [length, size] : [size, length])); + }; + draw = i => { + dist = length + (i * spacing) + ((i - 1) * size); + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DOTS: + let radius = size / 2; + + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = (2 * i + 1) * radius + i * spacing; + cr.arc.apply(cr, (isHorizontalDots ? [dist, radius] : [radius, dist]).concat([radius, 0, 2 * Math.PI])); + }; + break; + case DOT_STYLE.SQUARES: + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = i * size + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DASHES: + length = Math.floor(areaSize / 4) - spacing; + translate = () => { + indicatorSize = Math.floor((areaSize - n * length - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => drawDash(i, length); + break; + case DOT_STYLE.SEGMENTED: + length = Math.ceil((areaSize - ((n - 1) * spacing)) / n); + translate = () => cr.translate(startX, startY); + draw = i => drawDash(i, length); + break; + } + + translate(); + + Clutter.cairo_set_source_color(cr, bodyColor); + preDraw(); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + draw(i); + } + cr.fill(); + } + + cr.$dispose(); + }, + + _numberOverlay: function() { + // Add label for a Hot-Key visual aid + this._numberOverlayLabel = new St.Label({ style_class: 'badge' }); + this._numberOverlayBin = new St.Bin({ + child: this._numberOverlayLabel, y: 2 + }); + this._numberOverlayLabel.add_style_class_name('number-overlay'); + this._numberOverlayOrder = -1; + this._numberOverlayBin.hide(); + + this._dtpIconContainer.add_child(this._numberOverlayBin); + }, + + updateHotkeyNumberOverlay: function() { + this.updateNumberOverlay(this._numberOverlayBin, true); + }, + + updateNumberOverlay: function(bin, fixedSize) { + // We apply an overall scale factor that might come from a HiDPI monitor. + // Clutter dimensions are in physical pixels, but CSS measures are in logical + // pixels, so make sure to consider the scale. + // Set the font size to something smaller than the whole icon so it is + // still visible. The border radius is large to make the shape circular + let [minWidth, natWidth] = this._dtpIconContainer.get_preferred_width(-1); + let font_size = Math.round(Math.max(12, 0.3 * natWidth) / Utils.getScaleFactor()); + let size = Math.round(font_size * 1.3); + let label = bin.child; + let style = 'font-size: ' + font_size + 'px;' + + 'border-radius: ' + this.icon.iconSize + 'px;' + + 'height: ' + size +'px;'; + + if (fixedSize || label.get_text().length == 1) { + style += 'width: ' + size + 'px;'; + } else { + style += 'padding: 0 2px;'; + } + + bin.x = fixedSize ? natWidth - size - 2 : 2; + label.set_style(style); + }, + + setNumberOverlay: function(number) { + this._numberOverlayOrder = number; + this._numberOverlayLabel.set_text(number.toString()); + }, + + toggleNumberOverlay: function(activate) { + if (activate && this._numberOverlayOrder > -1) + this._numberOverlayBin.show(); + else + this._numberOverlayBin.hide(); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + this._previewMenu.close(true); + } + + return DND.DragMotionResult.CONTINUE; + }, + + // Disable all DnD methods on gnome-shell 3.34 + _onDragBegin: function() {}, + _onDragEnd: function() {}, + acceptDrop: function() { return false; }, + + getAppIconInterestingWindows: function(isolateMonitors) { + return getInterestingWindows(this.app, this.dtpPanel.monitor, isolateMonitors); + } +}); +taskbarAppIcon.prototype.scaleAndFade = taskbarAppIcon.prototype.undoScaleAndFade = () => {}; + +function minimizeWindow(app, param, monitor){ + // Param true make all app windows minimize + let windows = getInterestingWindows(app, monitor); + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + for (let i = 0; i < windows.length; i++) { + let w = windows[i]; + if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()){ + w.minimize(); + // Just minimize one window. By specification it should be the + // focused window on the current workspace. + if(!param) + break; + } + } +} + +/* + * By default only non minimized windows are activated. + * This activates all windows in the current workspace. + */ +function activateAllWindows(app, monitor){ + + // First activate first window so workspace is switched if needed, + // then activate all other app windows in the current workspace. + let windows = getInterestingWindows(app, monitor); + let w = windows[0]; + Main.activateWindow(w); + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + + if (windows.length <= 0) + return; + + for (let i = windows.length - 1; i >= 0; i--){ + if (windows[i].get_workspace().index() == activeWorkspace){ + Main.activateWindow(windows[i]); + } + } +} + +function activateFirstWindow(app, monitor){ + + let windows = getInterestingWindows(app, monitor); + Main.activateWindow(windows[0]); +} + +function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { + // Store for a little amount of time last clicked app and its windows + // since the order changes upon window interaction + let MEMORY_TIME=3000; + + let app_windows = getInterestingWindows(app, monitor); + + if(shouldMinimize) + app_windows.push("MINIMIZE"); + + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId = Mainloop.timeout_add(MEMORY_TIME, resetRecentlyClickedApp); + + // If there isn't already a list of windows for the current app, + // or the stored list is outdated, use the current windows list. + if (!recentlyClickedApp || + recentlyClickedApp.get_id() != app.get_id() || + recentlyClickedAppWindows.length != app_windows.length || + recentlyClickedAppMonitorIndex != monitor.index) { + recentlyClickedApp = app; + recentlyClickedAppWindows = app_windows; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = monitor.index; + } + + if (reversed) { + recentlyClickedAppIndex--; + if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; + } else { + recentlyClickedAppIndex++; + } + let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; + + if(recentlyClickedAppWindows[index] === "MINIMIZE") + minimizeWindow(app, true, monitor); + else + Main.activateWindow(recentlyClickedAppWindows[index]); +} + +function resetRecentlyClickedApp() { + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId=0; + recentlyClickedApp =null; + recentlyClickedAppWindows = null; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = null; + + return false; +} + +function closeAllWindows(app, monitor) { + let windows = getInterestingWindows(app, monitor); + for (let i = 0; i < windows.length; i++) + windows[i].delete(global.get_current_time()); +} + +// Filter out unnecessary windows, for instance +// nautilus desktop window. +function getInterestingWindows(app, monitor, isolateMonitors) { + let windows = app.get_windows().filter(function(w) { + return !w.skip_taskbar; + }); + + // When using workspace or monitor isolation, we filter out windows + // that are not in the current workspace or on the same monitor as the appicon + if (Me.settings.get_boolean('isolate-workspaces')) + windows = windows.filter(function(w) { + return w.get_workspace().index() == Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + }); + + if (monitor && Me.settings.get_boolean('multi-monitors') && (isolateMonitors || Me.settings.get_boolean('isolate-monitors'))) { + windows = windows.filter(function(w) { + return w.get_monitor() == monitor.index; + }); + } + + return windows; +} + +function cssHexTocssRgba(cssHex, opacity) { + var bigint = parseInt(cssHex.slice(1), 16); + var r = (bigint >> 16) & 255; + var g = (bigint >> 8) & 255; + var b = bigint & 255; + + return 'rgba(' + [r, g, b].join(',') + ',' + opacity + ')'; +} + +function getIconPadding(monitorIndex) { + let panelSize = PanelSettings.getPanelSize(Me.settings, monitorIndex); + let padding = Me.settings.get_int('appicon-padding'); + let availSize = panelSize - Taskbar.MIN_ICON_SIZE - panelSize % 2; + + if (padding * 2 > availSize) { + padding = availSize * .5; + } + + return padding; +} + +/** + * Extend AppMenu (AppIconMenu for pre gnome 41) + * + * - set popup arrow side based on taskbar orientation + * - Add close windows option based on quitfromdash extension + * (https://github.com/deuill/shell-extension-quitfromdash) + */ + +var taskbarSecondaryMenu = Utils.defineClass({ + Name: 'DashToPanel.SecondaryMenu', + Extends: (AppDisplay.AppMenu || AppDisplay.AppIconMenu), + ParentConstrParams: [[0]], + + _init: function(source, panel) { + // Damm it, there has to be a proper way of doing this... + // As I can't call the parent parent constructor (?) passing the side + // parameter, I overwite what I need later + this.callParent('_init', source); + + let side = panel.getPosition(); + // Change the initialized side where required. + this._arrowSide = side; + this._boxPointer._arrowSide = side; + this._boxPointer._userArrowSide = side; + }, + + // helper function for the quit windows abilities + _closeWindowInstance: function(metaWindow) { + metaWindow.delete(global.get_current_time()); + }, + + _dtpRedisplay: function(parentFunc) { + this.callParent(parentFunc); + + // Remove "Show Details" menu item + if(!Me.settings.get_boolean('secondarymenu-contains-showdetails')) { + let existingMenuItems = this._getMenuItems(); + for(let idx in existingMenuItems) { + if(existingMenuItems[idx].actor.label_actor.text == _("Show Details")) { + this.box.remove_child(existingMenuItems[idx].actor); + if(existingMenuItems[idx-1] instanceof PopupMenu.PopupSeparatorMenuItem) + this.box.remove_child(existingMenuItems[idx-1].actor); + break; + } + } + } + + // prepend items from the appMenu (for native gnome apps) + if(Me.settings.get_boolean('secondarymenu-contains-appmenu')) { + let appMenu = this._source.app.menu; + if(appMenu) { + let remoteMenu = new imports.ui.remoteMenu.RemoteMenu(this._source.actor, this._source.app.menu, this._source.app.action_group); + let appMenuItems = remoteMenu._getMenuItems(); + for(var i = 0, l = appMenuItems.length || 0; i < l; ++i) { + let menuItem = appMenuItems[i]; + let labelText = menuItem.actor.label_actor.text; + if(labelText == _("New Window") || labelText == _("Quit")) + continue; + + if(menuItem instanceof PopupMenu.PopupSeparatorMenuItem) + continue; + + // this ends up getting called multiple times, and bombing due to the signal id's being invalid + // on a 2nd pass. disconnect the base handler and attach our own that wraps the id's in if statements + menuItem.disconnect(menuItem._popupMenuDestroyId) + menuItem._popupMenuDestroyId = menuItem.connect('destroy', Lang.bind(this, function(menuItem) { + if(menuItem._popupMenuDestroyId) { + menuItem.disconnect(menuItem._popupMenuDestroyId); + menuItem._popupMenuDestroyId = 0; + } + if(menuItem._activateId) { + menuItem.disconnect(menuItem._activateId); + menuItem._activateId = 0; + } + if(menuItem._activeChangeId) { + menuItem.disconnect(menuItem._activeChangeId); + menuItem._activeChangeId = 0; + } + if(menuItem._sensitiveChangeId) { + menuItem.disconnect(menuItem._sensitiveChangeId); + menuItem._sensitiveChangeId = 0; + } + this.disconnect(menuItem._parentSensitiveChangeId); + if (menuItem == this._activeMenuItem) + this._activeMenuItem = null; + })); + + menuItem.actor.get_parent().remove_child(menuItem.actor); + if(menuItem instanceof PopupMenu.PopupSubMenuMenuItem) { + let newSubMenuMenuItem = new PopupMenu.PopupSubMenuMenuItem(labelText); + let appSubMenuItems = menuItem.menu._getMenuItems(); + for(let appSubMenuIdx in appSubMenuItems){ + let subMenuItem = appSubMenuItems[appSubMenuIdx]; + subMenuItem.actor.get_parent().remove_child(subMenuItem.actor); + newSubMenuMenuItem.menu.addMenuItem(subMenuItem); + } + this.addMenuItem(newSubMenuMenuItem, i); + } else + this.addMenuItem(menuItem, i); + } + + if(i > 0) { + let separator = new PopupMenu.PopupSeparatorMenuItem(); + this.addMenuItem(separator, i); + } + } + } + + // quit menu + let app = this._source.app; + let window = this._source.window; + let count = window ? 1 : getInterestingWindows(app).length; + if ( count > 0) { + this._appendSeparator(); + let quitFromTaskbarMenuText = ""; + if (count == 1) + quitFromTaskbarMenuText = _("Quit"); + else + quitFromTaskbarMenuText = _("Quit") + ' ' + count + ' ' + _("Windows"); + + this._quitfromTaskbarMenuItem = this._appendMenuItem(quitFromTaskbarMenuText); + this._quitfromTaskbarMenuItem.connect('activate', Lang.bind(this, function() { + let app = this._source.app; + let windows = window ? [window] : app.get_windows(); + for (i = 0; i < windows.length; i++) { + this._closeWindowInstance(windows[i]) + } + })); + } + } +}); +Signals.addSignalMethods(taskbarSecondaryMenu.prototype); +adjustMenuRedisplay(taskbarSecondaryMenu.prototype); + +/** + * This function is used for extendDashItemContainer + */ +function ItemShowLabel() { + if (!this._labelText) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.get_transformed_position(); + let node = this.label.get_theme_node(); + + let itemWidth = this.allocation.x2 - this.allocation.x1; + let itemHeight = this.allocation.y2 - this.allocation.y1; + + let labelWidth = this.label.get_width(); + let labelHeight = this.label.get_height(); + + let position = this._dtpPanel.getPosition(); + let labelOffset = node.get_length('-x-offset'); + + // From TaskbarItemContainer + if (this._getIconAnimationOffset) + labelOffset += this._getIconAnimationOffset(); + + let xOffset = Math.floor((itemWidth - labelWidth) / 2); + let x = stageX + xOffset + let y = stageY + (itemHeight - labelHeight) * .5; + + switch(position) { + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + break; + case St.Side.BOTTOM: + y = stageY - labelHeight - labelOffset; + break; + case St.Side.LEFT: + x = stageX + labelOffset + itemWidth; + break; + case St.Side.RIGHT: + x = stageX - labelWidth - labelOffset; + break; + } + + // keep the label inside the screen border + // Only needed for the x coordinate. + + // Leave a few pixel gap + let gap = LABEL_GAP; + let monitor = Main.layoutManager.findMonitorForActor(this); + if ( x - monitor.x < gap) + x += monitor.x - x + labelOffset; + else if ( x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth -( monitor.x + monitor.width) + gap; + + this.label.set_position(Math.round(x), Math.round(y)); + + let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; + + if (duration > 1) { + duration /= 1000; + } + + Utils.animate(this.label, { + opacity: 255, + time: duration, + transition: 'easeOutQuad', + }); +}; + +/** + * A wrapper class around the ShowAppsIcon class. + * + * - Pass settings to the constructor + * - set label position based on dash orientation (Note, I am reusing most machinery of the appIcon class) + * - implement a popupMenu based on the AppIcon code (Note, I am reusing most machinery of the appIcon class) + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this pattern where the real showAppsIcon object is encaptulated, and a reference to it will be properly wired upon + * use of this class in place of the original showAppsButton. + * + */ +var ShowAppsIconWrapper = Utils.defineClass({ + Name: 'DashToPanel.ShowAppsIconWrapper', + + _init: function(dtpPanel) { + this.realShowAppsIcon = new Dash.ShowAppsIcon(); + + Utils.wrapActor(this.realShowAppsIcon); + Utils.wrapActor(this.realShowAppsIcon.toggleButton); + + /* the variable equivalent to toggleButton has a different name in the appIcon class + (actor): duplicate reference to easily reuse appIcon methods */ + this.actor = this.realShowAppsIcon.toggleButton; + this.realShowAppsIcon.show(false); + + // Re-use appIcon methods + this._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; + this._setPopupTimeout = AppDisplay.AppIcon.prototype._setPopupTimeout; + this._onKeyboardPopupMenu = AppDisplay.AppIcon.prototype._onKeyboardPopupMenu; + + // No action on clicked (showing of the appsview is controlled elsewhere) + this._onClicked = Lang.bind(this, function(actor, button) { + this._removeMenuTimeout(); + }); + + this.actor.connect('leave-event', Lang.bind(this, this._onLeaveEvent)); + this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); + this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent)); + this.actor.connect('clicked', Lang.bind(this, this._onClicked)); + this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu)); + + this._menu = null; + this._menuManager = new PopupMenu.PopupMenuManager(this.actor); + this._menuTimeoutId = 0; + + this.realShowAppsIcon._dtpPanel = dtpPanel; + Taskbar.extendDashItemContainer(this.realShowAppsIcon); + + let customIconPath = Me.settings.get_string('show-apps-icon-file'); + + this.realShowAppsIcon.icon.createIcon = function(size) { + this._iconActor = new St.Icon({ icon_name: 'view' + (Config.PACKAGE_VERSION < '3.20' ? '' : '-app') + '-grid-symbolic', + icon_size: size, + style_class: 'show-apps-icon', + track_hover: true }); + + if (customIconPath) { + this._iconActor.gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(customIconPath) }); + } + + return this._iconActor; + }; + + this._changedShowAppsIconId = Me.settings.connect('changed::show-apps-icon-file', () => { + customIconPath = Me.settings.get_string('show-apps-icon-file'); + this.realShowAppsIcon.icon._createIconTexture(this.realShowAppsIcon.icon.iconSize); + }); + + this._changedAppIconPaddingId = Me.settings.connect('changed::appicon-padding', () => this.setShowAppsPadding()); + this._changedAppIconSidePaddingId = Me.settings.connect('changed::show-apps-icon-side-padding', () => this.setShowAppsPadding()); + + this.setShowAppsPadding(); + }, + + _onButtonPress: function(_actor, event) { + let button = event.get_button(); + if (button == 1) { + this._setPopupTimeout(); + } else if (button == 3) { + this.popupMenu(); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + }, + + _onLeaveEvent: function(_actor, _event) { + this.actor.fake_release(); + this._removeMenuTimeout(); + }, + + _onTouchEvent: function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) + this._setPopupTimeout(); + + return Clutter.EVENT_PROPAGATE; + }, + + _onMenuPoppedDown: function() { + this._menu.sourceActor = this.actor; + this.actor.sync_hover(); + this.emit('menu-state-changed', false); + }, + + setShowAppsPadding: function() { + let padding = getIconPadding(this.realShowAppsIcon._dtpPanel.monitor.index); + let sidePadding = Me.settings.get_int('show-apps-icon-side-padding'); + let isVertical = this.realShowAppsIcon._dtpPanel.checkIfVertical(); + + this.actor.set_style('padding:' + (padding + (isVertical ? sidePadding : 0)) + 'px ' + (padding + (isVertical ? 0 : sidePadding)) + 'px;'); + }, + + createMenu: function() { + if (!this._menu) { + this._menu = new MyShowAppsIconMenu(this.actor, this.realShowAppsIcon._dtpPanel); + this._menu.connect('open-state-changed', Lang.bind(this, function(menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function() { + this._menu.close(); + })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + this._menuManager.addMenu(this._menu); + } + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + this.createMenu(this.actor); + + //this.emit('menu-state-changed', true); + + this.actor.set_hover(true); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + shouldShowTooltip: function() { + return Me.settings.get_boolean('show-tooltip') && + (this.actor.hover && (!this._menu || !this._menu.isOpen)); + }, + + destroy: function() { + Me.settings.disconnect(this._changedShowAppsIconId); + Me.settings.disconnect(this._changedAppIconSidePaddingId); + Me.settings.disconnect(this._changedAppIconPaddingId); + + this.realShowAppsIcon.destroy(); + } +}); +Signals.addSignalMethods(ShowAppsIconWrapper.prototype); + +/** + * A menu for the showAppsIcon + */ +var MyShowAppsIconMenu = Utils.defineClass({ + Name: 'DashToPanel.ShowAppsIconMenu', + Extends: taskbarSecondaryMenu, + ParentConstrParams: [[0], [1]], + + _dtpRedisplay: function() { + this.removeAll(); + + // Only add menu entries for commands that exist in path + function _appendItem(obj, info) { + if (Utils.checkIfCommandExists(info.cmd[0])) { + let item = obj._appendMenuItem(_(info.title)); + + item.connect('activate', function() { + Util.spawn(info.cmd); + }); + return item; + } + + return null; + } + + function _appendList(obj, commandList, titleList) { + if (commandList.length != titleList.length) { + return; + } + + for (var entry = 0; entry < commandList.length; entry++) { + _appendItem(obj, { + title: titleList[entry], + cmd: commandList[entry].split(' ') + }); + } + } + + if (this.sourceActor != Main.layoutManager.dummyCursor) { + _appendItem(this, { + title: 'Power options', + cmd: ['gnome-control-center', 'power'] + }); + + _appendItem(this, { + title: 'Event logs', + cmd: ['gnome-logs'] + }); + + _appendItem(this, { + title: 'System', + cmd: ['gnome-control-center', 'info-overview'] + }); + + _appendItem(this, { + title: 'Device Management', + cmd: ['gnome-control-center', 'display'] + }); + + _appendItem(this, { + title: 'Disk Management', + cmd: ['gnome-disks'] + }); + + _appendList( + this, + Me.settings.get_strv('show-apps-button-context-menu-commands'), + Me.settings.get_strv('show-apps-button-context-menu-titles') + ) + + this._appendSeparator(); + } + + _appendItem(this, { + title: 'Terminal', + cmd: ['gnome-terminal'] + }); + + _appendItem(this, { + title: 'System monitor', + cmd: ['gnome-system-monitor'] + }); + + _appendItem(this, { + title: 'Files', + cmd: ['nautilus'] + }); + + _appendItem(this, { + title: 'Extensions', + cmd: ['gnome-shell-extension-prefs'] + }); + + _appendItem(this, { + title: 'Settings', + cmd: ['gnome-control-center', 'wifi'] + }); + + _appendList( + this, + Me.settings.get_strv('panel-context-menu-commands'), + Me.settings.get_strv('panel-context-menu-titles') + ) + + this._appendSeparator(); + + let lockTaskbarMenuItem = this._appendMenuItem(Me.settings.get_boolean('taskbar-locked') ? _('Unlock taskbar') : _('Lock taskbar')); + lockTaskbarMenuItem.connect('activate', () => { + Me.settings.set_boolean('taskbar-locked', !Me.settings.get_boolean('taskbar-locked')); + }); + + let settingsMenuItem = this._appendMenuItem(_('Dash to Panel Settings')); + settingsMenuItem.connect('activate', function () { + let command = ["gnome-shell-extension-prefs"]; + + if (Config.PACKAGE_VERSION > '3.36') { + command = ["gnome-extensions", "prefs"]; + } + + Util.spawn(command.concat([Me.metadata.uuid])); + }); + + if(this._source._dtpPanel) { + this._appendSeparator(); + let item = this._appendMenuItem(this._source._dtpPanel._restoreWindowList ? _('Restore Windows') : _('Show Desktop')); + item.connect('activate', Lang.bind(this._source._dtpPanel, this._source._dtpPanel._onShowDesktopButtonPress)); + } + } +}); +adjustMenuRedisplay(MyShowAppsIconMenu.prototype); + +function adjustMenuRedisplay(menuProto) { + menuProto[menuRedisplayFunc] = function() { this._dtpRedisplay(menuRedisplayFunc) }; +} + +var getIconContainerStyle = function(isVertical) { + let style = 'padding: '; + + if (Me.settings.get_boolean('group-apps')) { + style += (isVertical ? '0;' : '0 ' + DEFAULT_PADDING_SIZE + 'px;'); + } else { + style += (isVertical ? '' : '0 ') + DEFAULT_PADDING_SIZE + 'px;'; + } + + return style; +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js new file mode 100644 index 0000000..57d2f13 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js @@ -0,0 +1,89 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Config = imports.misc.config; +const ExtensionUtils = imports.misc.extensionUtils; +const Gettext = imports.gettext; +const Gio = imports.gi.Gio; + +/** + * initTranslations: + * @domain: (optional): the gettext domain to use + * + * Initialize Gettext to load translations from extensionsdir/locale. + * If @domain is not provided, it will be taken from metadata['gettext-domain'] + */ +function initTranslations(domain) { + let extension = ExtensionUtils.getCurrentExtension(); + + domain = domain || extension.metadata['gettext-domain']; + + // Check if this extension was built with "make zip-file", and thus + // has the locale files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell + let localeDir = extension.dir.get_child('locale'); + if (localeDir.query_exists(null)) + Gettext.bindtextdomain(domain, localeDir.get_path()); + else + Gettext.bindtextdomain(domain, Config.LOCALEDIR); +} + +/** + * getSettings: + * @schema: (optional): the GSettings schema id + * + * Builds and return a GSettings schema for @schema, using schema files + * in extensionsdir/schemas. If @schema is not provided, it is taken from + * metadata['settings-schema']. + */ +function getSettings(schema) { + let extension = ExtensionUtils.getCurrentExtension(); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Check if this extension was built with "make zip-file", and thus + // has the schema files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell (and therefore schemas are available + // in the standard folders) + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + else + schemaSource = GioSSS.get_default(); + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error('Schema ' + schema + ' could not be found for extension ' + + extension.metadata.uuid + '. Please check your installation.'); + + return new Gio.Settings({ + settings_schema: schemaObj + }); +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js new file mode 100644 index 0000000..7ab80f2 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js @@ -0,0 +1,149 @@ +/* + * Dash-To-Panel extension for Gnome 3 + * Copyright 2016 Jason DeRose (jderose9) and Charles Gagnon (charlesg99) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const Lang = imports.lang; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const WindowManager = imports.ui.windowManager; +const ExtensionUtils = imports.misc.extensionUtils; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Me = ExtensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const PanelManager = Me.imports.panelManager; +const Utils = Me.imports.utils; + +const UBUNTU_DOCK_UUID = 'ubuntu-dock@ubuntu.com'; + +let panelManager; +let extensionChangedHandler; +let disabledUbuntuDock; +let extensionSystem = (Main.extensionManager || imports.ui.extensionSystem); + +function init() { + this._realHasOverview = Main.sessionMode.hasOverview; + + Convenience.initTranslations(Utils.TRANSLATION_DOMAIN); + + //create an object that persists until gnome-shell is restarted, even if the extension is disabled + Me.persistentStorage = {}; +} + +function enable() { + // The Ubuntu Dock extension might get enabled after this extension + extensionChangedHandler = extensionSystem.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === UBUNTU_DOCK_UUID && extension.state === 1) { + _enable(); + } + }); + + //create a global object that can emit signals and conveniently expose functionalities to other extensions + global.dashToPanel = {}; + Signals.addSignalMethods(global.dashToPanel); + + _enable(); +} + +function _enable() { + let ubuntuDock = Main.extensionManager ? + Main.extensionManager.lookup(UBUNTU_DOCK_UUID) : //gnome-shell >= 3.33.4 + ExtensionUtils.extensions[UBUNTU_DOCK_UUID]; + + if (ubuntuDock && ubuntuDock.stateObj && ubuntuDock.stateObj.dockManager) { + // Disable Ubuntu Dock + let extensionOrder = (extensionSystem.extensionOrder || extensionSystem._extensionOrder); + + Utils.getStageTheme().get_theme().unload_stylesheet(ubuntuDock.stylesheet); + ubuntuDock.stateObj.disable(); + disabledUbuntuDock = true; + ubuntuDock.state = 2; //ExtensionState.DISABLED + extensionOrder.splice(extensionOrder.indexOf(UBUNTU_DOCK_UUID), 1); + + //reset to prevent conflicts with the ubuntu-dock + if (panelManager) { + disable(true); + } + } + + if (panelManager) return; //already initialized + + Me.settings = Convenience.getSettings('org.gnome.shell.extensions.dash-to-panel'); + Me.desktopSettings = Convenience.getSettings('org.gnome.desktop.interface'); + + Main.layoutManager.startInOverview = !Me.settings.get_boolean('hide-overview-on-startup'); + + if (Me.settings.get_boolean('hide-overview-on-startup') && Main.layoutManager._startingUp) { + Main.sessionMode.hasOverview = false; + Main.layoutManager.connect('startup-complete', () => { + Main.sessionMode.hasOverview = this._realHasOverview + }); + } + + panelManager = new PanelManager.dtpPanelManager(); + + panelManager.enable(); + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(this, function() { + if(Me.settings.get_boolean('show-appmenu')) + Main.wm._toggleAppMenu(); + else + panelManager.primaryPanel.taskbar.popupFocusedAppSecondaryMenu(); + }), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP + ); +} + +function disable(reset) { + panelManager.disable(); + Me.settings.run_dispose(); + Me.desktopSettings.run_dispose(); + + delete Me.settings; + panelManager = null; + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(Main.wm, Main.wm._toggleAppMenu), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP + ); + + if (!reset) { + extensionSystem.disconnect(extensionChangedHandler); + delete global.dashToPanel; + + // Re-enable Ubuntu Dock if it was disabled by dash to panel + if (disabledUbuntuDock && Main.sessionMode.allowExtensions) { + (extensionSystem._callExtensionEnable || extensionSystem.enableExtension).call(extensionSystem, UBUNTU_DOCK_UUID); + } + } + + Main.sessionMode.hasOverview = this._realHasOverview; +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg new file mode 100644 index 0000000..977146b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg new file mode 100644 index 0000000..47aa802 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg new file mode 100644 index 0000000..80420fd --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js new file mode 100644 index 0000000..8fb1e97 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js @@ -0,0 +1,401 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Lang = imports.lang; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +var GrabHelper = imports.ui.grabHelper; +const Layout = imports.ui.layout; +const Main = imports.ui.main; +const OverviewControls = imports.ui.overviewControls; +const PointerWatcher = imports.ui.pointerWatcher; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +//timeout intervals +const CHECK_POINTER_MS = 200; +const CHECK_GRAB_MS = 400; +const POST_ANIMATE_MS = 50; +const MIN_UPDATE_MS = 250; + +//timeout names +const T1 = 'checkGrabTimeout'; +const T2 = 'limitUpdateTimeout'; +const T3 = 'postAnimateTimeout'; +const T4 = 'panelBoxClipTimeout'; + +var SIDE_CONTROLS_ANIMATION_TIME = OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / (OverviewControls.SIDE_CONTROLS_ANIMATION_TIME > 1 ? 1000 : 1); + +var Hold = { + NONE: 0, + TEMPORARY: 1, + PERMANENT: 2 +}; + +var Intellihide = Utils.defineClass({ + Name: 'DashToPanel.Intellihide', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this._panelBox = dtpPanel.panelBox; + this._panelManager = dtpPanel.panelManager; + this._proximityManager = this._panelManager.proximityManager; + this._holdStatus = Hold.NONE; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._intellihideChangedId = Me.settings.connect('changed::intellihide', () => this._changeEnabledStatus()); + this._intellihideOnlySecondaryChangedId = Me.settings.connect('changed::intellihide-only-secondary', () => this._changeEnabledStatus()); + + this.enabled = false; + this._changeEnabledStatus(); + }, + + enable: function() { + this.enabled = true; + this._monitor = this._dtpPanel.monitor; + this._animationDestination = -1; + this._pendingUpdate = false; + this._hoveredOut = false; + this._windowOverlap = false; + this._translationProp = 'translation_' + (this._dtpPanel.checkIfVertical() ? 'x' : 'y'); + + this._panelBox.translation_y = 0; + this._panelBox.translation_x = 0; + + this._setTrackPanel(true); + this._bindGeneralSignals(); + + if (Me.settings.get_boolean('intellihide-hide-from-windows')) { + this._proximityWatchId = this._proximityManager.createWatch( + this._panelBox.get_parent(), + Proximity.Mode[Me.settings.get_string('intellihide-behaviour')], + 0, 0, + overlap => { + this._windowOverlap = overlap; + this._queueUpdatePanelPosition(); + } + ); + } + + this._setRevealMechanism(); + this._queueUpdatePanelPosition(); + }, + + disable: function(reset) { + if (this._proximityWatchId) { + this._proximityManager.removeWatch(this._proximityWatchId); + } + + this._setTrackPanel(false); + + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + + this._removeRevealMechanism(); + + this._revealPanel(!reset); + + this.enabled = false; + }, + + destroy: function() { + Me.settings.disconnect(this._intellihideChangedId); + Me.settings.disconnect(this._intellihideOnlySecondaryChangedId); + + if (this.enabled) { + this.disable(); + } + }, + + toggle: function() { + this[this._holdStatus & Hold.PERMANENT ? 'release' : 'revealAndHold'](Hold.PERMANENT); + }, + + revealAndHold: function(holdStatus) { + if (this.enabled && !this._holdStatus) { + this._revealPanel(); + } + + this._holdStatus |= holdStatus; + }, + + release: function(holdStatus) { + this._holdStatus -= holdStatus; + + if (this.enabled && !this._holdStatus) { + this._queueUpdatePanelPosition(); + } + }, + + reset: function() { + this.disable(true); + this.enable(); + }, + + _changeEnabledStatus: function() { + let intellihide = Me.settings.get_boolean('intellihide'); + let onlySecondary = Me.settings.get_boolean('intellihide-only-secondary'); + let enabled = intellihide && !(this._dtpPanel.isPrimary && onlySecondary); + + if (this.enabled !== enabled) { + this[enabled ? 'enable' : 'disable'](); + } + }, + + _bindGeneralSignals: function() { + this._signalsHandler.add( + [ + this._dtpPanel.taskbar, + 'menu-closed', + () => this._panelBox.sync_hover() + ], + [ + Me.settings, + [ + 'changed::intellihide-use-pressure', + 'changed::intellihide-hide-from-windows', + 'changed::intellihide-behaviour', + 'changed::intellihide-pressure-threshold', + 'changed::intellihide-pressure-time' + ], + () => this.reset() + ], + [ + this._panelBox, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._dtpPanel.taskbar.previewMenu, + 'open-state-changed', + () => this._queueUpdatePanelPosition() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._queueUpdatePanelPosition() + ] + ); + }, + + _onHoverChanged: function() { + this._hoveredOut = !this._panelBox.hover; + this._queueUpdatePanelPosition(); + }, + + _setTrackPanel: function(enable) { + let trackedIndex = Main.layoutManager._findActor(this._panelBox); + let actorData = Main.layoutManager._trackedActors[trackedIndex] + + actorData.affectsStruts = !enable; + actorData.trackFullscreen = !enable; + + this._panelBox.track_hover = enable; + this._panelBox.reactive = enable; + this._panelBox.visible = enable ? enable : this._panelBox.visible; + + Main.layoutManager._queueUpdateRegions(); + }, + + _setRevealMechanism: function() { + if (global.display.supports_extended_barriers() && Me.settings.get_boolean('intellihide-use-pressure')) { + this._edgeBarrier = this._createBarrier(); + this._pressureBarrier = new Layout.PressureBarrier( + Me.settings.get_int('intellihide-pressure-threshold'), + Me.settings.get_int('intellihide-pressure-time'), + Shell.ActionMode.NORMAL + ); + this._pressureBarrier.addBarrier(this._edgeBarrier); + this._signalsHandler.add([this._pressureBarrier, 'trigger', () => this._queueUpdatePanelPosition(true)]); + } else { + this._pointerWatch = PointerWatcher.getPointerWatcher() + .addWatch(CHECK_POINTER_MS, (x, y) => this._checkMousePointer(x, y)); + } + }, + + _removeRevealMechanism: function() { + if (this._pointerWatch) { + PointerWatcher.getPointerWatcher()._removeWatch(this._pointerWatch); + } + + if (this._pressureBarrier) { + this._pressureBarrier.destroy(); + this._edgeBarrier.destroy(); + } + }, + + _createBarrier: function() { + let position = this._dtpPanel.geom.position; + let opts = { display: global.display }; + + if (this._dtpPanel.checkIfVertical()) { + opts.y1 = this._monitor.y; + opts.y2 = this._monitor.y + this._monitor.height; + opts.x1 = opts.x2 = this._monitor.x; + } else { + opts.x1 = this._monitor.x; + opts.x2 = this._monitor.x + this._monitor.width; + opts.y1 = opts.y2 = this._monitor.y; + } + + if (position == St.Side.TOP) { + opts.directions = Meta.BarrierDirection.POSITIVE_Y; + } else if (position == St.Side.BOTTOM) { + opts.y1 = opts.y2 = opts.y1 + this._monitor.height; + opts.directions = Meta.BarrierDirection.NEGATIVE_Y; + } else if (position == St.Side.LEFT) { + opts.directions = Meta.BarrierDirection.POSITIVE_X; + } else { + opts.x1 = opts.x2 = opts.x1 + this._monitor.width; + opts.directions = Meta.BarrierDirection.NEGATIVE_X; + } + + return new Meta.Barrier(opts); + }, + + _checkMousePointer: function(x, y) { + let position = this._dtpPanel.geom.position; + + if (!this._panelBox.hover && !Main.overview.visible && + ((position == St.Side.TOP && y <= this._monitor.y + 1) || + (position == St.Side.BOTTOM && y >= this._monitor.y + this._monitor.height - 1) || + (position == St.Side.LEFT && x <= this._monitor.x + 1) || + (position == St.Side.RIGHT && x >= this._monitor.x + this._monitor.width - 1)) && + ((x >= this._monitor.x && x < this._monitor.x + this._monitor.width) && + (y >= this._monitor.y && y < this._monitor.y + this._monitor.height))) { + this._queueUpdatePanelPosition(true); + } + }, + + _queueUpdatePanelPosition: function(fromRevealMechanism) { + if (!fromRevealMechanism && this._timeoutsHandler.getId(T2) && !Main.overview.visible) { + //unless this is a mouse interaction or entering/leaving the overview, limit the number + //of updates, but remember to update again when the limit timeout is reached + this._pendingUpdate = true; + } else if (!this._holdStatus) { + this._checkIfShouldBeVisible(fromRevealMechanism) ? this._revealPanel() : this._hidePanel(); + this._timeoutsHandler.add([T2, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + } + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdatePanelPosition(); + } + }, + + _checkIfShouldBeVisible: function(fromRevealMechanism) { + if (Main.overview.visibleTarget || this._dtpPanel.taskbar.previewMenu.opened || + this._panelBox.get_hover() || this._checkIfGrab()) { + return true; + } + + if (fromRevealMechanism) { + let mouseBtnIsPressed = global.get_pointer()[2] & Clutter.ModifierType.BUTTON1_MASK; + + //the user is trying to reveal the panel + if (this._monitor.inFullscreen && !mouseBtnIsPressed) { + return Me.settings.get_boolean('intellihide-show-in-fullscreen'); + } + + return !mouseBtnIsPressed; + } + + if (!Me.settings.get_boolean('intellihide-hide-from-windows')) { + return this._panelBox.hover; + } + + return !this._windowOverlap; + }, + + _checkIfGrab: function() { + if (GrabHelper._grabHelperStack.some(gh => gh._owner == this._dtpPanel.panel.actor)) { + //there currently is a grab on a child of the panel, check again soon to catch its release + this._timeoutsHandler.add([T1, CHECK_GRAB_MS, () => this._queueUpdatePanelPosition()]); + + return true; + } + }, + + _revealPanel: function(immediate) { + if (!this._panelBox.visible) { + this._panelBox.visible = true; + this._dtpPanel.taskbar._shownInitially = false; + } + + this._animatePanel(0, immediate); + }, + + _hidePanel: function(immediate) { + let position = this._dtpPanel.geom.position; + let size = this._panelBox[position == St.Side.LEFT || position == St.Side.RIGHT ? 'width' : 'height']; + let coefficient = position == St.Side.TOP || position == St.Side.LEFT ? -1 : 1; + + this._animatePanel(size * coefficient, immediate); + }, + + _animatePanel: function(destination, immediate) { + let animating = Utils.isAnimating(this._panelBox, this._translationProp); + + if (!((animating && destination === this._animationDestination) || + (!animating && destination === this._panelBox[this._translationProp]))) { + //the panel isn't already at, or animating to the asked destination + if (animating) { + Utils.stopAnimations(this._panelBox); + } + + this._animationDestination = destination; + + if (immediate) { + this._panelBox[this._translationProp] = destination; + this._panelBox.visible = !destination; + } else { + let tweenOpts = { + //when entering/leaving the overview, use its animation time instead of the one from the settings + time: Main.overview.visible ? + SIDE_CONTROLS_ANIMATION_TIME : + Me.settings.get_int('intellihide-animation-time') * 0.001, + //only delay the animation when hiding the panel after the user hovered out + delay: destination != 0 && this._hoveredOut ? Me.settings.get_int('intellihide-close-delay') * 0.001 : 0, + transition: 'easeOutQuad', + onComplete: () => { + this._panelBox.visible = !destination; + Main.layoutManager._queueUpdateRegions(); + this._timeoutsHandler.add([T3, POST_ANIMATE_MS, () => this._queueUpdatePanelPosition()]); + } + }; + + tweenOpts[this._translationProp] = destination; + Utils.animate(this._panelBox, tweenOpts); + } + } + + this._hoveredOut = false; + }, +}); \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..8425f68f480807a0f85b51fb2a7812ad4271e863 GIT binary patch literal 23608 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..86da0901734cccffb3c9738613df62e63e2ac9d7 GIT binary patch literal 23744 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..7a5af2f7f27f2c1482a9cf432d36a09b553e7585 GIT binary patch literal 24908 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..70da5fa6ab1ea329c3990f04d36aa469bbbe7059 GIT binary patch literal 25001 zcmbW937i~PednLS7cxGv4K_9|3vA6q>NzCYmSsuyXmnUcmo<_P9E?ldH8XAXbhoRj zHIhldA=q3AN5W+wz$QQ>Fo{_poC|~@%aJAQLd>zt8d$<%ju0*rNJ94edq;KkOpmbX zk6!<}s@{9`-v9mY_eKw%b^NOgpXfMaE&wlhoH2Ln_gT7Y%*d0B;nIwHTm`D$W#D7L zJs$UYyvgG&9&hy+d#rh!@_4()8Bp(OgQtP1zyAjwpYNZ)z(0SHzkV%vI`v=Yuip-8 zT=)6wzxMbpkMH*QUhqQdy$}36_yG7B@W^?_oB(F$8*?If7+ee91)d3h2s{J)EJzdc zAb1M+3vd_s*e4rv1vmkUgf9U#pErURgYN|O-p_$g0e=WS0en0})pZ131YQkZ0zL~= z{ky@(gMR^@4Bij&O7j6Q0{;=zdw&jAzzU7lgSUXkgZF}(&l|xd;9Ei44|opO9{^W_ zp95Ed$1|8y!7D&m!fXal0(XHL$BkeF)`~i3=cy{FIdljhhT?g_ivj^0C?f_X* z^EOcTKL%?4Ujs##?}4J@kH9B_OIV~TxD?bl?*a9mH-PGY4pjZW2gP^a2DQEqgIezs z7^KGiBv5>`6jZ$d@M+*0a0q-R7=eETt^wcapMM*qD{~6O6jngh-vx>;&jH03cY{^4};>#u>L!%soAKM~>$f=>k1?-;20B%s>A5=RpvHYasD3{NYTlm))!&yvt<$%_ zlfWN=>gN}r_~So7)jN5>wL1sY{ipfsVel%hH-MLccY+Mn+z*N#UjjAnhyDGC3%WF0 zK|ODQn#W5)t;?H1MAv)>6yJRrRK0%&PX7RcUR6h@a;hBex`12j0=>1_({e2#k-2506Kb#Iz zodli(ik=sOqTev6_E&?afxAJC_gSFYz0l)J!Be!0&?}27dq^K}a5r>^sM6O^3Y1B!3{78KwAPf+~&4N&sF1m!J0ybOFIcoVo0Ys41f{n-IU&*y-W$LE1s_m_g_ zfv*PD?tYMe=7)UgeU)q6{H_L7e=n$c{Vu5S9RMYN_kxI$nFG%S9|kp^Q~6p3?gG{S zEchhwJ)r7+7S#Cv3Dh`Fh6tkjQc&+31YvD63W|Qyp!Di1K&EKk2ddq};K|?_<8B=1 zfqK3jycm25I10WKlpK5w)O&sio)7*EyZ}6XlQA>k3Q+f72O{F;y`cJk2)qdV38;CT zwb|ivP<*fn)Oz0xo&eqsYJ6=_bb2w!P|bTlRGaw)2n(5kEl%Inz$>|aIjHx31{6R2 z8axraa;xK?Ye4D81K_3LYe3QeBjA(4AA?T;PrcTSZv_}}y%`kWPJ&wJJ3-C!gW%J_ z2SCm5;%yGcK+Q7-#kY5YTKBhtde0X?jq^vK+CB9;$Cu-v^h*q)LQD?+4tO7k>M&md zMej3sspeGyPXSkhn(sBB-t%lQ0*`{?$IpP0_pgG8hWQD20yu(EVCd#@Q1g2(sP*_$ z@Fehvzkfd{{`~}~e!c*T4<7(0=A&)-?pUm~}@49+V2i4ylpyvN7 z@af=NK=IwbfSSjeXF57>0mr$14mbjS99#|l6nqmnaI2&5r$CyTe*-TDZ+e!a^PM17 z&GW$9z^{Yi+c7RK0&fF{!Mi-(4{H8j_t&Szj{i1*TEA;S(SH}Hao*yw4xYvJEckfv z#h}*tHK6$SP2h3hWAw%6A0625d-(n!<=K>9QBL%A-okJ3tUhZUm=}Od!Muc0qdbMW zcY&{<==1v&(f{p~ODXz@uHT@nqx=I!pHEOeNfAx!l<+yij~`Mlpx>{7XMvIr#Kt^^ z@>q)a^9hu5C{LtF-bEYD_hgFZyM!V-i58-h)>`ZQQHnl)MiD>#Aw~Qu+Fe2U4&_eD zB;{WyM=9T>9M3pj58h6BF6F;d-c9)k<<*q%IhT6(`isrryD0CY{57RY`8nmkQ0}Ja zbI5`9<-f@9U;FD*>E~1YKF?pD?@_$`N0bZv^?!g*qFhe-Pk-nvU^ts66XZd}Y@-XF%ls}+|pHJd>8`S4y zUw0Y5|CF+Uay{iB*dWew%~l=o8pigGqZ zpWky}p2&Otp5Nc2+~My%2fUDSgTEHMmGV={8I%`N^m&{graEj{`d1dJ_K&3?4Z2N-xJ(V*++>eXZm-%gWvib$Mw^|FWU>Jqp#)n@swH0e%k-6mG@7k9YpvO+)lQnxKr4+p&8f82X(zQoGfEArtTdym%;;(}dYKu$+>BmfM%NgE z;FV^jZ=BiIX61-kIf~g>)q8ujS-rgX&SmDZ5!BWdu-uhqU46sEGy~X_&_po{6fhnIxn4d^#H2II(N{ zzP+2b-yH4S72P}FiEp| zs~N3~AYmiUlXTs1ydj$8s^%s(v~E~)+2E%%o7AVK^Yu&j^TMS}qtQy&FMaC9)hjoy z8d6!v&ZeWh7443jNh3;=MiMjXXhxky%~l@mPq=%q zp3Ek-=x~xpj43&kGdD(;FhkH%rww4T?QiEClTY6s(H zl{xHctMjaTW4e_eNDhnT{DVd#aF-eD{$|$Iq@CLp(CW97^ion%P;!I`$XofB0YeUrFBXS37wMiSMV(PXF5$f{|A2+g!= z3GGtobU5m?)vKn>t=X7SAFOBf{S7Xg^%+qkaQ|4l4LM>vC5Zs<_B9%Dr&*n@H>aXz zGTWW0f11Ji?rB`=!8aB|=5?ksFp~`$UJ-4pa%)GNPSu-B25QM<+-c+y;E^%y^kiQ>y!ENMJmirTjF;R7FMFwXozAh#4r>wN)yO3&^}bW=U}VRnMvp% zK`5K8Sued|os2@*S~LxxGoN-VLwr#JJ0iQKMF>6Xxc>Bb#_^3^ntsonQd-dda1{y8r?Gfb(}i%2 z+q=#%W~S#VTF#r0Jzi;gb@4=!=PZ3@Zzlq;?98U55g%qu7=t8AnlY9G7OBGsaOrft zhI&V;@;J?%p!U?~xoQ_n+@}iq9(@#Q)spN$-fH*O%V(W#>WW81qb5vbRl_FV#w%ZM zip{2a*4EH1?a;UgQdyeAsZpJg1;Qev+fIJqM(QEVKQPA$eRBRUQlV}3(CS5)-Qn_+4 zinA!2Zl!s(11+SO;B#xlkl<`6+LlLE>5oQcHNTxs-a`7OVS4LzSfyk|VLVS8L&m=& zOaiN;5pT9q-+R-V3ag(nqHY~Fr)eu)8=1|A+KkEeTA#5$F;I@X{G<8T41E$~WVRrV zQLU3&OX51+Qg0@ey`3fx>xWP`Tl}&F{@&6;Uahp@W>`imX)nf?H{j-lm4X=btncF0 z!*Z7UlUrw%(BdzS%2sL=Gh_#{pkcq>ork5a7n@JFh7~W*aK#AIY7)t}Ip{nS91qBp z;{S=g+bISd8|ZDD*;>!9?d&&O)3{cb0^D!)y{D@*Wnf0>_M(;q)scRFm20IJbkj*U zKjkpUqW7-u{CZtQ5my; zWK^qXlHZzjiZvs-xp<6S1rR(t=fnkyBjW{C%(j`Cq*j-1mOASiC}&@+`Jj%Kxyck$ zWu?mBD1>fX&~$$BD$cRm)26+YL~lcWua>$rTx4>ka(WYd@){8D0x0r^NG z(p*5v63l_y6Ae<>td%JaBt>;>AV&dRGvpt#2?U(g}bhWW{ zD6(=rfkId^FcPg-7x=B-Lmjl$Rcm+fO)H~)Dz$K3@;E!NKTgf|7VaOx$&UDtwbo)! z1-hBL)0yGAM${-D=#i?Q%SQ&yjwDZ8#yO!y2;*iP^hYarW|%nlQeWSBwZWI#;r)oB zj`NZuv%~*zz9N@MSukNcSgwd^G`Y>MPTTCnkf(glMmO3Cnw`!{D*C(F1QDYSmONah z_;)->QtT(eR6DMjUBqD#&Iayt;op0^KaeJObn2KXsT@pc!r)|D_af-sLa>so8n+Wo$E(e}lj5Ee zemUpH6g8d4;W(_MJe(f>jn#q(sy5Z39Nhv=>@`$FX=R^jb~q%Ir zg?s43%RmFOo5gF%-)h)+OJ2K@4V|{4&CKi$4*BkRcIx_0JvV#eI*~&Vh&^t3rBSo2 zBb81t4DTj2TypOc_}6!Zy;y1Eo3lQlJ^plpSA{095k{X1W#hAl1c!~jJy9}xbl&jR zox65yCRl)k;hwzQ((R$4A^Suk;@DrU@^d#PbeFK0kb@7CTwKu zOqGww{4M)DXqJgWf@MRB6v{+0Me+qPG!x{Fs`!`34#a#d>Z)0HivB*?kLtAK%^8HI zGv-`pQOt69U%BuP?1K2@jd7uTPiVO?x-X{V9drpZY~>O%T1>?zV)~U{XJz!uV{$5G z^XXUDKH`2iB3<->OLIsUq8Y6RW%+nv4?!#2Cq9UBW9W^j2x6>v)$L~9^R6xGZ9eY> zHbd%aOvVQ>>eznxshH9+9?9LAui0JocB@UE$|W|GiI9lQ28Y5|3BH!CCDAXv)#cNy zX=uaf!Or`|2*F{gfq#NmgPRqnbrOJ-Y)UFGEt&&SV*?7O#skWTD!e$Smx(ydeqvqs{oz!QNRr^N5 zW--c){IB3`4axoOz2#D^%0aqZf%DY~9h6^{hvvrS^jjYbNyB(@5^ZL^3p)>2SH4UZ z$%p4=Q40zL)<&TfjE{K>DML4G*N2kRdcT@06`VzfTOIL`GqZMrMY^2$BxM|!V;eYV z@-8UEKelGOm8!Flj|~YS#;Mg97#$fA6$+PkK}AT5EKqZGzna)-9DEn8;$+#(bYbx< z6BNlqA35QbCp9M$vI>q%g0#83g-uZ~=GN2{k}a+QhNIoy(+x5oD!9fOmu;13W1L1C zA}hsXB%iG@njr(I2+-!icsm)Oy|YPtAli%co4qM2{n(*^t+Gu5aZD-P*NhLcpJWq0 zmg&opPZ7_E;&NLcfLYMOYO;nB{dPf%g)VKQ(8%tVmGxm3Zql$UkwKU5Yc|S(%0BC{ z83$3;sS?FyY$&XV(57teL=6|o4A+~-sKgv>0Q->uGJAhoAtFGXz*a{Gp}GIGd-y_`%s-aBTS!(-D)9rV(Ua^ z4Qu66UN!`GOMvvHjLxN)8BR!PFg$!#W$NH8mobC*3h)uiFu0jm8zt=OXo`AuVM3j1 z#LFtv!|l7Ut>^2*DRx&#Q)v)VIv?44JxCwX2N4IaooS)T{3e9YvJROW{Qlr2WLz)F z2E}&;f0`TorqGR2&c8uuMdFN2JexRlnGi3tc29sDiSmS(nsN#i9sc>g83(5DSE?S`6d%!XHBmExIK5P{`Gli)_gSzG?6%~D1; zMFUpR56)}NXv)=Yjs~0;wXj}~mp1=hj!m>M-BgRKlNoKk+Ao|9yF=+sZoTK~4pVQE zw_?SEVkd)R(`7Vkwo)zWTxDCW;un1_xo~pTjDTHhJzKH|gOKKx z9oba9R@vB@$|`$XYojH*cUAU~)KW(kZ6BR_zhrxy zgfTlvDOuWRYmAm_M(YTvbvK9JCD(!ktO4#i&2-Ay@%TjP?mp~O@ey! zD((8E@Y?!)d$&~9bn9uH2x?_>vr53)oLU>L*+*EOU>2?BJ^I|s9s-abv^Pb%e zve=Ev7U-L;jhbzHnXO-W6?#!m)(E~A52E%65#CX?pe+jHegI;;jNWB^-Tn>%V1 z^xV z&;Q7eKTM|n1jKe7cOWa?*6D{kI!QD&ceFWol-0o3*}1Rh7(^!`S;Vt?f>zXNfk$)x zVWM@IQL{aq%^h74VG+Xt3l_#6g&-v$8YWTiCR}rwHZ$5uC$BhOXrt8`vhoAad+w-I zJex%a;Rkkppjkhw{@Wgo*i48;ScXHam9Qry=I+ue;{NrVlJG1*Sgi%?D7tSZaR-yv z@xeA1QqOD~cQ`;1wjt(@W~9yRApx0>W>wQ5n?t6*lUAKg(M`Ev9nwIS(F*SDdvgWa zKa1wx%ox~ls*0|RcLNC-OhA0T4C>*2`D#TkV?kM zo*r^XCoG8>9_(tf7rd+~nYMh>C5cX1xT-D<>FO>k^=USBAO}LVth)tcH%)bn0?9m- zbFc+3ZCSlK_a07{P_G-2FByP9jx-{$B$G22xs_+~ey$64f`7{{*blS1#RvApA8sh6 z5kv#xqo|g)>bX6{VFlNzpzf5NEaZ4DmSx<6xbqs4^Hht%)7*@=?B0l_Y0rh&*uH6| z)nNT`v&vP8wcwr|@$JjUHJbi)I09v*K}2FNGb|ev%xDdlN?zH=EW2sFZ+S#Lh{2t_ z^>1uvp;wibblzJnU%?bZY)nWCbq<-0ab}*O(?w`VxZj@cfN%VX40Yz*X_y~cb`N;; zJkj{?=q%IQ0*gkO_$h5+H%gkKU$^}l%Whb!;CqnHwn?aQd*(!J5c!iIH%M1c)>&(9 z%VXl%dn*osXd4tYmKg%IPMS5S7Vd&AYt=SHn)Gu}pD?8~dYTtiC-sSwh-T zdydc9hk3MbDl?!?n&8lj+n8ur^h~-?GBE$PJ&V$(J}D-ct)^WX_6s-|Id=pm%zCY( zqU$;*C$4R!#FU(0nLCQ(W(^7I-O`Dp51v*tF`Q`6>qF`vju>Ld6%l6Z`orKV0TikXEXPC3QlC-QBq(X;Q%#<|t%n-d*b6H}=#Z^7e|G zC_Ol_HN0lAnYYD5?C?eSQk*r6?IO33Q8@!TzlcteC~_(v17x@l8TQz} zO|}pPWYvcA)s6C)tn#uLlL4c7W|YVVRyUAz7G_(VNysjkQ+$S!q#^zH9d#o(gclT#Y5+4(Cl0MQo#&(I%zT^-D#IU=p+O} z@sU$vc9rc^yQ;6yUca$snP@uht0QRg%{ZRs6=2^kdVM)J`n{yZ;7geSDfDBHkn=ar zWmy~P^v$Ae%PymRO=jj^)MlFzmsUrhEi03eCwTac@9b&WZ-D(~MVwf*E6tG%TuN~e zCq|G|%Y2d%FTBf~bJLZ_aC9dS5_T#~HFjF#-A@z&gx%eO=6$M8%e^bt4eq0qMmWP` z*`P3SR*wahF+5J1%1tDA&l#z)rd5ri@+5XzL724>UHuJ-tFEQ(ZlaT-vvpPp#olE& zOP7OE4nc1aboi?Bx2!)?QUUNiQY~o|{SYD28?sD?%8Ft^qa;Hs*a0_b1zb~AGrw0(zOwEve|7jSa>X!o8`iJ znXrbM#YGeMxhth>u8U!VjN?x(%J05#kK88b%pjd&fIPa`ZOxVI$zyAGbImlu+*^2tdZ@* zMSpb;N)ookoeFv;Q-Y{BAS|2|sgS~?h(EjWyu>i5cxw+hMb#Ul(XHD1)JsYE6!DVf zW;|mXd8*N}W43hZAbmg^wpW>A*qF z(lR?CaFLkpDy#tqg3w1Wjn&ak&aII_0OexzKF}W%?a_WCaTeORCFi*8TEM zWO3g`^yO#a1efb<-s}n;FUfZ?V@UD9btEoCZ~YA#{?XFlLCFTV5OAs4q_mgQ@-_oj z3X8=3C0p&MDEm}e&0|!u$2=T$`*#x!j4g1yIM8KJgV{xS1kDtD+BHd_ISDlaw64;y zan)~;+3=bg(#e1=nrSP&DCC@J0s|{gZT|#Jfv7)J2Gu5Hj;#@p+o>Fu&xn>526wzm z6HevyG{H!e^s!Y=4cJL;X>Ud3$fj|fazb$zS{WZ-u4jlnkrk`=9SNQAbiLa^zmS#; z*DOxB70hAD3vnG50Y1q|{W(c7aQ=*z&^<5Cq$Olgi^_1ZW7e*ZR;GtedxzXwsnI;5 z6-na+^}C1w^fp;qcKrMZ7Vp3GBq;T3v9C6cE2OPl$qAdwD;6$ES1=c=T4Jh&V+u)} zQe!MupN!7DR7}{@@1go)b-bSJZ@Ej$)}trpnOWy2OAiD$xo5~6NlxefQfYN-+$FyA zMg!+$b4O}QpD0tS?Xt3lpVwRWtY3GBvZ%tL7@ep?EUnNK_w~;G{D~?+h{gGgAv+xL zj#Hzhx!U3RF)PjqZkwBd(|1n1oSCo@QXx~1qNC#76FR6zWQ5ru(leW9+I7TUTSRj9 z!X+`8_tQ&vyiN~yXktAgP> z3g-fJl14X%Q!N=Mxp?ic`?C{%YLl%>L^0nBmU-ft#0q09 ze;6g2a5|(AEV{9dicg(D|Au(`_8~{%J zQSY``y+a!x;S)olgZgQpZTuZU*5=QCbS#T)7ZUmW2mul=E+8nzx zSI&`Y3)#)5$W2Em5bvb(r(m4m?_jqPl0gbO`;)Qb;OoUQ- zxJ%tBRdw{BIB;R9r=yxyWBB|IE|9{?N4~?j9eu@`YG3pce|l3Q*p=Ag{O0yTM`~(P z77KKmQzAj@amLq&3#6GzR$?|eex9%;My4D4iFzztvz3G7)a~cqY8(*EbIn3f2*$W*Zb>#LL`!QN)@tOaez8~RzqKfoc0WnezECvrTa-+8+>2N+(4BKdB2?#{d8T literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..f52e89a0a8e4dc2cab4c719004e41f0905b9e154 GIT binary patch literal 25609 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 LJEN#}&g=dQ{A}HA literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..2fd26daf6b08acccdb555c361278dd1daea97deb GIT binary patch literal 26323 zcmbuH349z^o#!hdr*mHf5<<$(fs|OXBFSm(F|dK% zfmsMgU;-?+C(B_%27(z61DS=;7zoEOgkiY?Bq1ye_Y5T2urthlfA78Ou0CX&-TvhH zS5@zR?|;9i{P4_U?(q0sdX(oq1Ke_==e?fiKRZ)jJ?~>r^E_U?dmQcuRqk)VqrnFp ze#_x^9Dd*74;?=2@KJ|9b@+3KzXH|IZ^2W+e|6uFdb;iB7*P4ggUUbAy*~{+jra51 z`(>cUwbZ>Yb2#j9xx*{L3n+Ir_yBkV_+_x~JkL88{2h24_$0Uj^v?IZ(}C+ihURSn zPXa@5J9rCtHFzJWrF#<8I8SD=7K7)5>TebJOz;KZS>U{Te*<_S?{|ZjfL{Yo27d>h z0ID)W@lFJN@M2K?je!H;%fVIPUEnd`KZ6?oufeB+kAV!yJDJYU0Q-1-!#`j@R^SdA9KktwHqxO9oReLKymCJ#Pz*mA=*V{nt!|mX?;77m-@bjS7 zt&d4-9IHW%BLr2y465E9P~&+EsCBy&6uo>L6x|&Jwa#C0@81Gd{`=s?;4eTQJe`+o zz+q6|r};==MS;xdB`bG9>S1p!nmxpvL<#Q2YE@&<7s^wLVADxz_buQ0-g=YW~-Qs{bOe zAFP0b;M+l!`yzM@_(s=U@_ktS#mq4x4Z$XXkw9D;&ECvw?-bzsGc{8YTF{p990Tds- z4b*zQ-@ShrT+RC@K_7eqRK2Gywe4RGYMz@wt?P?G&388_I(rSMd43jDzh3}F9}j}s zwWK|9#H+=>)yZZ-X8Rk(-432}M%a?+h|E-|t>Af!h6QJ6=4_pC0 z2&(?MLw26Spys~@RQ;Pkjbk^c^|=ESUA+@j|986YUv>BZcoN^g1D*~(3TnR}1CIkQ z7`AkCF{u3I;C65wsP*_u@SWhhLAKDl7ADsCLvRZ?531iUf{>c`TkxgedCTp-zYIK; z_jiF$0q+7uhaUyc0)GNZ{yqt++?g=F_NVRhA#`0N3(<5LEt& zD8c7~mxANq9#Hka3W~md25Q{@0cxEug_u=u8>o2|L5<^$p!nr&pvLXc z;X#LA0@eOkz|+95x$i%4_>jy0vCIF7dw&cRT|MF6Pe2%HT#G=pcZ$Q)9G>CuEKu}z z4){}W6jX)&m6k3qLwJflmxJ5Dm7w_Mb)e|*{h<2&I=BaX2;2nTj8M|}?*x^)7X5d2$9Qdb=7N1w#;$@;(Ui zpZ5d)Sp+_lOznR^cpf+io(paQ&jJHb`&b9rV()z*B<_6|RQso{v3$A`ypi|Yz%#%{ z!Q;WlLACQoQ2m_=5ibER0AW$@IiT80K+)ZYK#lVN$X0p31R;6vS?lb&z8F+{dqC~W zZQw=VCqdEagWxm4-+(U$PaQ*6fMt*^^F9bNbnj76_&4Fiw9{`U7KMh_2e$M6p416>1=WO&mAN&yb9PoZnn>2`z5%NLKY&{2qc&T*x&~y4yctmIb^uiQ-+?~(4213l;3`o2`2tXM^9qorytjhq zfDeOZ@CooTFk~>2Pj3P>zYl_!f}aQb!C$!V=fF%F?+AD?m;-(AHK6GIL!jvAK2R+A zd-r{4yOr;oK+(Zg@O-cYYJ7hIs^0s+LGYXI{pcOGzbhSvpvHLzcq;f2Q1kgTD7pI$ z@L2F7UPK@Lp!zF-s`qN}1n}LU*69P_G2rLH6T$nzlfZ9+r+_~KRsL6?==gDvrS?wT zY3bw!Q15RAhrvfcSl&B(+`jJuwVtmA)!&_<*7ZL3{b%m|*j={&rJ&|>m3!X;ivOPn z!aCk9-~f04904B%MNjA6VAu0HQ1iVJl)Re-*Mn~YHP3H@;*$qKjqBe)?c39zXX}rE zdfx`Bp8~iXyaQBw_k$YGk3k>&BdGPc5Fw*^_knZZ6sY}q1k^tN3#fUYa+9UoE5OTn zzXe=>0kh!23Elcd=)7A`X%@!@NsYr_?Z{keK;DS$X0k4g3kf#pw{yMI14@wYMsh2 zvFq>-Q2TigsP+$lqA&lYb{$rOTCbZy(d7)N{roF%8TgN&+VcWC{{c{Z_hN^y2UY)G z@Feh?p!VxW;A-%soaK+}!Iiw<1g-_|0QI$Uk7Tx-UDiX z4}jY5`#_byA3O@Yo^+8O`27><&&(6!121;p_wX#*InKSqf`&(SgZjOkbg_9Nt^j_Q zq&a<@^c>R3)O#&>7I*>aojmLJFBZ(dzjDvN29G5jN78sjV;ZmKp!uFmI)x-&JDT(q zlIZR%(m5o}`3#cQ;(XFGNZNK` zKY)MbzJCV1l=O4b(@7EOJQAY7`&ZJ@jP+yS!=&SRE`Wa|oy+qWcsr@{_ia90NqQP( zP9^C#ZNdEeS^oWBr2j!WKuUih4=*JBC20%kt)%ae^b_CRZJz8u?*_i8N7@$;-bgx@ z=N0)hiB5S;^6P#{e7fQkuKqV zHTV?pB+?F^_47%idf@k8EqEu8pZ@-Vhflbd-+*zN0X~Cr2f?qBen{F((r?a!_cMpD zcQ^!ogY;APz8<{QJ^v1To_l^0dD6S-$mL^ z^6Bpl;0DrbNWUkYuJH`P=EMH(sFII&`|(Uz@%!ScU#}FZaeXGt_j^QWhAA@Q4KMeG zukePi^oFnUhOhR9uknVj#l{$Ml@n9j8yWIOhEXTW+dp67U2%E)mn*$1hY;mgV8xU%ihXlCaCyHG#{>7l9Yo|Y02tcQ&Hm2RO3Q5 zDEkv}IZSB1Hsz158Q;F;hFxP@ZuYlr_ir5CxpQ>euA2uJjfbIMn+pAvfj?CZCs!?* zs?}za70Z_G-o1OUP^k~b)xxq;G!a&kFj*Ft@&nD6!c1vkWN>J3s#d1s4cl(;H-we2 z8kGDU^&F-AEwSWpQC#sye3q~j)WYh@Wx;BHlDE8_*x<@#n#*c8rQKmvn5wN> zlB2^VOrsQ6S1q|{%@reSmJcmiy(aX7-9a^6s*xw5A5Tt36A}Hc3z8|n7W+GbN?7u% zVJQq4wO>|aekHE?xsb23QMfzI`*UH!UL>Og=DE62a5AD^UvS zm5HgSQt&I`?$%6QZUUj(+#u6}t1R-XMNFr!ob-Ei;cuGY)7GF`h$@Tv^5JAqFV%dQ z=bB9Rjv$|>ySDr*Y<{HbNyxwXpgQOGRYhb2X50GBHmZ}-oF)xpdTTNx!$Y{i|87z|o~&2x|$87qdqc zZ?5l=R;p5k&Fq`mqkck!K_%Ypt&K_$QQ#Sh@dGPc)|O(j`N!}KdFs;&7c-eD7!cB! ziId34qP6vEm1XdaW)YR9+-CO2TU$@qyk5EGfHlzmr)7*}b}wilOBN@`bf;@5O8eY zx1)*-f{h(T^^;Qy<`^S7D)hrjfI@?=B1jQtn~L(#0_Q7+RBr!(#<{ZQ3N%F z;7m*9!=xzEGr}ot%93z7ZgII!CCE1|W=sM`I*Xn~l2zCpk+-)lN{SutGn&n0FdJ7f z9I_0H@<3vsE8NUklPEEz&1Ni|oicxmchyq8G8s=W;Cx#j%{H|nu!PZUy?a%OasZcG zT7cBj@hFD{uhmiLvVayEw=>yhtfKcV@iVPh7J!rokBESEbCsZsk&+80in8et5{|o@ zSt+-t>UB(H5c=cTf7Q$Th6b+f_k+Ywrs8UCqRzHR)WeZR%_9?&L4Q-tpO8c@B}QAC zg{j3zhAH^b*kwk{8!la2tCj{m*GD=DG_^)NCJ~ql7O8I$j?}BsX_y(7B*v=MxVpmk z#zZCv1PFa>&kVye9YkgGh<>*`;Ica3nZ+c!+*^;(@bmSm5h}L*^?Xmf^-(1p*j2Ak zL?YQ+?{+-p#q}|r8_6IUt!>LF2nJj;jdT@CH!NE~rmYcy3%BHFb@wpJ*>vAku~+NX z%2d+}4X{;0)97epLsZ*X&v_fFK|a!YJDp)?E~S&wk5omol-Rs?k&TinMp+rzz@zLU z87}R+&{@t5&DdnY#6(=Rq9@j9Cqv}?1Y2gR$oy%N%0|qUlCg_>Ff8TM+>|FaI#Uy~ zyGi6&eYh50nxzh-J>(_Ra?4i3bC9iFlC$@tJycf*tlxe`W>B_*@|Q{ zPM-X`gi0BGB@tL%}>8GX)-yDWBEOLa+gg~4#X&XS6l0QNRyi43oWcXktmPJCfgAHXsvwP_E^iA)mib4V)Mn@@M<2V* zyfh~@^7OvcNEwbq5B9dlZsdYtARe9>@FJ8tgH4h*(9Dgv5TSmwC_Qmdm_5QrULZ zP`|e|tW{&rdIe1%(e97acTCM0ok%R(sVi^YjMQk{>MW#Y8EZ@X-d6meXdopegqZa$ zw;`0O-ZuQM8_i6-ZC0Dgk6!Ghd`%fFjr6sO#Y#?CMbF}>&IEaHJ07i%eS|J=`cBT$ z=&Ode)T62#_FhBi&(v))w{=k>Q!tA7U~gRg7!Xqd-)bv8D^?M7Jx*=?HprRA zP20k3go|&{kuzCsP^8WI?T(YA5{_*&hPk9Y6la51+Gpbn!3`r$1|^=^apF&-GT(8M zLmO#zd*95>=;!XNrWbAXx4h)E;yUZznT%{j6n?Xo^PMFbk(0)VGYn$dXe*dicI6jcnmGzomlOt9Nu@-AvO!PY=>ocE&N`W(AGJMi6B>I~!*-Vtod>O-%>4 z@YU`(lFPve!Y&J{5n)g>fLa`*ov>{xzF}GW)e5VYeQ0tO8a+g|wApxE;+%T?mO2zj zkJh;~rsyFx{kWLVGX|{vmw*F?tT%1~kpAw}F!RReDz#wG3V)>`($!1-m2&cg6c?B_ zR#Q%4FbAn8?(MPxu$CCu)mn`fL1$OlG8H~MlQUbOSdH6}dXkDa$5n&guCOYDyX5Wa z*e&aV83(=HzBUxI)Py1Y$OwM|$2DT&i7zHj#Bru;oL-SYS>{h_>osZ=H2-SCzQfp^bl2WE1@9A5tjXU{40KQZMn`M;0o}rm1|rp<+T| z=?dInj5E)IpVTLC?Glbtmf{8JAWH!qITg#I${`9N$xKu-V+gs@42MPn7f83lUq+z_ zCp$bBfKg#Wc?t!m_GVhTDeGG-Y1+<5Frx`A8)GvyJ4~LFI$}RV=W=1`)ecHSu!<4q zJ~RhSxG@|YsgO>jOvK7~=9WESCbj}cth^+8kX;XZ>ckPID-WBSGcir2gm-5RVrS4m>J!0C4NF-kfk-uXK;uHU zgWmJpS?DE%aW6^wB{YIr&UO{&@NSguJPhA!X%h}AP3X@CMjYFl69+;jTC946zn>qp zEjk-I4T>)%(!vR?Lb04XNhqZ`Mo^k1al#-q@iXf|o5le&$B3q~;*hD|ljb=YlahM- zXSzvdWICGQqJNX$XQ;8i*|M$OQS4^F&ssFy<=QN!&b};pXhWJ&LDx~@>44e%gEe4I zVVz2j+TL#Qq6%Rwb~@D!1awUFjB1s*%F(-r%GD_{(bpZ-c$&!#Y|0O~&0gVD$)cU8 zl4@;WYf^~v18eGqWMEgk!cULf3k1vRxj|0tmrb$30|{qXwE+{oS*EznKrJ3Hs&H9^ zFBT??c5ENOq2U-ct_-Y$S628VL&Mh&3=a(qkN6`aE0zykJ~T2kv}j9^)CQ1am4wKV zBE)NgQe*FY;y2z=^;g!bgSns-@CxfpCPdvhDW9sZrW$m_p~AqfFetC^H*)y_Q!J=7 zGZ=b((bi2{$66B|9voV$ZYZ6JUZHbe{-O4|b zs~v4kW$t#ge>ayq+CO#P?%3Jbm&}*KT3F;%qcDv}Rbdo-(RJ(hV|@q*JEsI zDx62Mx$7QN@w`7iwsq^KEjN#C^EZrg!(;8HQGeUmR{#3OD|Zeq+Sb@NuT!{?Birtq z4S(8&5C2d%KKzkEL?o+QWFiM|&*dUr0hx~)`==XwYv%3;r^n5iH}+L)f6@hzZHR1E zDnHE?kg1q{!g+2q$P=B?=}W)?sQ<{V?`b>xd*s%4`$eLv)#)&qHw&y93NMsck8)$5 zE)|rylrWzZ8hcB%#@?bjY1~`#gZZAfM0{iiT~+>HZ;R}z=cmz3+KyV|K#ntOb8UoO znw<^{bKcg2_slZOnho*bb2skw3voF&4J(O$XBzuT`NrNlL0wiAE87&|Osa?z%M==W zlK|SLXfcoiWlBkr)ADgdZ$v(tCl`Vx5!~J+E@pEIbDYNK2;sxXa|iDk=qNcl?>7!4 z$vj53;U;gCwjg49L0LNvD>96I1hAP9S6*1fwkj36X2+61G~tsNa4ne+Y9*vWV{gH) z7v?zAtX2b46&h*mE8=8u8HUnk)U&}LvDvAxcJOw3LeeDjk@!KuwMtk_iKBGz_UXof zX%b#ZSb_jVm>l9&<__LYw6U>2p9?D9*2dndUkPTafyj2As40<{g0Ep=R5bSMGS+Ab z(NYfP&3g6ZSj86^o)&-5YrJFHu0>qLRLu2)0vc|;aVTs>lWAsBVaHXtA}?dVoeT1K~y z@ISZ*gM)n}r8Dib_l9o50tRW#FEkERF^{664`<;GHV0^yYO-;l)HqP9VV$*lU$6y7 zV1Cb9rv1q}Xa8d5_XLC4TD!X9oCN#9*VE}=iD3<0r`HDzI7 z=ixjAS!w>@?XB-ftAOw>yff>{Zni5NR+hpQ#mH7LD;Yu(6-4lX!aTjqhF)7y%mJT0 z^35I_DHqwRFo+U0$x?B(CKnbuD^4=_$W)cwSh!N-m0jG97&NpW&l83b_xK#2LFa_H zkEAp+EVE8kyT3-kYpBSbVpugo+=>M>=Ko)Np~&7giPg-(yF`gJbiX$yX?gJWDpZYB ziIZCMy3XdN0QSqNRByZmY9M?)7jp3nfl`GmB;L*PO@`Bm%?Xn~k6`t#mt}yailo>w z3wG4ZsZ*t%FWR$>{r<5vh#I*tR8tn;V?bF^FF@+rJk4W~8U zmXd&!VIS_CAuJ&gkrYuEG#Q$lY3@r(Vad+1hbq|ImY>S2W-n<&hp&lsiLrzG}pdjt*LHvyLaLBNb$2?HZ-3#As`~26@d3!c5RWRk;-V?3-d<&&mN4tNKIK) z=@?X3fymj9*opg4s<3b#r5smfHckgUxMX9L3v@@zF$V@G20;-WpxsSPaU2f0q(D&bAiSN< zSins2HcOIOqPOx@)S20qiN@V!$cuG6c#njYJY1tu5Xd-FEow9c4Jn$ktulvc47q|? z7fKQu<%|99H!a<;gs5Pc#L{#j?2tXC4Q15$!c&AhwCfJMQK=0^_ikXa@RGZ^<1QEE*kMWu>yzPYvD z#()yWWvxY}+H8QCT9lO+t{j1B5EJTw_s zbm5Dd8UB%7hZ1UYIoyS}HWAU-uRl}ZQ%efj2zn}Wut9M+QtEr;*0&ft)9;wHOx2EJ zC<`Qwji%%pcULq1o7`o(5HiskXIVVI7S5 zZengMBhCSV0SR79YN@h^)#f97Mn{8VxZ608-IwXm!jh#%PWQ24HVSf(|AA8nVZtd^ zy|=i>C@jPOtyau86FG1Jp2}RyEDStCw>{lMJWdo_P~wjRx?Dv3%2r;+P0ZAx*(%g2 zlM9iG$-{QT%6(q`iu92_cX}7Drrkxwf=sd`+m-hKMGTdU4jwm0)y^xTet# zPFA}sdWNPl!HuwABXZ@5^hrHwOBeOo+j>39ug`eQ^1zIu!+()>!+(XtXu#gsb1s1k zZJ`}|Y6!dCs5EKIfq@}rdp3%^^TRQxO9+3bSgJ5(SJxSz7Av;-i3!6<&S6W$@n#fQA zTHkoe-QurjjUGm|?fo$IZBNd=Sg1$qUQ2HBS1j$WXXwJr#<1#)1vW1srt|7CN^7s! z9%Po;@an(}UgO;gTuukx`YH!kPSO^eaV$JzhSQ9kFp#tgfA#9`0(DM;X;}Jt$|qvWuaixlx8w+u4O0aw^_Mj8PYd!1@%!gvr{3tjI8V3 zCIN`JwB@x?SjJ!HuZ0?Sm+C|k`;18Ibkg}#k=~_s4%D+oTR=(7es_97O`K zuK8=KE_wYOUmGjplsMOI5#$cIv zy0;BGZw`ThliPTu4L~}{!%`g9#vZpq*t6cV1KekvX#UhBujgGw)VtLqRX==*K0FxUD6E6@lkc+cvj)HAx>By1sS${9Xqv)9m=c3M3JyhtIRb)&!kh7sYC;5T= z^>k@Ys;`9cmo`DbRY&+T*!h1?m_yH!H#X0Jx(@Q&?rU)Os%bsejH60Nn2q*u&)wBU z3CfGxpTisGk7?5glrijdaw2Q2%M63r-5Gf{ayVrE+^UUbjhT7)R^a0mJ{N*H5!7LG zM*u#Y{+EmQ#A?Ko=r$fHc!YQeI3`}A~i1`b=1!=Ofy((%uZwstXoB@wAE-o z8l1w;?TiMt4D9Y9vWJ;VT-Lna7+7~z%?Fo0_*f++w5CX!nvyZi$;$S z4sT8(oHu8AP95n;q)i2(?G`#qM%3+PIL6Ph=WOO++DvfJyTskAb{7t%?~GnS1$d+O zibyJfTX#iT+e-*u(?tYF1(qWXvmxhPpg6}~LWWIUC95Ukf8Il+-`t{Z#no_<+wQ8- zoQ?hS_x#+4%>?8-D70lWNOeG%Z7ol8udMTwvZ)ceDH+Avp@6cKA`hTF8)Nb&6DA2* zrpg@7bH*CrFs-Zf&F!U|enGFY3pg*`jhYRaLoq-U93O^?8YvRp>$pxMA}TZqN6Y$P z!##Wc77&|ob~=|Nn>V|=KHcIWUm6FBI&6Xr6~SX2bsQr9F=i2HNY}h&(mA@~1o!^} D&K29v literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..c467e930366da9b24cce69ef6718e8a372680f0d GIT binary patch literal 28449 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..3bd1a468cae2b0bec1f917166717c28cb417707d GIT binary patch literal 27840 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 bzfGO#w`?@otzfvWcr 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

      + + + + +

      $n6XK^F|T3w!pp*sy5K5Hkd&6zO-ap)=__-9w~-OmW?(wJXNQ_N?gq_fJ0Uua`m+_H=+B*N@gKp%9-jdE*(34iMBW0X-Y31Ey2c@i3 zV5rND%q^1@*%cAoa5@UVK%YYEWC^Ik*@PvyV#ZA+`;Pwd_Q*T5m)n(@;e0bnjm-oS zR0Vt+&no&%XGyY+qlPDWYf)~Z)IKLcq)+D#rQbESGG((zO}0u~HvTf97pAA1gpn09 zv0LDK3mc`mc8U&@|$O9-k zBVN=}hsyLVUR#nIb*tvG8IZ{3zz}}xFDN0^P1nt-;Kawy(GW%17nd<48RZUXwHS^~ zRX7hMTZ%7i(TI|Mrk$Dv!4)HYMixxhFQvMUdHd z&A0My--5k&M�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 EKhimw=>Px# literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..e7cacbb732e3e62a95da290aa525c5ba835b14f3 GIT binary patch literal 24167 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..3bc58a5277609d714b9d95054126090ad7ae9411 GIT binary patch literal 24795 zcmbW937lSKeeVy*8bKBp5Cl#Vf)kV3lCUHssgpfsC6fRVt)7|p%*^54hI8IG$vaA~ zy=}$bB8m%WT_P8~xy5P|RIb{1!8?;$QR|gzv0|;X)>?aOtriun^?rZPa^CaKOqTZj z@XYU=^X$*_-=8OZ>*6!s8SuO2v>Q_P4I{<1tZwIw*4}zkXhe6TZF;MIL1^50nQ01QjuLl1S48aR| zxdH44_5F7KXdZ8Icm&kC{W&Ol`Uc1l&5PzYpO4ztEuhxvH$X@vc&mH=D5&v125Ov7 zfm*NcgQDB3nB+!qDaeq5*MZ`XgP_KH7}P#L28Q6bL9Neebgp&11XMfMftvp-K-GUW zxDc#?J>a`QmHQlc2KW^C0`S|Q_Ujo?{aw&y*WoIVPr*9yWncwl$ie+C|1+TI@o&Jh z!G8ud|DS@Zz;o&ROmHLE3vL6||DB-vxfeVKd;k=EJ_M@#XF=`r=Rmdp1gLfUYxn&J z?)_QtM!uiJ;I0MNfh-0lVqGASA#gSCp9Dkjr=aRxy4bdVJ*atZ2DPrQ1~uRPpy=!_Q1g5YRKI@$iax#x zYTtees@^#;nZC~hweG7xmNpm$wa<5h>gOP+_4^ojF8Da8@?QnlfIkN{pH&cn>TLkk z{$7wJ2{KUh`hHOT9d++dy7y;5^?MstzYbmqeh1WkKLefx zUeRyq=4w#+OTiuBI#BEJ4)8tT`#`oZSPm0w{4ux{oB-AD=Rim;_#yaO@Uo?L-(Lql zkN5Y2&jCLSiVpt>d_MShpycnfpvqkg(~H07f}+#)pw_2mtAN1@txpW-j9LG zKNlr<6L<|c2p#}c|BImL>wBQa{VP!Gd=12`dfP$Gs|;!!Zvn+G_k$Ymd%^R;2OS;( zFXsJGQ01QhRqh+0==W)G^fcr%2n2%=k8lqtI=Y2Fr-N^E_)drKa`+yH?|1ls!w)(< z1ZMhhKI1PrCfSbnia{=TiRX?)@bQBaQ1yQ0>iiIN#v{hc5-S zKMTPp!CS#Ef_*FP{C^3G{?A5;?g7sSwf@7P_<91o0Q>;>TJSK)76uosw(GnJ6#d-{ zvgN_;py>Alpy>Q@Q0@H$RD0+Dn%&o>py=t9pxS>EI0t+ecsckWsC|AEt=a?gGVE?*g9#J^)?;eh9n_oCMX*w?OgL&%rCf`2$vet^q|)O^_uB-Uh0lFM}6> z7a+_uuDK5TLGk|psBvurHLp8B&Ff8|#{W@JeDNtz{e9QHpSjk`pCzE^aTBQV-UeO* zwm{M6y`aYRZjh?MBcR%Q7KAl}Yt~^qfVY9?fo}#SZ+;&X-+ma>{(Kr#|NjE2oeNns z^*0D=eeM9YPj`d8;3J^M^<7Zw`Yd=Ac=`s5^T1Kw*MRfEhd|Z;Gw>|%XQ0;YSD^AQ z+GyART2SkF6R7qhQ0+HB@#&r5nc(k%T8DeV1>hfmn)jE%mxKQXE&*3u?y+v>F<9--aJCC{V-vCwb=b-pu{uW#QdQj_ri^C?U{I`S4!9xz81~tCRw_1Ac2Q{v1 zLG`l>)Oai4%fP!p_4lxQe+s;Y_p`QH`Q8nx-cC^Cy&Y8j10Wg(%HIoWA8Vl6y9c}w{1nL61&@Q8=L>gP{<#d499a%(KlXrg!4y>ecYvDTqu@&L zSy1D>4y7h~-T|uqC^!fFEl~7*4>$^b96TF*$!@#yTOaV4}dQM9|mLa z^WZsP@2$)gyaCjFzX?7MJbkZ~XBUCXc;5|P2mUVD0v`i4-xVq$`Me++7T7v5&qc_paz9|0xL?gc~e6QK70FTkt8pMk1>#jC77T>)Ot`#SLD z;Ojw+`!k^0`6Ad4{t#3<^ImPstpne{`|p4&!LxoHS_jvHTEBzt{ZTOD{qon?_U;6) zKT%LpSKXqVH_{z`QJ$IC%uleo#cOKkpE6z7LX2+7LqoT{*m-H(kDrh z+n*sxKJ6pvH<$E3Ni~w_=Lym_(gUQAlJr|d`YZEf|5V-cr@&#-rKF#e{yRy(M@iR^ zzE65FDIr}(f<=NKkxplwXY)J?{yXUsp4Wr-lBWNjaFn=H8 z?{`W6oAe0D|6(3qMS2HmE9pMc*Gc+`Za-q4?4S1mpVK4l_X4+&&g6N8zVR!OzDfET z>0CF4CeLprZ6bY`bOz}|B>n!vLhxc&_P5;o%fS0dyGSo`c{lL2g>9R-P~5`6}@DNcx@c^7Oot^q?LJzaE~yO)3|@E#dh}SMN?!^8b$K|3i9;bP?tLFL)XF1@MQYUy}UqfAH{A($7ezxicV$h0q<2vva>u|glDzlp+2gXjNBI^w>47F4VMt!~IFERNo)g$KzVqRZqiaZ8WVn$K%q%fCx=LMV18pON0JpLI1Tu|8+tC z^+Ep)LH}}e+7eeeGqr;yeZi7`)XCD$&&z^ki#oqt8(iCmD8HU?*z#ayvU+fg0j!G~ zQBuiP_9m;tYFulENh7WXE3@&a7G}vrylP%njVhISt9OqjSva27N7JYp4%e%3M(d5S zaA3{gj;(ukuiv^i+`c2cWnkB?f$h8Z_RJZKB`<{bvVLX$xf_iWv}M4+D&PHoQ#e&R?Qot!+A`jQcqXS zo4;n+k~K^F=B-{6htd8hjTdX=Ssd0!Mv~!#e%D3WSlFnCJEK}$3DdX|M~phGsP{|^F3vt(>$4~LqK2K|OzanEQ^SW>ROFVwJxS->(6l~yoN+85P^ z8S##BHI=nLjMW?ExFrH}8I_8srC^}_%p8Z~@rGG%?e%yZmuaqEi^H*KpV|K;rIBbj zX|%$Obzu!vFpH{jxG$wrdlt> z)Js{FR@fX@tC}RA_D76*Uy>z56<%veRde^WJ}^Gck`l|_Dygz0ouvxNa&gqw%?v@J?UliHlFQalnhD~%B5xuKA~Gb)wn zt|Nb$%}-Q4i}_oM(pK1&ipaXnwk-vm4uzQmGPmuhnMv zbY=~XB_oYR$0@LX%q(vc;%BYvm5SD+4x5F@gTm}Xjk3`2@$2Oqo0o2;Y%1NDDVg?J zL5RXkygm{}VcM+Klu_uA+V#em{xs@U2k>V&UTLzW~d18j2hHMS+!gq`{JuLbE#|0s#hV zWXG@2sE?cSLuLYn3S&`i6iMTFgiY;QurOHL`PD2}tW7EqQ4|=82_q|8)>i6d^T+TEdFs;&7c-eL7!cAJuV;yoMQfXB z$})sTvxrJPx0(G3);2RXZ?@cO#2RS-eHkN}-3waC(uSo-_P|lRZBN;D=PZ-VmTzU_ zjQXu%L`!1~#XCBdbNyQL)#_(9wD=Y-q9=p`T?U;hVK8opJ~Hz;1{~XW?M#tDu(6}4 zh2&JC7Gp$5#bI2FP-xIq0x805V@U~Gfc+a$+OQI(qdfU4o$vW9MNmTsPG71NXJwI| z5l+4-OTyK9o6AEgLB772F$oyyKJ+Y-tj6w$yn}T~R-X1guGx%4`|2r%Ly=)o9!Lyy zg_}8Rl4Pc|*^J|7d**NRu3Bo=M(V>1xYW@{-lkRrmN1%a_Fh$@8o}k379cf09_6s$ zjV20R7SQp=?M$|DtLQ^Z{7kDZ3qZ<)M?}E7RxPSxqzpyFW!ZEH3CG=emgjb_Ue}8Z z;&2fAFJ08t*S&mU7-eBLR!9+{Z+gqs`Tuq1LNGuqNDOrwru7=s^; zU1r3*;nKB@w9*r}KKvxm)Ee=6i9jz{q`pNsQm;m*VP;s8Sf8f#bVV4f7nvXsAoTSI z#u=XJAgP*1^tFyMx1WJV#sVZ{P6ZH)*#eoJ9dclV>5P4_b@&epoMGS&3)2G}m4 zX-sQlW762v911q3Q7O@SJDp)?E~Vq?N2($(B{rYE$RO3MVYbXvk@=I8$|lT}im{7lVOYxhT+b7moT-V~ofA1$AFf5< zv(#a7Ab;JTAXQ=tK)G0omTR^*t3$kF_}lk^N@EeOjB{f(`(_v$SIt_#1LNb{kZi`ulYf^{si1G1 zk-s^s%Y_PWsi$RpCT*|(l*{lfaXii#I2!v zl$LTaCMjl>lcB{iJg~xAZZ#ITF~5@<(irLrwqj(NKjNegLr*#SIMdAYIo`7+ONYTW{Gg=UlM+JA`j*=fN@=hizv~t= zlVH2mrt+ib2A;1egQekLQ!G|;;uJlLqdFdyf*p9YA@&ivJolZPrO}nfcQlh!4*P6F zSXii=Gq-h7663hlhq6Z69B#0`LoL7FVX(v5?8DYrKb}<0+0_~zmI4aKftA_8$%=V- zIcqsM-KvUUr;*nM_I6(^2^PH3Ww@iZaA7Q7%t^7>Oy_auCjL&=ye_Az!g3EA_d(H? z=C~a2EZFH?ft~gJ631?jZ)zruU{{pjK6rB7W%op~H_Mt5{zM0$thgk1$f|eOd0TMg z+Y`9zrFMPn_!yH3sbXB4Sqc=@)Gp#XCLH0GB%?)Zb#L6hW7~S16oi`pCZnkExu>Vc z5Oew0nQ|`A@`7QP^O@WF zVuxFNp96PUXSnUK&CJRgEiBP4Z+fBC76!*HwWny56a5%8Ap@)aoD1nbS=#sCat4)F z%A-$%@u<8E48KAA>0xZk6T6D86ak{)F-ZZdZfe#LFyX6+4RWS&Zd;g*aPciVawe+{ zigY-?Gvg#)!m*9UFqgE4;%x9r`)qt6xM7KtL0MpSocPm#%y*pR*hX62-siam{X8=( z_oA)-mY3`+uCwl)$tYGt;perS?<~oPoHRz9VGz?sM?uf6CdV~xyK*ny_b(b6#lk+n zt%5qMPwT+CnWlkRJxE*G8OMa16*LkXL6m-WHqL0o`Z#p!O$WE|>C8Bi%fSf3E{oEH zFsK0>diunR# zz}mkA957^qK@)%s_j|)E7;M!V(Sa4=N<*Zp7l$k5E2= zxMWRPYbtBRo)HQW0>)e)9fj$%|3GiJ(^-n19en{?IpcL)DO?k!;p)(^9r7nMN}x(? zP~M!0h|xQNn%(>3s2uKwF-@)MK7d-9)dg@FUNQ3OZF>{woz1W>lsS?8-!681^WQq_ z!S0l}*olpQQ)Dyz8Jn9+omjj`#?4wL7kj@Zx8xm;L!wS&?StYXBukIg|7ZVU%UDx?!B6R|R$ zxn)lnIc0Pt!g|oAaRALRqN%Jnr1yJ#o|7@2)H^@ZO*Ssm(F7O6Tf;6xjSKUZ zZS85r_J&>7qM2E)!(y7=mn9EvNFEh*9c6(In9U!o0dorLRC3bsc1MuZ2xGC+UN;cX zG0`)s)#@on?*S@Tr^rNKcc%5*nOyhgQn%ae72%v+D3P?$y)7F}O5JOkqgnUvI-hs$ z=*A`CAhcfVUI(?W2$%HrFYoT}>+W9~_T8{z+44nwOZ)ofY>l!;HC}-*HR56F;M5WFPJVx5 z>To$Ze%twdj>-2<9y&p>Wx=}1M+m?#IzgF^8y^ELhFWVd+=z#8M!tC3)sLacqZLTB0?*ER!NUyzKH+?bRh_^= znSe+j9vY0`q9py#UIO7fE~+vnHm_bLn9EI&O;K6vTZ)49cn%o)9IbF<$0nC8bvmMK zUk+iTOOr>Z4pwooiAyA57gW?kcri`Jbo|8vP99wt#tp=GB|dhrk)*-KxRM+@SS2AH z43U(nT>Q)+vZz%j{?Vk6qa+ndg5BC3$4RPXD1yQHZyfZ8aL+NzJ#Ys5SFAubDxh33 zQxf4uEv-NaLN&bEig3GYtP5jhp?hrHidqe%S6oIygym!$#eynHp$KS1++2+ypIQ_q z6BLD7gI6LXYvJhRQFy)*3_@0MxsveV5$KC$;W9u}b1Ywt+H7Nl1EV{JxDvrq(F%rrO%-^bc(U4k8~yQ4{FSIRS{j`ZM1a~lOAcA_$p#kN(d`@z6l zZhc1Z5L-!Dj#^e6r)4&>-HW3LII~#c1jQ%sip+k>)+_YPTy!PQECtiFJm%&8)R74` zzSyaxe1@~grKCo%9$u(55?kHuD^wR%XhXa^h-HNr(1^z~s)!--ETl9h3nbedGPB_!d1Xx`CAM!1a=rtplgI9ff1ojzD$kbeR6d=X`zaz( z?){{`%|ewy);g-vxa5m(3sGS%uM}0Maj@gC1p`NhLA^kN9%r_ItSMGL#agD{@uZx^ zm4(5v_b1g7#DFEi^(EvO#|dS~k9omV6Qc+uBT1m7SRyk)W@6Y=zFBPsTcUAZoPdPl zRf|%2YRc2efk3)I8m5`ld_CPxY{c|r;QdK)zN?2k?G8B|l3?}cJFc%1GWp-UG z>Zo=aUr54DK0;A1f(?7vk)xSVN}jol&~dT)Q*3LeHESS4X8K4Ck%tTk+}Gl#TmTHQ zcbJD-j`HNu$wN|t=BA506?;xFVB|0YkVuB^N2bBe1) zVs{GHUtY@8i`s`HR@j+wqSr>_;iT-Z+L?Y?|71d!uVxnN5RBWREYeOIQQn~lB8==3 ztUgN*8x(qKFDj>_vL_f{&J(DsjxiN&tYDzU^cvw_T8=p)Pjum=TzEB_(X0opif19r z(CPv!s=ds!oq9rZ^EPU-P}^tkD2dl-uCqfwm283Thu z+Jx@<=T?xFJT&Y3o?emb1;psQRUsqOm-N)e+SvW$=pBmiN?!C&Q8APq(k6^J3FBi2 z;}+6nyc$`)W@%VfUAQT;E9D3?p1tf4E_r?~w8}*@Cdu`jUFJ^OD_iR^^ac)P!eK(K zp}VG2EDf&{)RH=bPZW<0b#s+bSCVprpn#im3p$3kIqxziW(TqRGNyzI7~3VBz$!rS z%SK{Xt*YM?H6nb%9XfN6)l!)}Y7MTO6E$>Hq();5EK9lwLzYam(SD~N3?u9)@$a-e z#j?ro;HGu;tQBeLrw)rPU5`joluqCY(2(DFE^G2-_B(A_llZhu45xDz4 z>vEN>wJ2-fazZXUgBLq*0hhxheowiyNXQSWu&Kia*Szdt5dX^Y!MP+pai$B z)4t#6_&4K9xx|ib;pS#K%1t`SBKEf+gn|Kasc1veE}x%>A=py%A}lwGgA9+&lG*;0 zUjafeQ*SYpf>g>c0y$MX#Ic9WBrUEkHzM2(UogNS%p`fLGMBPwv6O+ERxVU1HLkOD zS!c!rabAfrXk>7W>GX&oLa<4fCG$DYFd1PQ%a@U1#g4ZQM%-xK2#f^78eun_V`pHj zP+1&uGYa`wkuvj*1EHwVgydEw*o$b$E1-vc-eKcSCZN4J;mC^Aa(mUQ8zn?50KnGt z!-`M0#(fs8$`YSu<{L{xs=a8ApSWnz%AUPV+3zR@@9v0ZHK{EUb$gA7Tw~;(y>V3V z{Wzd^#d4R=+&Ahd;^%mm_c+2W1TDB)8BE><%NnVU0uI(p9&Jq?m3FR99>vf&nWT?U zViF;_*vn~gnpke%M)C?%z8!XXd#7{uWV=NT&KaBLXgd48&`NH*8VU`WQN3JghW4!x z+DL){!l9OaTy?nGgmcWnvi9*E!WjxX3khGP!H=kQto0F9qFs21H@7iUcQ;l>M~v9=G<2;zT3H0py<_ z@y`lyAGq@&FN83Hm0qrOjm!F9RiUQuw~s!xr(0V3&b3@?>M!`+%XK}ubR;!)(sh; zv666$^#(U$RuK%6dto*Pzi@)sUxJutp|RE5PNu1WM8-Mt8)dCA!!+KkGp)cia#b6C z62}u~v3Kk7(Pfy)tsjzvsm4fUQ2^Rl9Zxu}ImR+;vV$3NfwAbL zjk@@B?u;ug;#@d+f+%84Pr`W4uagBMe*vnkLETdak0a#CF>5)Sn9uXP5G;gUBz0{? zul!hE$~hI>Aw3Eu3Z@UWy_qG)-_qEr6dlsW!kt|*t&w(+Uk%%}9i}>NCo^j*3QgrL zR(n7+KAz^JWjn*k3-?{&EED|OW)2HFrt2c&J^?A=_qv) zM(J$QhMCxO&Sr`8wk5%gzB=}_vkyn-1s3(BUzoEMY?zrH0%x5)ZGdBEYW~^U>lj5b zp2D{JVGN#Hq{J^I#AQOcCPsu-#k^0=LDwuNd%0<0w#jY#ae2+t1!o};+;FZLd_Cg^ zVPPOYQ4Gm=bGXTcN1yA*S8z9SvU1X~ou%A%yuuV3>a_ZvDYFfy-~l8)U(H!hsI6x9!GTkHFW_;j%R;yfDLhbO#rx zz1(Jjbp0s?W{L!6mN@&zc=9#b1I^qKA?oa|nw50bOx}&ez|_ICsV9YvoPC44ON1Kv z$uN2dNX&?->e$Z)fsBJc&1Uc8Ul6dZ(uJL&*ppWyGVFbaHnF#-8SYag!N_3D!u%}4 z>I&Rb@4;IOW>oPBuQ`m3gmL4oV_3&V-Aqu8>ubi2f`g77>~+R=&ix(M3B22DJdj}W zy@XP%4b&0(>fIfWb5!7brrw;fjk3fdvAT^-=0eBR5ymVhd77_Sux~gunt3MVY#;Kb zF;I;|p?0Q*m=i$G8AvAlr0JgMNy@eja5M4QS|t)S!xc5>8s_Sox5@P{UkY|Pev2t{ z0tvNo+Wm?d!EFBBo4JAE z2Q$uPu|w4A%8)jGma~G4wDp3X|Iq^zWA)A9D?UFL>hNBv&B>%9X0r4ocRAsY)8S-{ z+C9N^i-4K5X`jV&{>jvlVH)m`wVWjEjW{UfJi~N7>xqxCAdK-T-;^dS5HW8DC5D=L zj5ePO19SIN7Pwn^KFiF(op%~Xn}6lm;(tORoid9+w8z3u_&fK&4sn0pUxUw>C4U0<5uwo zF;V^5+q48`*3&kxe-EwyZ-Ofxm;?4&Ank#xAd4*Uwq>oy-@@lm!`YkdZ+8S$dyK3g UNiY_TBqRR5pQwQi;B4pr1AQs8b^rhX literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..29933049b93eea13da4d170ca1ab1f716912de07 GIT binary patch literal 10635 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 literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..ed1cc6da97db5f57d6297e3959e1f1e3011de329 GIT binary patch literal 19323 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 Titlebar Buttons > Minimize & Maximize.\n\nFor the best support, please report any issues on Github. Dash-to-panel is developed and maintained by @jderose9 and @charlesg99.", + "extension-id": "dash-to-panel", + "gettext-domain": "dash-to-panel", + "name": "Dash to Panel", + "shell-version": [ + "40" + ], + "url": "https://github.com/home-sweet-gnome/dash-to-panel", + "uuid": "dash-to-panel@jderose9.github.com", + "version": 44 +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js new file mode 100644 index 0000000..57600a5 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js @@ -0,0 +1,708 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Intellihide = Me.imports.intellihide; +const Utils = Me.imports.utils; + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Lang = imports.lang; +const Main = imports.ui.main; +const Shell = imports.gi.Shell; +const Gtk = imports.gi.Gtk; +const Gdk = imports.gi.Gdk; +const Gio = imports.gi.Gio; +const Mainloop = imports.mainloop; +const IconGrid = imports.ui.iconGrid; +const OverviewControls = imports.ui.overviewControls; +const Workspace = imports.ui.workspace; +const St = imports.gi.St; +const WorkspaceThumbnail = imports.ui.workspaceThumbnail; + +const Meta = imports.gi.Meta; + +const GS_HOTKEYS_KEY = 'switch-to-application-'; +const BACKGROUND_MARGIN = 12; +const SMALL_WORKSPACE_RATIO = 0.15; +const DASH_MAX_HEIGHT_RATIO = 0.15; + + +//timeout names +const T1 = 'swipeEndTimeout'; + +var dtpOverview = Utils.defineClass({ + Name: 'DashToPanel.Overview', + + _init: function() { + this._numHotkeys = 10; + this._timeoutsHandler = new Utils.TimeoutsHandler(); + }, + + enable : function(panel) { + this._panel = panel; + this.taskbar = panel.taskbar; + + this._injectionsHandler = new Utils.InjectionsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._optionalWorkspaceIsolation(); + this._optionalHotKeys(); + this._optionalNumberOverlay(); + this._optionalClickToExit(); + this._toggleDash(); + this._hookupAllocation(); + + this._signalsHandler.add([ + Me.settings, + 'changed::stockgs-keep-dash', + () => this._toggleDash() + ]); + + }, + + disable: function () { + Utils.hookVfunc(Workspace.WorkspaceBackground.prototype, 'allocate', Workspace.WorkspaceBackground.prototype.vfunc_allocate); + Utils.hookVfunc(OverviewControls.ControlsManagerLayout.prototype, 'allocate', OverviewControls.ControlsManagerLayout.prototype.vfunc_allocate); + OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState = this._oldComputeWorkspacesBoxForState; + + this._signalsHandler.destroy(); + this._injectionsHandler.destroy(); + + this._toggleDash(true); + + // Remove key bindings + this._disableHotKeys(); + this._disableExtraShortcut(); + this._disableClickToExit(); + }, + + _toggleDash: function(visible) { + // To hide the dash, set its width to 1, so it's almost not taken into account by code + // calculaing the reserved space in the overview. The reason to keep it at 1 is + // to allow its visibility change to trigger an allocaion of the appGrid which + // in turn is triggergin the appsIcon spring animation, required when no other + // actors has this effect, i.e in horizontal mode and without the workspaceThumnails + // 1 static workspace only) + + if (visible === undefined) { + visible = Me.settings.get_boolean('stockgs-keep-dash'); + } + + let visibilityFunc = visible ? 'show' : 'hide'; + let width = visible ? -1 : 1; + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + + overviewControls.dash.actor[visibilityFunc](); + overviewControls.dash.actor.set_width(width); + + // This force the recalculation of the icon size + overviewControls.dash._maxHeight = -1; + }, + + /** + * Isolate overview to open new windows for inactive apps + */ + _optionalWorkspaceIsolation: function() { + let label = 'optionalWorkspaceIsolation'; + + this._signalsHandler.add([ + Me.settings, + 'changed::isolate-workspaces', + Lang.bind(this, function() { + this._panel.panelManager.allPanels.forEach(p => p.taskbar.resetAppIcons()); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + else + Lang.bind(this, disable)(); + }) + ]); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + + function enable() { + this._injectionsHandler.removeWithLabel(label); + + this._injectionsHandler.addWithLabel(label, [ + Shell.App.prototype, + 'activate', + IsolatedOverview + ]); + + this._signalsHandler.removeWithLabel(label); + + this._signalsHandler.addWithLabel(label, [ + global.window_manager, + 'switch-workspace', + () => this._panel.panelManager.allPanels.forEach(p => p.taskbar.handleIsolatedWorkspaceSwitch()) + ]); + } + + function disable() { + this._signalsHandler.removeWithLabel(label); + this._injectionsHandler.removeWithLabel(label); + } + + function IsolatedOverview() { + // These lines take care of Nautilus for icons on Desktop + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = this.get_windows().filter(w => w.get_workspace().index() == activeWorkspace.index()); + + if (windows.length > 0 && + (!(windows.length == 1 && windows[0].skip_taskbar) || + this.is_on_workspace(activeWorkspace))) + return Main.activateWindow(windows[0]); + + return this.open_new_window(-1); + } + }, + + // Hotkeys + _activateApp: function(appIndex) { + let seenApps = {}; + let apps = []; + + this.taskbar._getAppIcons().forEach(function(appIcon) { + if (!seenApps[appIcon.app]) { + apps.push(appIcon); + } + + seenApps[appIcon.app] = (seenApps[appIcon.app] || 0) + 1; + }); + + this._showOverlay(); + + if (appIndex < apps.length) { + let appIcon = apps[appIndex]; + let seenAppCount = seenApps[appIcon.app]; + let windowCount = appIcon.window || appIcon._hotkeysCycle ? seenAppCount : appIcon._nWindows; + + if (Me.settings.get_boolean('shortcut-previews') && windowCount > 1 && + !(Clutter.get_current_event().get_state() & ~(Clutter.ModifierType.MOD1_MASK | Clutter.ModifierType.MOD4_MASK))) { //ignore the alt (MOD1_MASK) and super key (MOD4_MASK) + if (this._hotkeyPreviewCycleInfo && this._hotkeyPreviewCycleInfo.appIcon != appIcon) { + this._endHotkeyPreviewCycle(); + } + + if (!this._hotkeyPreviewCycleInfo) { + this._hotkeyPreviewCycleInfo = { + appIcon: appIcon, + currentWindow: appIcon.window, + keyFocusOutId: appIcon.actor.connect('key-focus-out', () => appIcon.actor.grab_key_focus()), + capturedEventId: global.stage.connect('captured-event', (actor, e) => { + if (e.type() == Clutter.EventType.KEY_RELEASE && e.get_key_symbol() == (Clutter.KEY_Super_L || Clutter.Super_L)) { + this._endHotkeyPreviewCycle(true); + } + + return Clutter.EVENT_PROPAGATE; + }) + }; + + appIcon._hotkeysCycle = appIcon.window; + appIcon.window = null; + appIcon._previewMenu.open(appIcon); + appIcon.actor.grab_key_focus(); + } + + appIcon._previewMenu.focusNext(); + } else { + // Activate with button = 1, i.e. same as left click + let button = 1; + this._endHotkeyPreviewCycle(); + appIcon.activate(button, true); + } + } + }, + + _endHotkeyPreviewCycle: function(focusWindow) { + if (this._hotkeyPreviewCycleInfo) { + global.stage.disconnect(this._hotkeyPreviewCycleInfo.capturedEventId); + this._hotkeyPreviewCycleInfo.appIcon.actor.disconnect(this._hotkeyPreviewCycleInfo.keyFocusOutId); + + if (focusWindow) { + this._hotkeyPreviewCycleInfo.appIcon._previewMenu.activateFocused(); + } + + this._hotkeyPreviewCycleInfo.appIcon.window = this._hotkeyPreviewCycleInfo.currentWindow; + delete this._hotkeyPreviewCycleInfo.appIcon._hotkeysCycle; + this._hotkeyPreviewCycleInfo = 0; + } + }, + + _optionalHotKeys: function() { + this._hotKeysEnabled = false; + if (Me.settings.get_boolean('hot-keys')) + this._enableHotKeys(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys')) + Lang.bind(this, this._enableHotKeys)(); + else + Lang.bind(this, this._disableHotKeys)(); + }) + ]); + }, + + _resetHotkeys: function() { + this._disableHotKeys(); + this._enableHotKeys(); + }, + + _enableHotKeys: function() { + if (this._hotKeysEnabled) + return; + + //3.32 introduced app hotkeys, disable them to prevent conflicts + if (Main.wm._switchToApplication) { + for (let i = 1; i < 10; ++i) { + Utils.removeKeybinding(GS_HOTKEYS_KEY + i); + } + } + + // Setup keyboard bindings for taskbar elements + let shortcutNumKeys = Me.settings.get_string('shortcut-num-keys'); + let bothNumKeys = shortcutNumKeys == 'BOTH'; + let keys = []; + + if (bothNumKeys || shortcutNumKeys == 'NUM_ROW') { + keys.push('app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-'); // Regular numbers + } + + if (bothNumKeys || shortcutNumKeys == 'NUM_KEYPAD') { + keys.push('app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-'); // Key-pad numbers + } + + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) { + let appNum = i; + + Utils.addKeybinding(key + (i + 1), Me.settings, () => this._activateApp(appNum)); + } + }, this); + + this._hotKeysEnabled = true; + + if (Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(true); + }, + + _disableHotKeys: function() { + if (!this._hotKeysEnabled) + return; + + let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-', // Regular numbers + 'app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-']; // Key-pad numbers + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) { + Utils.removeKeybinding(key + (i + 1)); + } + }, this); + + if (Main.wm._switchToApplication) { + let gsSettings = new Gio.Settings({ schema_id: imports.ui.windowManager.SHELL_KEYBINDINGS_SCHEMA }); + + for (let i = 1; i < 10; ++i) { + Utils.addKeybinding(GS_HOTKEYS_KEY + i, gsSettings, Main.wm._switchToApplication.bind(Main.wm)); + } + } + + this._hotKeysEnabled = false; + + this.taskbar.toggleNumberOverlay(false); + }, + + _optionalNumberOverlay: function() { + // Enable extra shortcut + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, this._checkHotkeysOptions) + ], [ + Me.settings, + 'changed::hotkeys-overlay-combo', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys') && Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(true); + else + this.taskbar.toggleNumberOverlay(false); + }) + ], [ + Me.settings, + 'changed::shortcut-num-keys', + () => this._resetHotkeys() + ]); + }, + + _checkHotkeysOptions: function() { + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + else + this._disableExtraShortcut(); + }, + + _enableExtraShortcut: function() { + Utils.addKeybinding('shortcut', Me.settings, () => this._showOverlay(true)); + }, + + _disableExtraShortcut: function() { + Utils.removeKeybinding('shortcut'); + }, + + _showOverlay: function(overlayFromShortcut) { + //wait for intellihide timeout initialization + if (!this._panel.intellihide) { + return; + } + + // Restart the counting if the shortcut is pressed again + if (this._numberOverlayTimeoutId) { + Mainloop.source_remove(this._numberOverlayTimeoutId); + this._numberOverlayTimeoutId = 0; + } + + let hotkey_option = Me.settings.get_string('hotkeys-overlay-combo'); + + if (hotkey_option === 'NEVER') + return; + + if (hotkey_option === 'TEMPORARILY' || overlayFromShortcut) + this.taskbar.toggleNumberOverlay(true); + + this._panel.intellihide.revealAndHold(Intellihide.Hold.TEMPORARY); + + let timeout = Me.settings.get_int('overlay-timeout'); + + if (overlayFromShortcut) { + timeout = Me.settings.get_int('shortcut-timeout'); + } + + // Hide the overlay/dock after the timeout + this._numberOverlayTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, function() { + this._numberOverlayTimeoutId = 0; + + if (hotkey_option != 'ALWAYS') { + this.taskbar.toggleNumberOverlay(false); + } + + this._panel.intellihide.release(Intellihide.Hold.TEMPORARY); + })); + }, + + _optionalClickToExit: function() { + this._clickToExitEnabled = false; + if (Me.settings.get_boolean('overview-click-to-exit')) + this._enableClickToExit(); + + this._signalsHandler.add([ + Me.settings, + 'changed::overview-click-to-exit', + Lang.bind(this, function() { + if (Me.settings.get_boolean('overview-click-to-exit')) + Lang.bind(this, this._enableClickToExit)(); + else + Lang.bind(this, this._disableClickToExit)(); + }) + ]); + }, + + _enableClickToExit: function() { + if (this._clickToExitEnabled) + return; + + let view = imports.ui.appDisplay; + this._oldOverviewReactive = Main.overview._overview.reactive + + Main.overview._overview.reactive = true; + + this._clickAction = new Clutter.ClickAction(); + this._clickAction.connect('clicked', () => { + + if (this._swiping) + return Clutter.EVENT_PROPAGATE; + + let [x, y] = global.get_pointer(); + let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); + + Main.overview.toggle(); + }); + Main.overview._overview.add_action(this._clickAction); + + this._clickToExitEnabled = true; + }, + + _disableClickToExit: function () { + if (!this._clickToExitEnabled) + return; + + Main.overview._overview.remove_action(this._clickAction); + Main.overview._overview.reactive = this._oldOverviewReactive; + + this._signalsHandler.removeWithLabel('clickToExit'); + + this._clickToExitEnabled = false; + }, + + _onSwipeBegin: function() { + this._swiping = true; + return true; + }, + + _onSwipeEnd: function() { + this._timeoutsHandler.add([ + T1, + 0, + () => this._swiping = false + ]); + return true; + }, + + _hookupAllocation: function() { + Utils.hookVfunc(OverviewControls.ControlsManagerLayout.prototype, 'allocate', function vfunc_allocate(container, box) { + const childBox = new Clutter.ActorBox(); + + const { spacing } = this; + + let startY = 0; + let startX = 0; + + if (Me.settings.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.panelBox.y === Main.layoutManager.primaryMonitor.y) { + startY = Main.layoutManager.panelBox.height; + box.y1 += startY; + } + + const panel = global.dashToPanel.panels[0]; + if(panel) { + switch (panel.getPosition()) { + case St.Side.TOP: + startY = panel.panelBox.height; + box.y1 += startY; + break; + case St.Side.LEFT: + startX = panel.panelBox.width; + box.x1 += startX; + break; + case St.Side.RIGHT: + box.x2 -= panel.panelBox.width; + break; + + } + } + + + const [width, height] = box.get_size(); + let availableHeight = height; + + // Search entry + let [searchHeight] = this._searchEntry.get_preferred_height(width); + childBox.set_origin(startX, startY); + childBox.set_size(width, searchHeight); + this._searchEntry.allocate(childBox); + + availableHeight -= searchHeight + spacing; + + // Dash + const maxDashHeight = Math.round(box.get_height() * DASH_MAX_HEIGHT_RATIO); + this._dash.setMaxSize(width, maxDashHeight); + + let [, dashHeight] = this._dash.get_preferred_height(width); + if (Me.settings.get_boolean('stockgs-keep-dash')) + dashHeight = Math.min(dashHeight, maxDashHeight); + else + dashHeight = spacing*5; // todo: determine proper spacing for window labels on maximized windows on workspace display + childBox.set_origin(startX, startY + height - dashHeight); + childBox.set_size(width, dashHeight); + this._dash.allocate(childBox); + + availableHeight -= dashHeight + spacing; + + // Workspace Thumbnails + let thumbnailsHeight = 0; + if (this._workspacesThumbnails.visible) { + const { expandFraction } = this._workspacesThumbnails; + [thumbnailsHeight] = + this._workspacesThumbnails.get_preferred_height(width); + thumbnailsHeight = Math.min( + thumbnailsHeight * expandFraction, + height * WorkspaceThumbnail.MAX_THUMBNAIL_SCALE); + childBox.set_origin(startX, startY + searchHeight + spacing); + childBox.set_size(width, thumbnailsHeight); + this._workspacesThumbnails.allocate(childBox); + } + + // Workspaces + let params = [box, startX, startY, searchHeight, dashHeight, thumbnailsHeight]; + const transitionParams = this._stateAdjustment.getStateTransitionParams(); + + // Update cached boxes + for (const state of Object.values(OverviewControls.ControlsState)) { + this._cachedWorkspaceBoxes.set( + state, this._computeWorkspacesBoxForState(state, ...params)); + } + + let workspacesBox; + if (!transitionParams.transitioning) { + workspacesBox = this._cachedWorkspaceBoxes.get(transitionParams.currentState); + } else { + const initialBox = this._cachedWorkspaceBoxes.get(transitionParams.initialState); + const finalBox = this._cachedWorkspaceBoxes.get(transitionParams.finalState); + workspacesBox = initialBox.interpolate(finalBox, transitionParams.progress); + } + + this._workspacesDisplay.allocate(workspacesBox); + + // AppDisplay + if (this._appDisplay.visible) { + const workspaceAppGridBox = + this._cachedWorkspaceBoxes.get(OverviewControls.ControlsState.APP_GRID); + + if (Config.PACKAGE_VERSION > '40.3') { + const monitor = Main.layoutManager.findMonitorForActor(this._container); + const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index); + const workAreaBox = new Clutter.ActorBox(); + + workAreaBox.set_origin(startX, startY); + workAreaBox.set_size(workArea.width, workArea.height); + + params = [workAreaBox, searchHeight, dashHeight, workspaceAppGridBox] + } else { + params = [box, startX, searchHeight, dashHeight, workspaceAppGridBox]; + } + + let appDisplayBox; + if (!transitionParams.transitioning) { + appDisplayBox = + this._getAppDisplayBoxForState(transitionParams.currentState, ...params); + } else { + const initialBox = + this._getAppDisplayBoxForState(transitionParams.initialState, ...params); + const finalBox = + this._getAppDisplayBoxForState(transitionParams.finalState, ...params); + + appDisplayBox = initialBox.interpolate(finalBox, transitionParams.progress); + } + + this._appDisplay.allocate(appDisplayBox); + } + + // Search + childBox.set_origin(0, startY + searchHeight + spacing); + childBox.set_size(width, availableHeight); + + this._searchController.allocate(childBox); + + this._runPostAllocation(); + }); + + this._oldComputeWorkspacesBoxForState = OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState; + OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState = function _computeWorkspacesBoxForState(state, box, startX, startY, searchHeight, dashHeight, thumbnailsHeight) { + const workspaceBox = box.copy(); + const [width, height] = workspaceBox.get_size(); + const { spacing } = this; + const { expandFraction } = this._workspacesThumbnails; + + switch (state) { + case OverviewControls.ControlsState.HIDDEN: + break; + case OverviewControls.ControlsState.WINDOW_PICKER: + workspaceBox.set_origin(startX, + startY + searchHeight + spacing + + thumbnailsHeight + spacing * expandFraction); + workspaceBox.set_size(width, + height - + dashHeight - spacing - + searchHeight - spacing - + thumbnailsHeight - spacing * expandFraction); + break; + case OverviewControls.ControlsState.APP_GRID: + workspaceBox.set_origin(startX, startY + searchHeight + spacing); + workspaceBox.set_size( + width, + Math.round(height * SMALL_WORKSPACE_RATIO)); + break; + } + + return workspaceBox; + } + + Utils.hookVfunc(Workspace.WorkspaceBackground.prototype, 'allocate', function vfunc_allocate(box) { + const [width, height] = box.get_size(); + const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); + const scaledHeight = height - (BACKGROUND_MARGIN * 2 * scaleFactor); + const scaledWidth = (scaledHeight / height) * width; + + const scaledBox = box.copy(); + scaledBox.set_origin( + box.x1 + (width - scaledWidth) / 2, + box.y1 + (height - scaledHeight) / 2); + scaledBox.set_size(scaledWidth, scaledHeight); + + const progress = this._stateAdjustment.value; + + if (progress === 1) + box = scaledBox; + else if (progress !== 0) + box = box.interpolate(scaledBox, progress); + + this.set_allocation(box); + + const themeNode = this.get_theme_node(); + const contentBox = themeNode.get_content_box(box); + + this._bin.allocate(contentBox); + + + const [contentWidth, contentHeight] = contentBox.get_size(); + const monitor = Main.layoutManager.monitors[this._monitorIndex]; + let xOff = (contentWidth / this._workarea.width) * + (this._workarea.x - monitor.x); + let yOff = (contentHeight / this._workarea.height) * + (this._workarea.y - monitor.y); + + let startX = -xOff; + let startY = -yOff; + const panel = Utils.find(global.dashToPanel.panels, p => p.monitor.index == this._monitorIndex); + switch (panel.getPosition()) { + case St.Side.TOP: + yOff += panel.panelBox.height; + startY -= panel.panelBox.height; + break; + case St.Side.BOTTOM: + yOff += panel.panelBox.height; + break; + case St.Side.RIGHT: + xOff += panel.panelBox.width; + break; + } + contentBox.set_origin(startX, startY); + contentBox.set_size(xOff + contentWidth, yOff + contentHeight); + this._backgroundGroup.allocate(contentBox); + }); + + } +}); diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js new file mode 100644 index 0000000..5e0b5f9 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js @@ -0,0 +1,1512 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Gtk = imports.gi.Gtk; +const Gi = imports._gi; +const AppIcons = Me.imports.appIcons; +const Utils = Me.imports.utils; +const Taskbar = Me.imports.taskbar; +const Pos = Me.imports.panelPositions; +const PanelSettings = Me.imports.panelSettings; +const PanelStyle = Me.imports.panelStyle; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const Dash = imports.ui.dash; +const CtrlAltTab = imports.ui.ctrlAltTab; +const Panel = imports.ui.panel; +const PanelMenu = imports.ui.panelMenu; +const St = imports.gi.St; +const GLib = imports.gi.GLib; +const Meta = imports.gi.Meta; +const Pango = imports.gi.Pango; +const DND = imports.ui.dnd; +const Shell = imports.gi.Shell; +const PopupMenu = imports.ui.popupMenu; +const IconGrid = imports.ui.iconGrid; +const DateMenu = imports.ui.dateMenu; +const Volume = imports.ui.status.volume; +const Progress = Me.imports.progress; + +const Intellihide = Me.imports.intellihide; +const Transparency = Me.imports.transparency; +const _ = imports.gettext.domain(Me.imports.utils.TRANSLATION_DOMAIN).gettext; + +let tracker = Shell.WindowTracker.get_default(); +var panelBoxes = ['_leftBox', '_centerBox', '_rightBox']; + +//timeout names +const T1 = 'startDynamicTransparencyTimeout'; +const T2 = 'startIntellihideTimeout'; +const T3 = 'allocationThrottleTimeout'; +const T4 = 'showDesktopTimeout'; +const T5 = 'trackerFocusAppTimeout'; +const T6 = 'scrollPanelDelayTimeout'; +const T7 = 'waitPanelBoxAllocation'; + +var dtpPanel = Utils.defineClass({ + Name: 'DashToPanel-Panel', + Extends: St.Widget, + + _init: function(panelManager, monitor, panelBox, isStandalone) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this.panelManager = panelManager; + this.panelStyle = new PanelStyle.dtpPanelStyle(); + + this.monitor = monitor; + this.panelBox = panelBox; + + // when the original gnome-shell top panel is kept, all panels are "standalone", + // so in this case use isPrimary to get the panel on the primary dtp monitor, which + // might be different from the system's primary monitor. + this.isStandalone = isStandalone; + this.isPrimary = !isStandalone || (Me.settings.get_boolean('stockgs-keep-top-panel') && + monitor == panelManager.dtpPrimaryMonitor); + + this._sessionStyle = null; + this._unmappedButtons = []; + this._elementGroups = []; + this.cornerSize = 0; + + let position = this.getPosition(); + + if (isStandalone) { + this.panel = new dtpSecondaryPanel({ name: 'panel', reactive: true }); + this.statusArea = this.panel.statusArea = {}; + + Utils.wrapActor(this.panel); + + //next 3 functions are needed by other extensions to add elements to the secondary panel + this.panel.addToStatusArea = function(role, indicator, position, box) { + return Main.panel.addToStatusArea.call(this, role, indicator, position, box); + }; + + this.panel._addToPanelBox = function(role, indicator, position, box) { + Main.panel._addToPanelBox.call(this, role, indicator, position, box); + }; + + this.panel._onMenuSet = function(indicator) { + Main.panel._onMenuSet.call(this, indicator); + }; + + this._leftBox = this.panel._leftBox = new St.BoxLayout({ name: 'panelLeft' }); + this._centerBox = this.panel._centerBox = new St.BoxLayout({ name: 'panelCenter' }); + this._rightBox = this.panel._rightBox = new St.BoxLayout({ name: 'panelRight' }); + + this.menuManager = this.panel.menuManager = new PopupMenu.PopupMenuManager(this.panel); + + this._setPanelMenu('aggregateMenu', dtpSecondaryAggregateMenu, this.panel.actor); + this._setPanelMenu('dateMenu', DateMenu.DateMenuButton, this.panel.actor); + this._setPanelMenu('activities', Panel.ActivitiesButton, this.panel.actor); + + this.panel.add_child(this._leftBox); + this.panel.add_child(this._centerBox); + this.panel.add_child(this._rightBox); + } else { + this.panel = Main.panel; + this.statusArea = Main.panel.statusArea; + this.menuManager = Main.panel.menuManager; + + panelBoxes.forEach(p => this[p] = Main.panel[p]); + + ['activities', 'aggregateMenu', 'dateMenu'].forEach(b => { + let container = this.statusArea[b].container; + let parent = container.get_parent(); + + container._dtpOriginalParent = parent; + parent ? parent.remove_child(container) : null; + this.panel.actor.add_child(container); + }); + } + + // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of + // its behavior is handled by the taskbar, but its positioning is done at the panel level + this.showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this); + this.panel.actor.add_child(this.showAppsIconWrapper.realShowAppsIcon); + + this.panel.actor._delegate = this; + + Utils.wrapActor(this.statusArea.activities); + + this.add_child(this.panel.actor); + + if (Main.panel._onButtonPress || Main.panel._tryDragWindow) { + this._signalsHandler.add([ + this.panel.actor, + [ + 'button-press-event', + 'touch-event' + ], + this._onButtonPress.bind(this) + ]); + } + + if (Main.panel._onKeyPress) { + this._signalsHandler.add([this.panel.actor, 'key-press-event', Main.panel._onKeyPress.bind(this)]); + } + + Main.ctrlAltTabManager.addGroup(this, _("Top Bar")+" "+ monitor.index, 'focus-top-bar-symbolic', + { sortGroup: CtrlAltTab.SortGroup.TOP }); + }, + + enable : function() { + let position = this.getPosition(); + + if (this.statusArea.aggregateMenu) { + Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll = 1; + } + + this.geom = this.getGeometry(); + + // The overview uses the panel height as a margin by way of a "ghost" transparent Clone + // This pushes everything down, which isn't desired when the panel is moved to the bottom + // I'm adding a 2nd ghost panel and will resize the top or bottom ghost depending on the panel position + this._myPanelGhost = new Clutter.Actor({ + x: this.geom.x, + y: this.geom.y , + reactive: false, + opacity: 0 + }); + + let isTop = this.geom.position == St.Side.TOP; + + if (isTop) { + this.panel._leftCorner = this.panel._leftCorner || new Panel.PanelCorner(St.Side.LEFT); + this.panel._rightCorner = this.panel._rightCorner || new Panel.PanelCorner(St.Side.RIGHT); + + Main.overview._overview.insert_child_at_index(this._myPanelGhost, 0); + } else { + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + Main.overview._overview.add_actor(this._myPanelGhost); + } + + if (this.panel._leftCorner) { + Utils.wrapActor(this.panel._leftCorner); + Utils.wrapActor(this.panel._rightCorner); + + if (isTop) { + if (this.isStandalone) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + } else if (Config.PACKAGE_VERSION >= '3.32') { + this.panel.actor.remove_child(this.panel._leftCorner.actor); + this.panel.actor.remove_child(this.panel._rightCorner.actor); + } + } + + this._setPanelPosition(); + + if (!this.isStandalone) { + if (this.panel.vfunc_allocate) { + this._panelConnectId = 0; + Utils.hookVfunc(this.panel.__proto__, 'allocate', (box, flags) => this._mainPanelAllocate(0, box, flags)); + } else { + this._panelConnectId = this.panel.actor.connect('allocate', (actor, box, flags) => this._mainPanelAllocate(actor, box, flags)); + } + + // remove the extra space before the clock when the message-indicator is displayed + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', () => [0,0]); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', () => [0,0]); + } + } + + if (!DateMenu.IndicatorPad && this.statusArea.dateMenu) { + //3.36 switched to a size constraint applied on an anonymous child + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints = indicatorPad.get_constraints(); + indicatorPad.clear_constraints(); + } + + // The main panel's connection to the "allocate" signal is competing with this extension + // trying to move the centerBox over to the right, creating a never-ending cycle. + // Since we don't have the ID to disconnect that handler, wrap the allocate() function + // it calls instead. If the call didn't originate from this file, ignore it. + panelBoxes.forEach(b => { + this[b].allocate = (box, flags, isFromDashToPanel) => { + if (isFromDashToPanel) { + Utils.allocate(this[b], box, flags, true); + } + } + }); + + this.menuManager._oldChangeMenu = this.menuManager._changeMenu; + this.menuManager._changeMenu = (menu) => { + if (!Me.settings.get_boolean('stockgs-panelbtn-click-only')) { + this.menuManager._oldChangeMenu(menu); + } + }; + + this.dynamicTransparency = new Transparency.DynamicTransparency(this); + + this.taskbar = new Taskbar.taskbar(this); + + this.panel.actor.add_child(this.taskbar.actor); + + this._setAppmenuVisible(Me.settings.get_boolean('show-appmenu')); + this._setShowDesktopButton(true); + + this._setAllocationMap(); + + this.panel.actor.add_style_class_name('dashtopanelMainPanel ' + this.getOrientation()); + + this._setPanelGhostSize(); + + this._timeoutsHandler.add([T2, Me.settings.get_int('intellihide-enable-start-delay'), () => this.intellihide = new Intellihide.Intellihide(this)]); + + this._signalsHandler.add( + // this is to catch changes to the theme or window scale factor + [ + Utils.getStageTheme(), + 'changed', + () => (this._resetGeometry(), this._setShowDesktopButtonStyle()), + ], + [ + // sync hover after a popupmenu is closed + this.taskbar, + 'menu-closed', + Lang.bind(this, function(){this.panel.actor.sync_hover();}) + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._adjustForOverview() + ], + [ + Main.overview, + 'hidden', + () => { + if (this.isPrimary) { + //reset the primary monitor when exiting the overview + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this.statusArea.activities.actor, + 'captured-event', + (actor, e) => { + // todo this is not being called right now, so the overview is not shown on the correct monitor + if (e.type() == Clutter.EventType.BUTTON_PRESS || e.type() == Clutter.EventType.TOUCH_BEGIN) { + //temporarily use as primary the monitor on which the activities btn was clicked + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this._centerBox, + 'actor-added', + () => this._onBoxActorAdded(this._centerBox) + ], + [ + this._rightBox, + 'actor-added', + () => this._onBoxActorAdded(this._rightBox) + ], + [ + this.panel.actor, + 'scroll-event', + this._onPanelMouseScroll.bind(this) + ], + [ + Main.layoutManager, + 'startup-complete', + () => this._resetGeometry() + ] + ); + + this._bindSettingsChanges(); + + this.panelStyle.enable(this); + + if (this.checkIfVertical()) { + this._signalsHandler.add([ + this.panelBox, + 'notify::visible', + () => { + if (this.panelBox.visible) { + this._refreshVerticalAlloc(); + } + } + ]); + + this._setSearchEntryOffset(this.geom.w); + + if (this.statusArea.dateMenu) { + this._formatVerticalClock(); + + this._signalsHandler.add([ + this.statusArea.dateMenu._clock, + 'notify::clock', + () => this._formatVerticalClock() + ]); + } + } + + // Since we are usually visible but not usually changing, make sure + // most repaint requests don't actually require us to repaint anything. + // This saves significant CPU when repainting the screen. + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this._initProgressManager(); + }, + + disable: function () { + this.panelStyle.disable(); + + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + this._disablePanelCornerSignals(); + + this.panel.actor.remove_child(this.taskbar.actor); + this._setAppmenuVisible(false); + + if (this.intellihide) { + this.intellihide.destroy(); + } + + this.dynamicTransparency.destroy(); + + this.progressManager.destroy(); + + this.taskbar.destroy(); + this.showAppsIconWrapper.destroy(); + + this.menuManager._changeMenu = this.menuManager._oldChangeMenu; + + this._myPanelGhost.get_parent().remove_actor(this._myPanelGhost); + this._setSearchEntryOffset(0); + + panelBoxes.forEach(b => delete this[b].allocate); + this._unmappedButtons.forEach(a => this._disconnectVisibleId(a)); + + if (this._dateMenuIndicatorPadContraints && this.statusArea.dateMenu) { + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints.forEach(c => indicatorPad.add_constraint(c)); + } + + this._setVertical(this.panel.actor, false); + + if (!this.isStandalone) { + this.statusArea.dateMenu._clockDisplay.text = this.statusArea.dateMenu._clock.clock; + + ['vertical', 'horizontal', 'dashtopanelMainPanel'].forEach(c => this.panel.actor.remove_style_class_name(c)); + + if (!Main.sessionMode.isLocked) { + [['activities', 0], ['aggregateMenu', -1], ['dateMenu', 0]].forEach(b => { + let container = this.statusArea[b[0]].container; + let originalParent = container._dtpOriginalParent; + + this.panel.actor.remove_child(container); + originalParent ? originalParent.insert_child_at_index(container, b[1]) : null; + delete container._dtpOriginalParent; + }); + } + + if (!this.panel._leftCorner.actor.mapped) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + + this._setShowDesktopButton(false); + + delete Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll; + + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_width); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_height); + } + + if (this._panelConnectId) { + this.panel.actor.disconnect(this._panelConnectId); + } else { + Utils.hookVfunc(this.panel.__proto__, 'allocate', this.panel.__proto__.vfunc_allocate); + } + + this.panel.actor._delegate = this.panel; + } else { + this._removePanelMenu('dateMenu'); + this._removePanelMenu('aggregateMenu'); + this._removePanelMenu('activities'); + } + + Main.ctrlAltTabManager.removeGroup(this); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + + // open overview so they can choose a window for focusing + // and ultimately dropping dragged item onto + if(Main.overview.shouldToggleByCornerOrButton()) + Main.overview.show(); + } + + return DND.DragMotionResult.CONTINUE; + }, + + getPosition: function() { + let position = PanelSettings.getPanelPosition(Me.settings, this.monitor.index); + + if (position == Pos.TOP) { + return St.Side.TOP; + } else if (position == Pos.RIGHT) { + return St.Side.RIGHT; + } else if (position == Pos.BOTTOM) { + return St.Side.BOTTOM; + } + + return St.Side.LEFT; + }, + + checkIfVertical: function() { + let position = this.getPosition(); + + return (position == St.Side.LEFT || position == St.Side.RIGHT); + }, + + getOrientation: function() { + return (this.checkIfVertical() ? 'vertical' : 'horizontal'); + }, + + updateElementPositions: function() { + let panelPositions = this.panelManager.panelsElementPositions[this.monitor.index] || Pos.defaults; + + this._updateGroupedElements(panelPositions); + + this._disablePanelCornerSignals(); + + if (this.getPosition() == St.Side.TOP) { + let visibleElements = panelPositions.filter(pp => pp.visible); + let connectCorner = (corner, button) => { + corner._button = button; + corner._buttonStyleChangedSignalId = button.connect('style-changed', () => { + corner.set_style_pseudo_class(button.get_style_pseudo_class()); + }); + } + + if (visibleElements[0].element == Pos.ACTIVITIES_BTN) { + connectCorner(this.panel._leftCorner, this.statusArea.activities); + } + + if (visibleElements[visibleElements.length - 1].element == Pos.SYSTEM_MENU) { + connectCorner(this.panel._rightCorner, this.statusArea.aggregateMenu); + } + } + + this.panel.actor.hide(); + this.panel.actor.show(); + }, + + _updateGroupedElements: function(panelPositions) { + let previousPosition = 0; + let previousCenteredPosition = 0; + let currentGroup = -1; + + this._elementGroups = []; + + panelPositions.forEach(pos => { + let allocationMap = this.allocationMap[pos.element]; + + if (allocationMap.actor) { + allocationMap.actor.visible = pos.visible; + + if (!pos.visible) { + return; + } + + let currentPosition = pos.position; + let isCentered = Pos.checkIfCentered(currentPosition); + + if (currentPosition == Pos.STACKED_TL && previousPosition == Pos.STACKED_BR) { + currentPosition = Pos.STACKED_BR; + } + + if (!previousPosition || + (previousPosition == Pos.STACKED_TL && currentPosition != Pos.STACKED_TL) || + (previousPosition != Pos.STACKED_BR && currentPosition == Pos.STACKED_BR) || + (isCentered && previousPosition != currentPosition && previousPosition != Pos.STACKED_BR)) { + this._elementGroups[++currentGroup] = { elements: [], index: this._elementGroups.length, expandableIndex: -1 }; + previousCenteredPosition = 0; + } + + if (pos.element == Pos.TASKBAR) { + this._elementGroups[currentGroup].expandableIndex = this._elementGroups[currentGroup].elements.length; + } + + if (isCentered && !this._elementGroups[currentGroup].isCentered) { + this._elementGroups[currentGroup].isCentered = 1; + previousCenteredPosition = currentPosition; + } + + this._elementGroups[currentGroup].position = previousCenteredPosition || currentPosition; + this._elementGroups[currentGroup].elements.push(allocationMap); + + allocationMap.position = currentPosition; + previousPosition = currentPosition; + } + }); + }, + + _disablePanelCornerSignals: function() { + if (this.panel._rightCorner && this.panel._rightCorner._buttonStyleChangedSignalId) { + this.panel._rightCorner._button.disconnect(this.panel._rightCorner._buttonStyleChangedSignalId); + delete this.panel._rightCorner._buttonStyleChangedSignalId; + } + + if (this.panel._leftCorner && this.panel._leftCorner._buttonStyleChangedSignalId) { + this.panel._leftCorner._button.disconnect(this.panel._leftCorner._buttonStyleChangedSignalId); + delete this.panel._leftCorner._buttonStyleChangedSignalId; + } + }, + + _bindSettingsChanges: function() { + let isVertical = this.checkIfVertical(); + + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::panel-sizes', + 'changed::group-apps' + ], + () => this._resetGeometry() + ], + [ + Me.settings, + [ + 'changed::appicon-margin', + 'changed::appicon-padding' + ], + () => this.taskbar.resetAppIcons() + ], + [ + Me.settings, + 'changed::show-appmenu', + () => this._setAppmenuVisible(Me.settings.get_boolean('show-appmenu')) + ], + [ + Me.settings, + [ + 'changed::showdesktop-button-width', + 'changed::trans-use-custom-bg', + 'changed::desktop-line-use-custom-color', + 'changed::desktop-line-custom-color', + 'changed::trans-bg-color' + ], + () => this._setShowDesktopButtonStyle() + ], + [ + Me.desktopSettings, + 'changed::clock-format', + () => { + this._clockFormat = null; + + if (isVertical) { + this._formatVerticalClock(); + } + } + ], + [ + Me.settings, + 'changed::progress-show-bar', + () => this._initProgressManager() + ], + [ + Me.settings, + 'changed::progress-show-count', + () => this._initProgressManager() + ] + ); + + if (isVertical) { + this._signalsHandler.add([Me.settings, 'changed::group-apps-label-max-width', () => this._resetGeometry()]); + } + }, + + _setPanelMenu: function(propName, constr, container) { + if (!this.statusArea[propName]) { + this.statusArea[propName] = this._getPanelMenu(propName, constr); + this.menuManager.addMenu(this.statusArea[propName].menu); + container.insert_child_at_index(this.statusArea[propName].container, 0); + } + }, + + _removePanelMenu: function(propName) { + if (this.statusArea[propName]) { + let parent = this.statusArea[propName].container.get_parent(); + + if (parent) { + parent.remove_actor(this.statusArea[propName].container); + } + + //calling this.statusArea[propName].destroy(); is buggy for now, gnome-shell never + //destroys those panel menus... + //since we can't destroy the menu (hence properly disconnect its signals), let's + //store it so the next time a panel needs one of its kind, we can reuse it instead + //of creating a new one + let panelMenu = this.statusArea[propName]; + + this.menuManager.removeMenu(panelMenu.menu); + Me.persistentStorage[propName].push(panelMenu); + this.statusArea[propName] = null; + } + }, + + _getPanelMenu: function(propName, constr) { + Me.persistentStorage[propName] = Me.persistentStorage[propName] || []; + + if (!Me.persistentStorage[propName].length) { + Me.persistentStorage[propName].push(new constr()); + } + + return Me.persistentStorage[propName].pop(); + }, + + _setPanelGhostSize: function() { + this._myPanelGhost.set_size(this.width, this.checkIfVertical() ? 1 : this.height); + }, + + _setSearchEntryOffset: function(offset) { + if (this.isPrimary) { + //In the overview, when the panel is vertical the search-entry is the only element + //that doesn't natively take into account the size of a side dock, as it is always + //centered relatively to the monitor. This looks misaligned, adjust it here so it + //is centered like the rest of the overview elements. + let paddingSide = this.getPosition() == St.Side.LEFT ? 'left' : 'right'; + let scaleFactor = Utils.getScaleFactor(); + let style = offset ? 'padding-' + paddingSide + ':' + (offset / scaleFactor) + 'px;' : null; + let searchEntry = Main.overview._overview._controls._searchEntry; + searchEntry.get_parent().set_style(style); + } + }, + + _adjustForOverview: function() { + let isFocusedMonitor = this.panelManager.checkIfFocusedMonitor(this.monitor); + let isOverview = !!Main.overview.visibleTarget; + let isOverviewFocusedMonitor = isOverview && isFocusedMonitor; + let isShown = !isOverview || isOverviewFocusedMonitor; + + this.panelBox[isShown ? 'show' : 'hide'](); + + if (isOverview) { + this._myPanelGhost[isOverviewFocusedMonitor ? 'show' : 'hide'](); + + if (isOverviewFocusedMonitor) { + Utils.getPanelGhost().set_size(1, this.geom.position == St.Side.TOP ? 0 : 32); + } + } + }, + + _resetGeometry: function() { + this.geom = this.getGeometry(); + this._setPanelGhostSize(); + this._setPanelPosition(); + this.taskbar.resetAppIcons(true); + this.dynamicTransparency.updateExternalStyle(); + + if (this.intellihide && this.intellihide.enabled) { + this.intellihide.reset(); + } + + if (this.checkIfVertical()) { + this.showAppsIconWrapper.realShowAppsIcon.toggleButton.set_width(this.geom.w); + this._refreshVerticalAlloc(); + this._setSearchEntryOffset(this.geom.w); + } + }, + + getGeometry: function() { + let scaleFactor = Utils.getScaleFactor(); + let panelBoxTheme = this.panelBox.get_theme_node(); + let lrPadding = panelBoxTheme.get_padding(St.Side.RIGHT) + panelBoxTheme.get_padding(St.Side.LEFT); + let topPadding = panelBoxTheme.get_padding(St.Side.TOP); + let tbPadding = topPadding + panelBoxTheme.get_padding(St.Side.BOTTOM); + let position = this.getPosition(); + let length = PanelSettings.getPanelLength(Me.settings, this.monitor.index) / 100; + let anchor = PanelSettings.getPanelAnchor(Me.settings, this.monitor.index); + let anchorPlaceOnMonitor = 0; + let gsTopPanelOffset = 0; + let x = 0, y = 0; + let w = 0, h = 0; + + const panelSize = PanelSettings.getPanelSize(Me.settings, this.monitor.index); + this.dtpSize = panelSize * scaleFactor; + + if (Me.settings.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.primaryMonitor == this.monitor) { + gsTopPanelOffset = Main.layoutManager.panelBox.height - topPadding; + } + + if (this.checkIfVertical()) { + if (!Me.settings.get_boolean('group-apps')) { + // add window title width and side padding of _dtpIconContainer when vertical + this.dtpSize += Me.settings.get_int('group-apps-label-max-width') + AppIcons.DEFAULT_PADDING_SIZE * 2 / scaleFactor; + } + + this.sizeFunc = 'get_preferred_height', + this.fixedCoord = { c1: 'x1', c2: 'x2' }, + this.varCoord = { c1: 'y1', c2: 'y2' }; + + w = this.dtpSize; + h = this.monitor.height * length - tbPadding - gsTopPanelOffset; + } else { + this.sizeFunc = 'get_preferred_width'; + this.fixedCoord = { c1: 'y1', c2: 'y2' }; + this.varCoord = { c1: 'x1', c2: 'x2' }; + + w = this.monitor.width * length - lrPadding; + h = this.dtpSize; + } + + if (position == St.Side.TOP || position == St.Side.LEFT) { + x = this.monitor.x; + y = this.monitor.y + gsTopPanelOffset; + } else if (position == St.Side.RIGHT) { + x = this.monitor.x + this.monitor.width - this.dtpSize - lrPadding; + y = this.monitor.y + gsTopPanelOffset; + } else { //BOTTOM + x = this.monitor.x; + y = this.monitor.y + this.monitor.height - this.dtpSize - tbPadding; + } + + if (this.checkIfVertical()) { + let viewHeight = this.monitor.height - gsTopPanelOffset; + + if (anchor === Pos.MIDDLE) { + anchorPlaceOnMonitor = (viewHeight - h) / 2; + } else if (anchor === Pos.END) { + anchorPlaceOnMonitor = viewHeight - h; + } else { // Pos.START + anchorPlaceOnMonitor = 0; + } + y = y + anchorPlaceOnMonitor; + } else { + if (anchor === Pos.MIDDLE) { + anchorPlaceOnMonitor = (this.monitor.width - w) / 2; + } else if (anchor === Pos.END) { + anchorPlaceOnMonitor = this.monitor.width - w; + } else { // Pos.START + anchorPlaceOnMonitor = 0; + } + x = x + anchorPlaceOnMonitor; + } + + return { + x: x, y: y, + w: w, h: h, + lrPadding: lrPadding, + tbPadding: tbPadding, + position: position + }; + }, + + _setAllocationMap: function() { + this.allocationMap = {}; + let setMap = (name, actor, isBox) => this.allocationMap[name] = { + actor: actor, + isBox: isBox || 0, + box: new Clutter.ActorBox() + }; + + setMap(Pos.SHOW_APPS_BTN, this.showAppsIconWrapper.realShowAppsIcon); + setMap(Pos.ACTIVITIES_BTN, this.statusArea.activities ? this.statusArea.activities.container : 0); + setMap(Pos.LEFT_BOX, this._leftBox, 1); + setMap(Pos.TASKBAR, this.taskbar.actor); + setMap(Pos.CENTER_BOX, this._centerBox, 1); + setMap(Pos.DATE_MENU, this.statusArea.dateMenu.container); + setMap(Pos.SYSTEM_MENU, this.statusArea.aggregateMenu.container); + setMap(Pos.RIGHT_BOX, this._rightBox, 1); + setMap(Pos.DESKTOP_BTN, this._showDesktopButton); + }, + + _mainPanelAllocate: function(actor, box, flags) { + Utils.setAllocation(this.panel.actor, box, flags); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + + let fixed = 0; + let centeredMonitorGroup; + let panelAlloc = new Clutter.ActorBox({ x1: 0, y1: 0, x2: this.geom.w, y2: this.geom.h }); + let assignGroupSize = (group, update) => { + group.size = 0; + group.tlOffset = 0; + group.brOffset = 0; + + group.elements.forEach(element => { + if (!update) { + element.box[this.fixedCoord.c1] = panelAlloc[this.fixedCoord.c1]; + element.box[this.fixedCoord.c2] = panelAlloc[this.fixedCoord.c2]; + element.natSize = element.actor[this.sizeFunc](-1)[1]; + } + + if (!group.isCentered || Pos.checkIfCentered(element.position)) { + group.size += element.natSize; + } else if (element.position == Pos.STACKED_TL) {  + group.tlOffset += element.natSize; + } else { // Pos.STACKED_BR + group.brOffset += element.natSize; + } + }); + + if (group.isCentered) { + group.size += Math.max(group.tlOffset, group.brOffset) * 2; + group.tlOffset = Math.max(group.tlOffset - group.brOffset, 0); + } + }; + let allocateGroup = (group, tlLimit, brLimit) => { + let startPosition = tlLimit; + let currentPosition = 0; + + if (group.expandableIndex >= 0) { + let availableSize = brLimit - tlLimit; + let expandable = group.elements[group.expandableIndex]; + let i = 0; + let l = this._elementGroups.length; + let tlSize = 0; + let brSize = 0; + + if (centeredMonitorGroup && (centeredMonitorGroup != group || expandable.position != Pos.CENTERED_MONITOR)) { + if (centeredMonitorGroup.index < group.index || (centeredMonitorGroup == group && expandable.position == Pos.STACKED_TL)) { + i = centeredMonitorGroup.index; + } else { + l = centeredMonitorGroup.index; + } + } + + for (; i < l; ++i) { + let refGroup = this._elementGroups[i]; + + if (i < group.index && (!refGroup.fixed || refGroup[this.varCoord.c2] > tlLimit)) { + tlSize += refGroup.size; + } else if (i > group.index && (!refGroup.fixed || refGroup[this.varCoord.c1] < brLimit)) { + brSize += refGroup.size; + } + } + + if (group.isCentered) { + availableSize -= Math.max(tlSize, brSize) * 2; + } else { + availableSize -= tlSize + brSize; + } + + if (availableSize < group.size) { + expandable.natSize -= (group.size - availableSize) * (group.isCentered && !Pos.checkIfCentered(expandable.position) ? .5 : 1); + assignGroupSize(group, true); + } + } + + if (group.isCentered) { + startPosition = tlLimit + (brLimit - tlLimit - group.size) * .5; + } else if (group.position == Pos.STACKED_BR) { + startPosition = brLimit - group.size; + } + + currentPosition = group.tlOffset + startPosition; + + group.elements.forEach(element => { + element.box[this.varCoord.c1] = Math.round(currentPosition); + element.box[this.varCoord.c2] = Math.round((currentPosition += element.natSize)); + + if (element.isBox) { + return element.actor.allocate(element.box, flags, true); + } + + Utils.allocate(element.actor, element.box, flags, false); + }); + + group[this.varCoord.c1] = startPosition; + group[this.varCoord.c2] = currentPosition; + group.fixed = 1; + ++fixed; + }; + + Utils.allocate(this.panel.actor, panelAlloc, flags); + + this._elementGroups.forEach(group => { + group.fixed = 0; + + assignGroupSize(group); + + if (group.position == Pos.CENTERED_MONITOR) { + centeredMonitorGroup = group; + } + }); + + if (centeredMonitorGroup) { + allocateGroup(centeredMonitorGroup, panelAlloc[this.varCoord.c1], panelAlloc[this.varCoord.c2]); + } + + let iterations = 0; //failsafe + while (fixed < this._elementGroups.length && ++iterations < 10) { + for (let i = 0, l = this._elementGroups.length; i < l; ++i) { + let group = this._elementGroups[i]; + + if (group.fixed) { + continue; + } + + let prevGroup = this._elementGroups[i - 1]; + let nextGroup = this._elementGroups[i + 1]; + let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : + centeredMonitorGroup && group.index > centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c2] : panelAlloc[this.varCoord.c1]; + let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : + centeredMonitorGroup && group.index < centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c1] : panelAlloc[this.varCoord.c2]; + + if (group.position == Pos.STACKED_TL) { + allocateGroup(group, panelAlloc[this.varCoord.c1], nextLimit); + } else if (group.position == Pos.STACKED_BR) { + allocateGroup(group, prevLimit, panelAlloc[this.varCoord.c2]); + } else if ((!prevGroup || prevGroup.fixed) && (!nextGroup || nextGroup.fixed)) { // CENTERED + allocateGroup(group, prevLimit, nextLimit); + } + } + } + + if (this.geom.position == St.Side.TOP) { + let childBoxLeftCorner = new Clutter.ActorBox(); + let childBoxRightCorner = new Clutter.ActorBox(); + let currentCornerSize = this.cornerSize; + let panelAllocFixedSize = box[this.fixedCoord.c2] - box[this.fixedCoord.c1]; + + [ , this.cornerSize] = this.panel._leftCorner.actor[this.sizeFunc](-1); + childBoxLeftCorner[this.varCoord.c1] = 0; + childBoxLeftCorner[this.varCoord.c2] = this.cornerSize; + childBoxLeftCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxLeftCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + childBoxRightCorner[this.varCoord.c1] = box[this.varCoord.c2] - this.cornerSize; + childBoxRightCorner[this.varCoord.c2] = box[this.varCoord.c2]; + childBoxRightCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxRightCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + Utils.allocate(this.panel._leftCorner.actor, childBoxLeftCorner, flags); + Utils.allocate(this.panel._rightCorner.actor, childBoxRightCorner, flags); + + if (this.cornerSize != currentCornerSize) { + this._setPanelClip(); + } + } + }, + + _setPanelPosition: function() { + let clipContainer = this.panelBox.get_parent(); + + this.set_size(this.geom.w, this.geom.h); + clipContainer.set_position(this.geom.x, this.geom.y); + + this._setVertical(this.panel.actor, this.checkIfVertical()); + + // styles for theming + Object.keys(St.Side).forEach(p => { + let cssName = 'dashtopanel' + p.charAt(0) + p.slice(1).toLowerCase(); + + this.panel.actor[(St.Side[p] == this.geom.position ? 'add' : 'remove') + '_style_class_name'](cssName); + }); + + this._setPanelClip(clipContainer); + + Main.layoutManager._updateHotCorners(); + Main.layoutManager._updatePanelBarrier(this); + }, + + _setPanelClip: function(clipContainer) { + clipContainer = clipContainer || this.panelBox.get_parent(); + this._timeoutsHandler.add([T7, 0, () => Utils.setClip(clipContainer, clipContainer.x, clipContainer.y, this.panelBox.width, this.panelBox.height + this.cornerSize)]); + }, + + _onButtonPress: function(actor, event) { + let type = event.type(); + let isPress = type == Clutter.EventType.BUTTON_PRESS; + let button = isPress ? event.get_button() : -1; + let [stageX, stageY] = event.get_coords(); + + if (button == 3 && global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, stageX, stageY) == this.panel.actor) { + //right click on an empty part of the panel, temporarily borrow and display the showapps context menu + Main.layoutManager.setDummyCursorGeometry(stageX, stageY, 0, 0); + + this.showAppsIconWrapper.createMenu(); + this.showAppsIconWrapper._menu.sourceActor = Main.layoutManager.dummyCursor; + this.showAppsIconWrapper.popupMenu(); + + return Clutter.EVENT_STOP; + } else if (Main.modalCount > 0 || event.get_source() != actor || + (!isPress && type != Clutter.EventType.TOUCH_BEGIN) || + (isPress && button != 1)) { + return Clutter.EVENT_PROPAGATE; + } + + let params = this.checkIfVertical() ? [stageY, 'y', 'height'] : [stageX, 'x', 'width']; + let dragWindow = this._getDraggableWindowForPosition.apply(this, params.concat(['maximized_' + this.getOrientation() + 'ly'])); + + if (!dragWindow) + return Clutter.EVENT_PROPAGATE; + + global.display.begin_grab_op(dragWindow, + Meta.GrabOp.MOVING, + false, /* pointer grab */ + true, /* frame action */ + button, + event.get_state(), + event.get_time(), + stageX, stageY); + + return Clutter.EVENT_STOP; + }, + + _getDraggableWindowForPosition: function(stageCoord, coord, dimension, maximizedProp) { + let workspace = Utils.getCurrentWorkspace(); + let allWindowsByStacking = global.display.sort_windows_by_stacking( + workspace.list_windows() + ).reverse(); + + return Utils.find(allWindowsByStacking, metaWindow => { + let rect = metaWindow.get_frame_rect(); + + return metaWindow.get_monitor() == this.monitor.index && + metaWindow.showing_on_its_workspace() && + metaWindow.get_window_type() != Meta.WindowType.DESKTOP && + metaWindow[maximizedProp] && + stageCoord > rect[coord] && stageCoord < rect[coord] + rect[dimension]; + }); + }, + + _onBoxActorAdded: function(box) { + if (this.checkIfVertical()) { + this._setVertical(box, true); + } + }, + + _refreshVerticalAlloc: function() { + this._setVertical(this._centerBox, true); + this._setVertical(this._rightBox, true); + this._formatVerticalClock(); + }, + + _setVertical: function(actor, isVertical) { + let _set = (actor, isVertical) => { + if (!actor || actor instanceof Dash.DashItemContainer || actor instanceof Taskbar.TaskbarItemContainer) { + return; + } + + if (actor instanceof St.BoxLayout) { + actor.vertical = isVertical; + } else if ((actor._delegate || actor) instanceof PanelMenu.ButtonBox && actor != this.statusArea.appMenu) { + let child = actor.get_first_child(); + + if (isVertical && !actor.visible && !actor._dtpVisibleId) { + this._unmappedButtons.push(actor); + actor._dtpVisibleId = actor.connect('notify::visible', () => { + this._disconnectVisibleId(actor); + this._refreshVerticalAlloc(); + }); + actor._dtpDestroyId = actor.connect('destroy', () => this._disconnectVisibleId(actor)); + } + + if (child) { + let [, natWidth] = actor.get_preferred_width(-1); + + child.x_align = Clutter.ActorAlign[isVertical ? 'CENTER' : 'START']; + actor.set_width(isVertical ? this.dtpSize : -1); + isVertical = isVertical && (natWidth > this.dtpSize); + actor[(isVertical ? 'add' : 'remove') + '_style_class_name']('vertical'); + } + } + + actor.get_children().forEach(c => _set(c, isVertical)); + }; + + _set(actor, false); + _set(actor, isVertical); + }, + + _disconnectVisibleId: function(actor) { + actor.disconnect(actor._dtpVisibleId); + actor.disconnect(actor._dtpDestroyId); + + delete actor._dtpVisibleId; + delete actor._dtpDestroyId; + + this._unmappedButtons.splice(this._unmappedButtons.indexOf(actor), 1); + }, + + _setAppmenuVisible: function(isVisible) { + let parent; + let appMenu = this.statusArea.appMenu; + + if(appMenu) + parent = appMenu.container.get_parent(); + + if (parent) { + parent.remove_child(appMenu.container); + } + + if (isVisible && appMenu) { + this._leftBox.insert_child_above(appMenu.container, null); + } + }, + + _formatVerticalClock: function() { + // https://github.com/GNOME/gnome-desktop/blob/master/libgnome-desktop/gnome-wall-clock.c#L310 + if (this.statusArea.dateMenu) { + let datetime = this.statusArea.dateMenu._clock.clock; + let datetimeParts = datetime.split(' '); + let time = datetimeParts[1]; + let clockText = this.statusArea.dateMenu._clockDisplay.clutter_text; + let setClockText = text => { + let stacks = text instanceof Array; + let separator = '\n‧‧\n'; + + clockText.set_text((stacks ? text.join(separator) : text).trim()); + clockText.set_use_markup(stacks); + clockText.get_allocation_box(); + + return !clockText.get_layout().is_ellipsized(); + }; + + if (clockText.ellipsize == Pango.EllipsizeMode.NONE) { + //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back + clockText.ellipsize = Pango.EllipsizeMode.END; + } + + if (!time) { + datetimeParts = datetime.split(' '); + time = datetimeParts.pop(); + datetimeParts = [datetimeParts.join(' '), time]; + } + + if (!setClockText(datetime) && + !setClockText(datetimeParts) && + !setClockText(time)) { + let timeParts = time.split('∶'); + + if (!this._clockFormat) { + this._clockFormat = Me.desktopSettings.get_string('clock-format'); + } + + if (this._clockFormat == '12h') { + timeParts.push.apply(timeParts, timeParts.pop().split(' ')); + } + + setClockText(timeParts); + } + } + }, + + _setShowDesktopButton: function (add) { + if (add) { + if(this._showDesktopButton) + return; + + this._showDesktopButton = new St.Bin({ style_class: 'showdesktop-button', + reactive: true, + can_focus: true, + // x_fill: true, + // y_fill: true, + track_hover: true }); + + this._setShowDesktopButtonStyle(); + + this._showDesktopButton.connect('button-press-event', () => this._onShowDesktopButtonPress()); + this._showDesktopButton.connect('enter-event', () => { + this._showDesktopButton.add_style_class_name(this._getBackgroundBrightness() ? + 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); + + if (Me.settings.get_boolean('show-showdesktop-hover')) { + this._timeoutsHandler.add([T4, Me.settings.get_int('show-showdesktop-delay'), () => { + this._hiddenDesktopWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + this._toggleWorkspaceWindows(true, this._hiddenDesktopWorkspace); + }]); + } + }); + + this._showDesktopButton.connect('leave-event', () => { + this._showDesktopButton.remove_style_class_name(this._getBackgroundBrightness() ? + 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); + + if (Me.settings.get_boolean('show-showdesktop-hover')) { + if (this._timeoutsHandler.getId(T4)) { + this._timeoutsHandler.remove(T4); + } else if (this._hiddenDesktopWorkspace) { + this._toggleWorkspaceWindows(false, this._hiddenDesktopWorkspace); + } +  } + }); + + this.panel.actor.add_child(this._showDesktopButton); + } else { + if(!this._showDesktopButton) + return; + + this.panel.actor.remove_child(this._showDesktopButton); + this._showDesktopButton.destroy(); + this._showDesktopButton = null; + } + }, + + _setShowDesktopButtonStyle: function() { + let rgb = this._getBackgroundBrightness() ? "rgba(55, 55, 55, .2)" : "rgba(200, 200, 200, .2)"; + + let isLineCustom = Me.settings.get_boolean('desktop-line-use-custom-color'); + rgb = isLineCustom ? Me.settings.get_string('desktop-line-custom-color') : rgb; + + if (this._showDesktopButton) { + let buttonSize = Me.settings.get_int('showdesktop-button-width') + 'px;'; + let isVertical = this.checkIfVertical(); + + let sytle = "border: 0 solid " + rgb + ";"; + sytle += isVertical ? 'border-top-width:1px;height:' + buttonSize : 'border-left-width:1px;width:' + buttonSize; + + this._showDesktopButton.set_style(sytle); + this._showDesktopButton[(isVertical ? 'x' : 'y') + '_expand'] = true; + } + }, + + // _getBackgroundBrightness: return true if panel has a bright background color + _getBackgroundBrightness: function() { + return Utils.checkIfColorIsBright(this.dynamicTransparency.backgroundColorRgb); + }, + + _toggleWorkspaceWindows: function(hide, workspace) { + let time = Me.settings.get_int('show-showdesktop-time') * .001; + + workspace.list_windows().forEach(w => { + if (!w.minimized) { + let tweenOpts = { + opacity: hide ? 0 : 255, + time: time, + transition: 'easeOutQuad' + }; + + Utils.animateWindowOpacity(w.get_compositor_private(), tweenOpts); + } + }); + }, + + _onShowDesktopButtonPress: function() { + let label = 'trackerFocusApp'; + + this._signalsHandler.removeWithLabel(label); + this._timeoutsHandler.remove(T5); + + if(this._restoreWindowList && this._restoreWindowList.length) { + this._timeoutsHandler.remove(T4); + + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows(); + this._restoreWindowList.forEach(function(w) { + if(windows.indexOf(w) > -1) + Main.activateWindow(w); + }); + this._restoreWindowList = null; + } else { + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows().filter(function (w) { + return w.showing_on_its_workspace() && !w.skip_taskbar; + }); + windows = global.display.sort_windows_by_stacking(windows); + + windows.forEach(function(w) { + w.minimize(); + }); + + this._restoreWindowList = windows; + + this._timeoutsHandler.add([T5, 20, () => this._signalsHandler.addWithLabel( + label, + [ + tracker, + 'notify::focus-app', + () => this._restoreWindowList = null + ] + )]); + } + + Main.overview.hide(); + }, + + _onPanelMouseScroll: function(actor, event) { + let scrollAction = Me.settings.get_string('scroll-panel-action'); + let direction = Utils.getMouseScrollDirection(event); + + if (!this._checkIfIgnoredScrollSource(event.get_source()) && !this._timeoutsHandler.getId(T6)) { + if (direction && scrollAction === 'SWITCH_WORKSPACE') { + let args = [global.display]; + + //adjust for horizontal workspaces + if (Utils.DisplayWrapper.getWorkspaceManager().layout_rows === 1) { + direction = direction == 'up' ? 'left' : 'right'; + } + + //gnome-shell < 3.30 needs an additional "screen" param + global.screen ? args.push(global.screen) : 0; + + let showWsPopup = Me.settings.get_boolean('scroll-panel-show-ws-popup'); + showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = { display: () => {} }; + Main.wm._showWorkspaceSwitcher.apply(Main.wm, args.concat([0, { get_name: () => 'switch---' + direction }])); + showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = null; + } else if (direction && scrollAction === 'CYCLE_WINDOWS') { + let windows = this.taskbar.getAppInfos().reduce((ws, appInfo) => ws.concat(appInfo.windows), []); + + Utils.activateSiblingWindow(windows, direction); + } else if (scrollAction === 'CHANGE_VOLUME' && !event.is_pointer_emulated()) { + var proto = Volume.Indicator.prototype; + var func = proto._handleScrollEvent || proto.vfunc_scroll_event || proto._onScrollEvent; + + func.call(Main.panel.statusArea.aggregateMenu._volume, 0, event); + } else { + return; + } + + var scrollDelay = Me.settings.get_int('scroll-panel-delay'); + + if (scrollDelay) { + this._timeoutsHandler.add([T6, scrollDelay, () => {}]); + } + } + }, + + _checkIfIgnoredScrollSource: function(source) { + let ignoredConstr = ['WorkspaceIndicator']; + + return source.get_parent()._dtpIgnoreScroll || ignoredConstr.indexOf(source.constructor.name) >= 0; + }, + + _initProgressManager: function() { + if(!this.progressManager && (Me.settings.get_boolean('progress-show-bar') || Me.settings.get_boolean('progress-show-count'))) + this.progressManager = new Progress.ProgressManager(); + }, +}); + +var dtpSecondaryPanel = Utils.defineClass({ + Name: 'DashToPanel-SecondaryPanel', + Extends: St.Widget, + + _init: function(params) { + this.callParent('_init', params); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + } +}); + +var dtpSecondaryAggregateMenu = Utils.defineClass({ + Name: 'DashToPanel-SecondaryAggregateMenu', + Extends: PanelMenu.Button, + + _init: function() { + this.callParent('_init', 0.0, C_("System menu in the top bar", "System"), false); + + Utils.wrapActor(this); + + this.menu.actor.add_style_class_name('aggregate-menu'); + + let menuLayout = new Panel.AggregateLayout(); + this.menu.box.set_layout_manager(menuLayout); + + this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); + this.actor.add_child(this._indicators); + + this._power = new imports.ui.status.power.Indicator(); + this._volume = new imports.ui.status.volume.Indicator(); + this._brightness = new imports.ui.status.brightness.Indicator(); + this._system = new imports.ui.status.system.Indicator(); + + if (Config.PACKAGE_VERSION >= '3.28') { + this._thunderbolt = new imports.ui.status.thunderbolt.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._thunderbolt)); + } + + if (Config.PACKAGE_VERSION < '3.37') { + this._screencast = new imports.ui.status.screencast.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._screencast)); + } + + if (Config.PACKAGE_VERSION >= '3.24') { + this._nightLight = new imports.ui.status.nightLight.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._nightLight)); + } + + if (Config.HAVE_NETWORKMANAGER && Config.PACKAGE_VERSION >= '3.24') { + this._network = new imports.ui.status.network.NMApplet(); + this._indicators.add_child(Utils.getIndicators(this._network)); + } + + if (Config.HAVE_BLUETOOTH) { + this._bluetooth = new imports.ui.status.bluetooth.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._bluetooth)); + } + + this._indicators.add_child(Utils.getIndicators(this._volume)); + this._indicators.add_child(Utils.getIndicators(this._power)); + + this.menu.addMenuItem(this._volume.menu); + this._volume._volumeMenu._readOutput(); + this._volume._volumeMenu._readInput(); + + this.menu.addMenuItem(this._brightness.menu); + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + if (this._network) { + this.menu.addMenuItem(this._network.menu); + } + + if (this._bluetooth) { + this.menu.addMenuItem(this._bluetooth.menu); + } + + this.menu.addMenuItem(this._power.menu); + this._power._sync(); + + if (this._nightLight) { + this.menu.addMenuItem(this._nightLight.menu); + } + + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this.menu.addMenuItem(this._system.menu); + + menuLayout.addSizeChild(this._power.menu.actor); + menuLayout.addSizeChild(this._system.menu.actor); + }, +}); diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js new file mode 100644 index 0000000..d572d8b --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js @@ -0,0 +1,789 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Overview = Me.imports.overview; +const Panel = Me.imports.panel; +const PanelSettings = Me.imports.panelSettings; +const Proximity = Me.imports.proximity; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +const Config = imports.misc.config; +const Lang = imports.lang; +const Gi = imports._gi; +const GLib = imports.gi.GLib; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +const AppDisplay = imports.ui.appDisplay; +const BoxPointer = imports.ui.boxpointer; +const Dash = imports.ui.dash; +const IconGrid = imports.ui.iconGrid; +const LookingGlass = imports.ui.lookingGlass; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const Layout = imports.ui.layout; +const WM = imports.ui.windowManager; +const WorkspacesView = imports.ui.workspacesView; + +var dtpPanelManager = Utils.defineClass({ + Name: 'DashToPanel.PanelManager', + + _init: function() { + this.overview = new Overview.dtpOverview(); + this.panelsElementPositions = {}; + + this._saveMonitors(); + + Utils.getAppDisplayViews().forEach(v => { + Utils.wrapActor(v.view); + Utils.wrapActor(v.view._grid); + }); + }, + + enable: function(reset) { + let dtpPrimaryIndex = Me.settings.get_int('primary-monitor'); + + this.dtpPrimaryMonitor = Main.layoutManager.monitors[dtpPrimaryIndex] || Main.layoutManager.primaryMonitor; + this.proximityManager = new Proximity.ProximityManager(); + + this._oldGetShowAppsButton = imports.ui.main.overview.dash.showAppsButton; + + Utils.wrapActor(Main.panel); + Utils.wrapActor(Main.overview.dash || 0); + + this.primaryPanel = this._createPanel(this.dtpPrimaryMonitor, Me.settings.get_boolean('stockgs-keep-top-panel')); + this.allPanels = [ this.primaryPanel ]; + + this.overview.enable(this.primaryPanel); + + if (Me.settings.get_boolean('multi-monitors')) { + Main.layoutManager.monitors.filter(m => m != this.dtpPrimaryMonitor).forEach(m => { + this.allPanels.push(this._createPanel(m, true)); + }); + } + + global.dashToPanel.panels = this.allPanels; + global.dashToPanel.emit('panels-created'); + + this.allPanels.forEach(p => { + let panelPosition = p.getPosition(); + let leftOrRight = (panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT); + + p.panelBox.set_size( + leftOrRight ? -1 : p.geom.w + p.geom.lrPadding, + leftOrRight ? p.geom.h + p.geom.tbPadding : -1 + ); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => this._adjustPanelMenuButton(pmb, p.monitor, panelPosition)); + + p.taskbar.iconAnimator.start(); + }); + + //in 3.32, BoxPointer now inherits St.Widget + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + let panelManager = this; + + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', function(forWidth) { + let alloc = { min_size: 0, natural_size: 0 }; + + [alloc.min_size, alloc.natural_size] = this.vfunc_get_preferred_height(forWidth); + + return panelManager._getBoxPointerPreferredHeight(this, alloc); + }); + } + + this._updatePanelElementPositions(); + this.setFocusedMonitor(this.dtpPrimaryMonitor); + + if (this.primaryPanel.checkIfVertical()) { + Main.wm._getPositionForDirection = newGetPositionForDirection; + } + + if (reset) return; + + if (Config.PACKAGE_VERSION > '3.35.1') { + this._oldDoSpringAnimation = AppDisplay.BaseAppView.prototype._doSpringAnimation; + AppDisplay.BaseAppView.prototype._doSpringAnimation = newDoSpringAnimation; + } + + this._oldUpdatePanelBarrier = Main.layoutManager._updatePanelBarrier; + Main.layoutManager._updatePanelBarrier = (panel) => { + let panelUpdates = panel ? [panel] : this.allPanels; + + panelUpdates.forEach(p => newUpdatePanelBarrier.call(Main.layoutManager, p)); + }; + Main.layoutManager._updatePanelBarrier(); + + this._oldUpdateHotCorners = Main.layoutManager._updateHotCorners; + Main.layoutManager._updateHotCorners = Lang.bind(Main.layoutManager, newUpdateHotCorners); + Main.layoutManager._updateHotCorners(); + + this._forceHotCornerId = Me.settings.connect('changed::stockgs-force-hotcorner', () => Main.layoutManager._updateHotCorners()); + + if (Main.layoutManager._interfaceSettings) { + this._enableHotCornersId = Main.layoutManager._interfaceSettings.connect('changed::enable-hot-corners', () => Main.layoutManager._updateHotCorners()); + } + + Main.overview.getShowAppsButton = this._newGetShowAppsButton.bind(this); + + this._needsDashItemContainerAllocate = !Dash.DashItemContainer.prototype.hasOwnProperty('vfunc_allocate'); + + if (this._needsDashItemContainerAllocate) { + Utils.hookVfunc(Dash.DashItemContainer.prototype, 'allocate', this._newDashItemContainerAllocate); + } + + LookingGlass.LookingGlass.prototype._oldResize = LookingGlass.LookingGlass.prototype._resize; + LookingGlass.LookingGlass.prototype._resize = _newLookingGlassResize; + + LookingGlass.LookingGlass.prototype._oldOpen = LookingGlass.LookingGlass.prototype.open; + LookingGlass.LookingGlass.prototype.open = _newLookingGlassOpen; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + if (Config.PACKAGE_VERSION > '3.35.9') { + let currentAppsView; + + this._oldAnimateIconPosition = IconGrid.animateIconPosition; + IconGrid.animateIconPosition = newAnimateIconPosition.bind(this); + + this._signalsHandler.add( + [ + Utils.DisplayWrapper.getScreen(), + 'window-entered-monitor', + () => this._needsIconAllocate = 1 + ] + ); + + Utils.getAppDisplayViews().forEach(v => { + if (!v.control || v.control.has_style_pseudo_class('checked')) { + currentAppsView = v; + } + + if (v.control) { + this._signalsHandler.add( + [ + v.control, + 'clicked', + () => { + this._needsIconAllocate = currentAppsView != v; + currentAppsView = v; + } + ] + ); + } + + this._signalsHandler.add( + [ + v.view, + 'notify::visible', + () => this._needsIconAllocate = !(currentAppsView != v && !v.view.visible) + ], + [ + v.view._grid, + 'animation-done', + () => this._needsIconAllocate = 0 + ] + ); + }); + } + + //listen settings + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::primary-monitor', + 'changed::multi-monitors', + 'changed::isolate-monitors', + 'changed::panel-positions', + 'changed::panel-lengths', + 'changed::panel-anchors', + 'changed::stockgs-keep-top-panel' + ], + () => this._reset() + ], + [ + Me.settings, + 'changed::panel-element-positions', + () => this._updatePanelElementPositions() + ], + [ + Me.settings, + 'changed::intellihide-key-toggle-text', + () => this._setKeyBindings(true) + ], + [ + Utils.DisplayWrapper.getMonitorManager(), + 'monitors-changed', + () => { + if (Main.layoutManager.primaryMonitor) { + this._saveMonitors(); + this._reset(); + } + } + ] + ); + + Panel.panelBoxes.forEach(c => this._signalsHandler.add( + [Main.panel[c], 'actor-added', (parent, child) => this._adjustPanelMenuButton(this._getPanelMenuButton(child), this.primaryPanel.monitor, this.primaryPanel.getPosition())] + )); + + this._setKeyBindings(true); + + // keep GS overview.js from blowing away custom panel styles + if(!Me.settings.get_boolean('stockgs-keep-top-panel')) + Object.defineProperty(Main.panel, "style", {configurable: true, set: function(v) {}}); + }, + + disable: function(reset) { + this.overview.disable(); + this.proximityManager.destroy(); + + this.allPanels.forEach(p => { + p.taskbar.iconAnimator.pause(); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => { + if (pmb.menu._boxPointer._dtpGetPreferredHeightId) { + pmb.menu._boxPointer._container.disconnect(pmb.menu._boxPointer._dtpGetPreferredHeightId); + } + + pmb.menu._boxPointer.sourceActor = pmb.menu._boxPointer._dtpSourceActor; + delete pmb.menu._boxPointer._dtpSourceActor; + pmb.menu._boxPointer._userArrowSide = St.Side.TOP; + }) + + this._removePanelBarriers(p); + + p.disable(); + + let clipContainer = p.panelBox.get_parent(); + + Main.layoutManager._untrackActor(p.panelBox); + Main.layoutManager.removeChrome(clipContainer); + + if (p.isStandalone) { + p.panelBox.destroy(); + } else { + p.panelBox.remove_child(p); + p.remove_child(p.panel.actor); + p.panelBox.add(p.panel.actor); + + p.panelBox.set_position(clipContainer.x, clipContainer.y); + + clipContainer.remove_child(p.panelBox); + Main.layoutManager.addChrome(p.panelBox, { affectsStruts: true, trackFullscreen: true }); + } + }); + + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height); + } + + delete Main.wm._getPositionForDirection; + + if (Main.layoutManager.primaryMonitor) { + Main.layoutManager.panelBox.set_position(Main.layoutManager.primaryMonitor.x, Main.layoutManager.primaryMonitor.y); + Main.layoutManager.panelBox.set_size(Main.layoutManager.primaryMonitor.width, -1); + } + + if (reset) return; + + this._setKeyBindings(false); + + this._signalsHandler.destroy(); + + Main.layoutManager._updateHotCorners = this._oldUpdateHotCorners; + Main.layoutManager._updateHotCorners(); + + Me.settings.disconnect(this._forceHotCornerId); + + if (this._enableHotCornersId) { + Main.layoutManager._interfaceSettings.disconnect(this._enableHotCornersId); + } + + Main.layoutManager._updatePanelBarrier = this._oldUpdatePanelBarrier; + Main.layoutManager._updatePanelBarrier(); + + Utils.getPanelGhost().set_size(-1, -1); + + if (this._oldDoSpringAnimation) { + AppDisplay.BaseAppView.prototype._doSpringAnimation = this._oldDoSpringAnimation; + } + + if (this._oldAnimateIconPosition) { + IconGrid.animateIconPosition = this._oldAnimateIconPosition; + } + + LookingGlass.LookingGlass.prototype._resize = LookingGlass.LookingGlass.prototype._oldResize; + delete LookingGlass.LookingGlass.prototype._oldResize; + + LookingGlass.LookingGlass.prototype.open = LookingGlass.LookingGlass.prototype._oldOpen; + delete LookingGlass.LookingGlass.prototype._oldOpen + + delete Main.panel.style; + }, + + setFocusedMonitor: function(monitor, ignoreRelayout) { + // todo show overview on non primary monitor is not working right now on gnome40 + + // this._needsIconAllocate = 1; + + // if (!this.checkIfFocusedMonitor(monitor)) { + // Main.overview._overview._controls._workspacesDisplay._primaryIndex = monitor.index; + + // Main.overview._overview.clear_constraints(); + // Main.overview._overview.add_constraint(new Layout.MonitorConstraint({ index: monitor.index })); + // } + }, + + _saveMonitors: function() { + //Mutter meta_monitor_manager_get_primary_monitor (global.display.get_primary_monitor()) doesn't return the same + //monitor as GDK gdk_screen_get_primary_monitor (imports.gi.Gdk.Screen.get_default().get_primary_monitor()). + //Since the Mutter function is what's used in gnome-shell and we can't access it from the settings dialog, store + //the monitors information in a setting so we can use the same monitor indexes as the ones in gnome-shell + let primaryIndex = Main.layoutManager.primaryIndex; + let monitors = [primaryIndex]; + + Main.layoutManager.monitors.filter(m => m.index != primaryIndex).forEach(m => monitors.push(m.index)); + Me.settings.set_value('available-monitors', new GLib.Variant('ai', monitors)); + }, + + checkIfFocusedMonitor: function(monitor) { + return Main.overview._overview._controls._workspacesDisplay._primaryIndex == monitor.index; + }, + + _createPanel: function(monitor, isStandalone) { + let panelBox; + let panel; + let clipContainer = new Clutter.Actor(); + + if (isStandalone) { + panelBox = new St.BoxLayout({ name: 'panelBox' }); + } else { + panelBox = Main.layoutManager.panelBox; + Main.layoutManager._untrackActor(panelBox); + panelBox.remove_child(Main.panel.actor); + Main.layoutManager.removeChrome(panelBox); + } + + Main.layoutManager.addChrome(clipContainer, { affectsInputRegion: false }); + clipContainer.add_child(panelBox); + Main.layoutManager.trackChrome(panelBox, { trackFullscreen: true, affectsStruts: true, affectsInputRegion: true }); + + panel = new Panel.dtpPanel(this, monitor, panelBox, isStandalone); + panelBox.add(panel); + panel.enable(); + + panelBox.visible = true; + if (monitor.inFullscreen) { + panelBox.hide(); + } + panelBox.set_position(0, 0); + + return panel; + }, + + _reset: function() { + this.disable(true); + this.allPanels = []; + this.enable(true); + }, + + _updatePanelElementPositions: function() { + this.panelsElementPositions = PanelSettings.getSettingsJson(Me.settings, 'panel-element-positions'); + this.allPanels.forEach(p => p.updateElementPositions()); + }, + + _adjustPanelMenuButton: function(button, monitor, arrowSide) { + if (button) { + Utils.wrapActor(button); + button.menu._boxPointer._dtpSourceActor = button.menu._boxPointer.sourceActor; + button.menu._boxPointer.sourceActor = button.actor; + button.menu._boxPointer._userArrowSide = arrowSide; + button.menu._boxPointer._dtpInPanel = 1; + + if (!button.menu._boxPointer.vfunc_get_preferred_height) { + button.menu._boxPointer._dtpGetPreferredHeightId = button.menu._boxPointer._container.connect('get-preferred-height', (actor, forWidth, alloc) => { + this._getBoxPointerPreferredHeight(button.menu._boxPointer, alloc, monitor); + }); + } + } + }, + + _getBoxPointerPreferredHeight: function(boxPointer, alloc, monitor) { + if (boxPointer._dtpInPanel && boxPointer.sourceActor && Me.settings.get_boolean('intellihide')) { + monitor = monitor || Main.layoutManager.findMonitorForActor(boxPointer.sourceActor); + let panel = Utils.find(global.dashToPanel.panels, p => p.monitor == monitor); + let excess = alloc.natural_size + panel.dtpSize + 10 - monitor.height; // 10 is arbitrary + + if (excess > 0) { + alloc.natural_size -= excess; + } + } + + return [alloc.min_size, alloc.natural_size]; + }, + + _findPanelMenuButtons: function(container) { + let panelMenuButtons = []; + let panelMenuButton; + + let find = parent => parent.get_children().forEach(c => { + if ((panelMenuButton = this._getPanelMenuButton(c))) { + panelMenuButtons.push(panelMenuButton); + } + + find(c); + }); + + find(container); + + return panelMenuButtons; + }, + + _removePanelBarriers: function(panel) { + if (panel.isStandalone && panel._rightPanelBarrier) { + panel._rightPanelBarrier.destroy(); + } + + if (panel._leftPanelBarrier) { + panel._leftPanelBarrier.destroy(); + delete panel._leftPanelBarrier; + } + }, + + _getPanelMenuButton: function(obj) { + return obj._delegate && obj._delegate instanceof PanelMenu.Button ? obj._delegate : 0; + }, + + _setKeyBindings: function(enable) { + let keys = { + 'intellihide-key-toggle': () => this.allPanels.forEach(p => p.intellihide.toggle()) + }; + + Object.keys(keys).forEach(k => { + Utils.removeKeybinding(k); + + if (enable) { + Utils.addKeybinding(k, Me.settings, keys[k], Shell.ActionMode.NORMAL); + } + }); + }, + + _newGetShowAppsButton: function() { + let focusedMonitorIndex = Utils.findIndex(this.allPanels, p => this.checkIfFocusedMonitor(p.monitor)); + + return this.allPanels[focusedMonitorIndex].taskbar.showAppsButton; + } +}); + +// This class drives long-running icon animations, to keep them running in sync +// with each other. +var IconAnimator = Utils.defineClass({ + Name: 'DashToPanel.IconAnimator', + + _init: function(actor) { + this._count = 0; + this._started = false; + this._animations = { + dance: [], + }; + this._timeline = new Clutter.Timeline({ + duration: 3000, + repeat_count: -1, + }); + + /* Just use the construction property when no need to support 3.36 */ + if (this._timeline.set_actor) + this._timeline.set_actor(actor); + + this._timeline.connect('new-frame', () => { + const progress = this._timeline.get_progress(); + const danceRotation = progress < 1/6 ? 15*Math.sin(progress*24*Math.PI) : 0; + const dancers = this._animations.dance; + for (let i = 0, iMax = dancers.length; i < iMax; i++) { + dancers[i].target.rotation_angle_z = danceRotation; + } + }); + }, + + destroy: function() { + this._timeline.stop(); + this._timeline = null; + for (let name in this._animations) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + pair.target.disconnect(pair.targetDestroyId); + } + } + this._animations = null; + }, + + pause: function() { + if (this._started && this._count > 0) { + this._timeline.stop(); + } + this._started = false; + }, + + start: function() { + if (!this._started && this._count > 0) { + this._timeline.start(); + } + this._started = true; + }, + + addAnimation: function(target, name) { + const targetDestroyId = target.connect('destroy', () => this.removeAnimation(target, name)); + this._animations[name].push({ target: target, targetDestroyId: targetDestroyId }); + if (this._started && this._count === 0) { + this._timeline.start(); + } + this._count++; + }, + + removeAnimation: function(target, name) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + if (pair.target === target) { + target.disconnect(pair.targetDestroyId); + pairs.splice(i, 1); + this._count--; + if (this._started && this._count === 0) { + this._timeline.stop(); + } + return; + } + } + } +}); + +function newGetPositionForDirection(direction, fromWs, toWs) { + let [xDest, yDest] = WM.WindowManager.prototype._getPositionForDirection(direction, fromWs, toWs); + + if (direction == Meta.MotionDirection.UP || + direction == Meta.MotionDirection.UP_LEFT || + direction == Meta.MotionDirection.UP_RIGHT) { + yDest -= Main.panel.height; + } else if (direction != Meta.MotionDirection.LEFT && + direction != Meta.MotionDirection.RIGHT) { + yDest += Main.panel.height; + } + + return [xDest, yDest]; +} + +function newDoSpringAnimation(animationDirection) { + this._grid.opacity = 255; + this._grid.animateSpring(animationDirection, Main.overview.getShowAppsButton()); +} + +function newAnimateIconPosition(icon, box, flags, nChangedIcons) { + if (this._needsIconAllocate) { + Utils.allocate(icon, box, flags); + return; + } + + return this._oldAnimateIconPosition(icon, box, flags, nChangedIcons);; +} + +function newUpdateHotCorners() { + // destroy old hot corners + this.hotCorners.forEach(function(corner) { + if (corner) + corner.destroy(); + }); + this.hotCorners = []; + + //global.settings is ubuntu specific setting to disable the hot corner (Tweak tool > Top Bar > Activities Overview Hot Corner) + //this._interfaceSettings is for the setting to disable the hot corner introduced in gnome-shell 3.34 + if ((global.settings.list_keys().indexOf('enable-hot-corners') >= 0 && !global.settings.get_boolean('enable-hot-corners')) || + (this._interfaceSettings && !this._interfaceSettings.get_boolean('enable-hot-corners'))) { + this.emit('hot-corners-changed'); + return; + } + + // build new hot corners + for (let i = 0; i < this.monitors.length; i++) { + let panel = Utils.find(global.dashToPanel.panels, p => p.monitor.index == i); + let panelPosition = panel ? panel.getPosition() : St.Side.BOTTOM; + let panelTopLeft = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT; + let monitor = this.monitors[i]; + let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x; + let cornerY = monitor.y; + + let haveTopLeftCorner = true; + + // If the panel is on the bottom, unless this is explicitly forced, don't add a topleft + // hot corner unless it is actually a top left panel. Otherwise, it stops the mouse + // as you are dragging across. In the future, maybe we will automatically move the + // hotcorner to the bottom when the panel is positioned at the bottom + if (i != this.primaryIndex || (!panelTopLeft && !Me.settings.get_boolean('stockgs-force-hotcorner'))) { + // Check if we have a top left (right for RTL) corner. + // I.e. if there is no monitor directly above or to the left(right) + let besideX = this._rtl ? monitor.x + 1 : cornerX - 1; + let besideY = cornerY; + let aboveX = cornerX; + let aboveY = cornerY - 1; + + for (let j = 0; j < this.monitors.length; j++) { + if (i == j) + continue; + let otherMonitor = this.monitors[j]; + if (besideX >= otherMonitor.x && + besideX < otherMonitor.x + otherMonitor.width && + besideY >= otherMonitor.y && + besideY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + if (aboveX >= otherMonitor.x && + aboveX < otherMonitor.x + otherMonitor.width && + aboveY >= otherMonitor.y && + aboveY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + } + } + + if (haveTopLeftCorner) { + let corner = new Layout.HotCorner(this, monitor, cornerX, cornerY); + + corner.setBarrierSize = size => corner.__proto__.setBarrierSize.call(corner, Math.min(size, 32)); + corner.setBarrierSize(panel ? panel.dtpSize : 32); + this.hotCorners.push(corner); + } else { + this.hotCorners.push(null); + } + } + + this.emit('hot-corners-changed'); +} + +function newUpdatePanelBarrier(panel) { + let barriers = { + _rightPanelBarrier: [(panel.isStandalone ? panel : this)], + _leftPanelBarrier: [panel] + }; + + Object.keys(barriers).forEach(k => { + let obj = barriers[k][0]; + + if (obj[k]) { + obj[k].destroy(); + obj[k] = null; + } + }); + + if (!this.primaryMonitor || !panel.panelBox.height) { + return; + } + + let barrierSize = Math.min(10, panel.panelBox.height); + let fixed1 = panel.monitor.y; + let fixed2 = panel.monitor.y + barrierSize; + + if (panel.checkIfVertical()) { + barriers._rightPanelBarrier.push(panel.monitor.y + panel.monitor.height, Meta.BarrierDirection.POSITIVE_Y); + barriers._leftPanelBarrier.push(panel.monitor.y, Meta.BarrierDirection.NEGATIVE_Y); + } else { + barriers._rightPanelBarrier.push(panel.monitor.x + panel.monitor.width, Meta.BarrierDirection.NEGATIVE_X); + barriers._leftPanelBarrier.push(panel.monitor.x, Meta.BarrierDirection.POSITIVE_X); + } + + switch (panel.getPosition()) { + //values are initialized as St.Side.TOP + case St.Side.BOTTOM: + fixed1 = panel.monitor.y + panel.monitor.height - barrierSize; + fixed2 = panel.monitor.y + panel.monitor.height; + break; + case St.Side.LEFT: + fixed1 = panel.monitor.x; + fixed2 = panel.monitor.x + barrierSize; + break; + case St.Side.RIGHT: + fixed1 = panel.monitor.x + panel.monitor.width; + fixed2 = panel.monitor.x + panel.monitor.width - barrierSize; + break; + } + + //remove left barrier if it overlaps one of the hotcorners + for (let k in this.hotCorners) { + let hc = this.hotCorners[k]; + + if (hc && hc._monitor == panel.monitor && + ((fixed1 == hc._x || fixed2 == hc._x) || fixed1 == hc._y || fixed2 == hc._y)) { + delete barriers._leftPanelBarrier; + break; + } + } + + Object.keys(barriers).forEach(k => { + let barrierOptions = { + display: global.display, + directions: barriers[k][2] + }; + + barrierOptions[panel.varCoord.c1] = barrierOptions[panel.varCoord.c2] = barriers[k][1]; + barrierOptions[panel.fixedCoord.c1] = fixed1; + barrierOptions[panel.fixedCoord.c2] = fixed2; + + barriers[k][0][k] = new Meta.Barrier(barrierOptions); + }); +} + +function _newLookingGlassResize() { + let primaryMonitorPanel = Utils.find(global.dashToPanel.panels, p => p.monitor == Main.layoutManager.primaryMonitor); + let topOffset = primaryMonitorPanel.getPosition() == St.Side.TOP ? primaryMonitorPanel.dtpSize + 8 : 32; + + this._oldResize(); + Utils.wrapActor(this); + Utils.wrapActor(this._objInspector); + + this._hiddenY = Main.layoutManager.primaryMonitor.y + topOffset - this.actor.height; + this._targetY = this._hiddenY + this.actor.height; + this.actor.y = this._hiddenY; + + this._objInspector.actor.set_position(this.actor.x + Math.floor(this.actor.width * 0.1), this._targetY + Math.floor(this.actor.height * 0.1)); +} + +function _newLookingGlassOpen() { + if (this._open) + return; + + this._resize(); + this._oldOpen(); +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js new file mode 100644 index 0000000..52458bb --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js @@ -0,0 +1,61 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +var SHOW_APPS_BTN = 'showAppsButton'; +var ACTIVITIES_BTN = 'activitiesButton'; +var TASKBAR = 'taskbar'; +var DATE_MENU = 'dateMenu'; +var SYSTEM_MENU = 'systemMenu'; +var LEFT_BOX = 'leftBox'; +var CENTER_BOX = 'centerBox'; +var RIGHT_BOX = 'rightBox'; +var DESKTOP_BTN = 'desktopButton'; + +var STACKED_TL = 'stackedTL'; +var STACKED_BR = 'stackedBR'; +var CENTERED = 'centered'; +var CENTERED_MONITOR = 'centerMonitor'; + +var TOP = 'TOP'; +var BOTTOM = 'BOTTOM'; +var LEFT = 'LEFT'; +var RIGHT = 'RIGHT'; + +var START = 'START'; +var MIDDLE = 'MIDDLE'; +var END = 'END'; + +var defaults = [ + { element: SHOW_APPS_BTN, visible: true, position: STACKED_TL }, + { element: ACTIVITIES_BTN, visible: false, position: STACKED_TL }, + { element: LEFT_BOX, visible: true, position: STACKED_TL }, + { element: TASKBAR, visible: true, position: STACKED_TL }, + { element: CENTER_BOX, visible: true, position: STACKED_BR }, + { element: RIGHT_BOX, visible: true, position: STACKED_BR }, + { element: DATE_MENU, visible: true, position: STACKED_BR }, + { element: SYSTEM_MENU, visible: true, position: STACKED_BR }, + { element: DESKTOP_BTN, visible: true, position: STACKED_BR }, +]; + +var optionDialogFunctions = {}; + +optionDialogFunctions[SHOW_APPS_BTN] = '_showShowAppsButtonOptions'; +optionDialogFunctions[DESKTOP_BTN] = '_showDesktopButtonOptions'; + +function checkIfCentered(position) { + return position == CENTERED || position == CENTERED_MONITOR; +} \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js new file mode 100644 index 0000000..4feb3fd --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js @@ -0,0 +1,112 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Pos = Me.imports.panelPositions; + +/** Return object representing a settings value that is stored as JSON. */ +function getSettingsJson(settings, setting) { + try { + return JSON.parse(settings.get_string(setting)); + } catch(e) { + log('Error parsing positions: ' + e.message); + } +} +/** Write value object as JSON to setting in settings. */ +function setSettingsJson(settings, setting, value) { + try { + const json = JSON.stringify(value); + settings.set_string(setting, json); + } catch(e) { + log('Error serializing setting: ' + e.message); + } +} + +/** Returns size of panel on a specific monitor, in pixels. */ +function getPanelSize(settings, monitorIndex) { + const sizes = getSettingsJson(settings, 'panel-sizes'); + // Pull in deprecated setting if panel-sizes does not have setting for monitor. + const fallbackSize = settings.get_int('panel-size'); + const theDefault = 48; + return sizes[monitorIndex] || fallbackSize || theDefault; +} + +function setPanelSize(settings, monitorIndex, value) { + if (!(Number.isInteger(value) && value <= 128 && value >= 16)) { + log('Not setting invalid panel size: ' + value); + return; + } + let sizes = getSettingsJson(settings, 'panel-sizes'); + sizes[monitorIndex] = value; + setSettingsJson(settings, 'panel-sizes', sizes); +} + +/** + * Returns length of panel on a specific monitor, as a whole number percent, + * from settings. e.g. 100 + */ +function getPanelLength(settings, monitorIndex) { + const lengths = getSettingsJson(settings, 'panel-lengths'); + const theDefault = 100; + return lengths[monitorIndex] || theDefault; +} + +function setPanelLength(settings, monitorIndex, value) { + if (!(Number.isInteger(value) && value <= 100 && value >= 0)) { + log('Not setting invalid panel length: ' + value); + return; + } + let lengths = getSettingsJson(settings, 'panel-lengths'); + lengths[monitorIndex] = value; + setSettingsJson(settings, 'panel-lengths', lengths); +} + +/** Returns position of panel on a specific monitor. */ +function getPanelPosition(settings, monitorIndex) { + const positions = getSettingsJson(settings, 'panel-positions'); + const fallbackPosition = settings.get_string('panel-position'); + const theDefault = Pos.BOTTOM; + return positions[monitorIndex] || fallbackPosition || theDefault; +} + +function setPanelPosition(settings, monitorIndex, value) { + if (!(value === Pos.TOP || value === Pos.BOTTOM || value === Pos.LEFT + || value === Pos.RIGHT)) { + log('Not setting invalid panel position: ' + value); + return; + } + const positions = getSettingsJson(settings, 'panel-positions'); + positions[monitorIndex] = value; + setSettingsJson(settings, 'panel-positions', positions); +} + +/** Returns anchor location of panel on a specific monitor. */ +function getPanelAnchor(settings, monitorIndex) { + const anchors = getSettingsJson(settings, 'panel-anchors'); + const theDefault = Pos.MIDDLE; + return anchors[monitorIndex] || theDefault; +} + +function setPanelAnchor(settings, monitorIndex, value) { + if (!(value === Pos.START || value === Pos.MIDDLE || value === Pos.END)) { + log('Not setting invalid panel anchor: ' + value); + return; + } + const anchors = getSettingsJson(settings, 'panel-anchors'); + anchors[monitorIndex] = value; + setSettingsJson(settings, 'panel-anchors', anchors); +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js new file mode 100644 index 0000000..2697ace --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js @@ -0,0 +1,326 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * Ideas for recursing child actors and assigning inline styles + * are based on code from the StatusAreaHorizontalSpacing extension + * https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension + * mathematical.coffee@gmail.com + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const ExtensionUtils = imports.misc.extensionUtils; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const St = imports.gi.St; +const Shell = imports.gi.Shell; + +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +var dtpPanelStyle = Utils.defineClass({ + Name: 'DashToPanel.PanelStyle', + + _init: function() { + + }, + + enable : function(panel) { + this.panel = panel; + + this._applyStyles(); + + this._bindSettingsChanges(); + }, + + disable: function () { + for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { + Me.settings.disconnect(this._dtpSettingsSignalIds[i]); + } + + this._removeStyles(); + }, + + _bindSettingsChanges: function() { + let configKeys = [ + "tray-size", + "leftbox-size", + "tray-padding", + "leftbox-padding", + "status-icon-padding", + ]; + + this._dtpSettingsSignalIds = []; + + for(let i in configKeys) { + this._dtpSettingsSignalIds.push(Me.settings.connect('changed::' + configKeys[i], Lang.bind(this, function () { + this._removeStyles(); + this._applyStyles(); + }))); + } + }, + + _applyStyles: function() { + this._rightBoxOperations = []; + + let trayPadding = Me.settings.get_int('tray-padding'); + let isVertical = this.panel.checkIfVertical(); + let paddingStyle = 'padding: ' + (isVertical ? '%dpx 0' : '0 %dpx'); + + if(trayPadding >= 0) { + let operation = {}; + let trayPaddingStyleLine; + + if (isVertical) { + trayPaddingStyleLine = paddingStyle.format(trayPadding); + operation.compareFn = function (actor) { + let parent = actor.get_parent(); + return (parent && parent.has_style_class_name && parent.has_style_class_name('panel-button')); + }; + } else { + trayPaddingStyleLine = '-natural-hpadding: %dpx'.format(trayPadding); + if (trayPadding < 6) { + trayPaddingStyleLine += '; -minimum-hpadding: %dpx'.format(trayPadding); + } + + operation.compareFn = function (actor) { + return (actor.has_style_class_name && actor.has_style_class_name('panel-button')); + }; + } + + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayPaddingStyleLine, operationIdx); + this._refreshPanelButton(actor); + }); + this._rightBoxOperations.push(operation); + } + + let statusIconPadding = Me.settings.get_int('status-icon-padding'); + if(statusIconPadding >= 0) { + let statusIconPaddingStyleLine = paddingStyle.format(statusIconPadding) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.has_style_class_name && actor.has_style_class_name('system-status-icon')); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, statusIconPaddingStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + } + + let trayContentSize = Me.settings.get_int('tray-size'); + if(trayContentSize > 0) { + let trayIconSizeStyleLine = 'icon-size: %dpx'.format(trayContentSize) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Icon'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayIconSizeStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + + let trayContentSizeStyleLine = 'font-size: %dpx'.format(trayContentSize) + operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Label'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayContentSizeStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + + this._overrideStyle(this.panel._rightBox, trayContentSizeStyleLine, 0); + this._overrideStyle(this.panel._centerBox, trayContentSizeStyleLine, 0); + } + + // center box has been moved next to the right box and will be treated the same + this._centerBoxOperations = this._rightBoxOperations; + + this._leftBoxOperations = []; + + let leftboxPadding = Me.settings.get_int('leftbox-padding'); + if(leftboxPadding >= 0) { + let leftboxPaddingStyleLine = paddingStyle.format(leftboxPadding); + let operation = {}; + operation.compareFn = function (actor) { + let parent = actor.get_parent(); + return (parent && parent.has_style_class_name && parent.has_style_class_name('panel-button')); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxPaddingStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + } + + let leftboxContentSize = Me.settings.get_int('leftbox-size'); + if(leftboxContentSize > 0) { + let leftboxIconSizeStyleLine = 'icon-size: %dpx'.format(leftboxContentSize) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Icon'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxIconSizeStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + + let leftboxContentSizeStyleLine = 'font-size: %dpx'.format(leftboxContentSize) + operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Label'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxContentSizeStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + + this._overrideStyle(this.panel._leftBox, leftboxContentSizeStyleLine, 0); + } + + this._applyStylesRecursively(); + + /* connect signal */ + this._rightBoxActorAddedID = this.panel._rightBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._rightBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._rightBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._centerBoxActorAddedID = this.panel._centerBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._centerBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._centerBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._leftBoxActorAddedID = this.panel._leftBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._leftBoxOperations.length) + this._recursiveApply(actor, this._leftBoxOperations); + }) + ); + }, + + _removeStyles: function() { + /* disconnect signal */ + if (this._rightBoxActorAddedID) + this.panel._rightBox.disconnect(this._rightBoxActorAddedID); + if (this._centerBoxActorAddedID) + this.panel._centerBox.disconnect(this._centerBoxActorAddedID); + if (this._leftBoxActorAddedID) + this.panel._leftBox.disconnect(this._leftBoxActorAddedID); + + this._restoreOriginalStyle(this.panel._rightBox); + this._restoreOriginalStyle(this.panel._centerBox); + this._restoreOriginalStyle(this.panel._leftBox); + + this._applyStylesRecursively(true); + }, + + _applyStylesRecursively: function(restore) { + /*recurse actors */ + if(this._rightBoxOperations.length) { + // add the system menu as we move it from the rightbox to the panel to position it independently + let children = this.panel._rightBox.get_children().concat([this.panel.statusArea.aggregateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._rightBoxOperations, restore); + } + + if(this._centerBoxOperations.length) { + // add the date menu as we move it from the centerbox to the panel to position it independently + let children = this.panel._centerBox.get_children().concat([this.panel.statusArea.dateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._centerBoxOperations, restore); + } + + if(this._leftBoxOperations.length) { + let children = this.panel._leftBox.get_children(); + for(let i in children) + this._recursiveApply(children[i], this._leftBoxOperations, restore); + } + }, + + _recursiveApply: function(actor, operations, restore) { + for(let i in operations) { + let o = operations[i]; + if(o.compareFn(actor)) + if(restore) + o.restoreFn ? o.restoreFn(actor) : this._restoreOriginalStyle(actor); + else + o.applyFn(actor, i); + } + + if(actor.get_children) { + let children = actor.get_children(); + for(let i in children) { + this._recursiveApply(children[i], operations, restore); + } + } + }, + + _overrideStyle: function(actor, styleLine, operationIdx) { + if (actor._dtp_original_inline_style === undefined) { + actor._dtp_original_inline_style = actor.get_style(); + } + + if(actor._dtp_style_overrides === undefined) { + actor._dtp_style_overrides = {}; + } + + actor._dtp_style_overrides[operationIdx] = styleLine; + let newStyleLine = ''; + for(let i in actor._dtp_style_overrides) + newStyleLine += actor._dtp_style_overrides[i] + '; '; + actor.set_style(newStyleLine + (actor._dtp_original_inline_style || '')); + }, + + _restoreOriginalStyle: function(actor) { + if (actor._dtp_original_inline_style !== undefined) { + actor.set_style(actor._dtp_original_inline_style); + delete actor._dtp_original_inline_style; + delete actor._dtp_style_overrides; + } + + if (actor.has_style_class_name('panel-button')) { + this._refreshPanelButton(actor); + } + }, + + _refreshPanelButton: function(actor) { + if (actor.visible && imports.misc.config.PACKAGE_VERSION >= '3.34.0') { + //force gnome 3.34+ to refresh (having problem with the -natural-hpadding) + let parent = actor.get_parent(); + let children = parent.get_children(); + let actorIndex = 0; + + if (children.length > 1) { + actorIndex = children.indexOf(actor); + } + + this._ignoreAddedChild = [this.panel._centerBox, this.panel._rightBox].indexOf(parent) >= 0; + + parent.remove_child(actor); + parent.insert_child_at_index(actor, actorIndex); + } + } + +}); diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js new file mode 100644 index 0000000..3040787 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js @@ -0,0 +1,2468 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg. + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const GdkPixbuf = imports.gi.GdkPixbuf; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Gdk = imports.gi.Gdk; +const Lang = imports.lang; +const Mainloop = imports.mainloop; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; +const N_ = function(e) { return e }; +const PanelSettings = Me.imports.panelSettings; +const Pos = Me.imports.panelPositions; + +const SCALE_UPDATE_TIMEOUT = 500; +const DEFAULT_PANEL_SIZES = [ 128, 96, 64, 48, 32, 24, 16 ]; +const DEFAULT_FONT_SIZES = [ 96, 64, 48, 32, 24, 16, 0 ]; +const DEFAULT_MARGIN_SIZES = [ 32, 24, 16, 12, 8, 4, 0 ]; +const DEFAULT_PADDING_SIZES = [ 32, 24, 16, 12, 8, 4, 0, -1 ]; +// Minimum length could be 0, but a higher value may help prevent confusion about where the panel went. +const LENGTH_MARKS = [ 100, 90, 80, 70, 60, 50, 40, 30, 20, 10 ]; +const MAX_WINDOW_INDICATOR = 4; + +const SCHEMA_PATH = '/org/gnome/shell/extensions/dash-to-panel/'; +const GSET = 'gnome-shell-extension-tool'; + +/** + * This function was copied from the activities-config extension + * https://github.com/nls1729/acme-code/tree/master/activities-config + * by Norman L. Smith. + */ +function cssHexString(css) { + let rrggbb = '#'; + let start; + for (let loop = 0; loop < 3; loop++) { + let end = 0; + let xx = ''; + for (let loop = 0; loop < 2; loop++) { + while (true) { + let x = css.slice(end, end + 1); + if ((x == '(') || (x == ',') || (x == ')')) + break; + end++; + } + if (loop == 0) { + end++; + start = end; + } + } + xx = parseInt(css.slice(start, end)).toString(16); + if (xx.length == 1) + xx = '0' + xx; + rrggbb += xx; + css = css.slice(end); + } + return rrggbb; +} + +function setShortcut(settings, shortcutName) { + let shortcut_text = settings.get_string(shortcutName + '-text'); + let [key, mods] = Gtk.accelerator_parse(shortcut_text); + + if (Gtk.accelerator_valid(key, mods)) { + let shortcut = Gtk.accelerator_name(key, mods); + settings.set_strv(shortcutName, [shortcut]); + } + else { + settings.set_strv(shortcutName, []); + } +} + +function checkHotkeyPrefix(settings) { + settings.delay(); + + let hotkeyPrefix = settings.get_string('hotkey-prefix-text'); + if (hotkeyPrefix == 'Super') + hotkeyPrefix = ''; + else if (hotkeyPrefix == 'SuperAlt') + hotkeyPrefix = ''; + let [, mods] = Gtk.accelerator_parse(hotkeyPrefix); + let [, shift_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + let [, ctrl_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + + let numHotkeys = 10; + for (let i = 1; i <= numHotkeys; i++) { + let number = i; + if (number == 10) + number = 0; + let key = Gdk.keyval_from_name(number.toString()); + let key_kp = Gdk.keyval_from_name('KP_' + number.toString()); + if (Gtk.accelerator_valid(key, mods)) { + let shortcut = Gtk.accelerator_name(key, mods); + let shortcut_kp = Gtk.accelerator_name(key_kp, mods); + + // Setup shortcut strings + settings.set_strv('app-hotkey-' + i, [shortcut]); + settings.set_strv('app-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, shift_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, shift_mods); + settings.set_strv('app-shift-hotkey-' + i, [shortcut]); + settings.set_strv('app-shift-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, ctrl_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, ctrl_mods); + settings.set_strv('app-ctrl-hotkey-' + i, [shortcut]); + settings.set_strv('app-ctrl-hotkey-kp-' + i, [shortcut_kp]); + } + else { + // Reset default settings for the relevant keys if the + // accelerators are invalid + let keys = ['app-hotkey-' + i, 'app-shift-hotkey-' + i, 'app-ctrl-hotkey-' + i, // Regular numbers + 'app-hotkey-kp-' + i, 'app-shift-hotkey-kp-' + i, 'app-ctrl-hotkey-kp-' + i]; // Key-pad numbers + keys.forEach(function(val) { + settings.set_value(val, settings.get_default_value(val)); + }, this); + } + } + + settings.apply(); +} + +function mergeObjects(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +const Preferences = new Lang.Class({ + Name: 'DashToPanel.Preferences', + + _init: function() { + this._settings = Convenience.getSettings('org.gnome.shell.extensions.dash-to-panel'); + this._rtl = (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL); + this._builder = new Gtk.Builder(); + this._builder.set_scope(new BuilderScope(this)); + this._builder.set_translation_domain(Me.metadata['gettext-domain']); + this._builder.add_from_file(Me.path + '/Settings.ui'); + this.notebook = this._builder.get_object('settings_notebook'); + + // Timeout to delay the update of the settings + this._panel_size_timeout = 0; + this._dot_height_timeout = 0; + this._tray_size_timeout = 0; + this._leftbox_size_timeout = 0; + this._appicon_margin_timeout = 0; + this._appicon_padding_timeout = 0; + this._opacity_timeout = 0; + this._tray_padding_timeout = 0; + this._statusicon_padding_timeout = 0; + this._leftbox_padding_timeout = 0; + this._addFormatValueCallbacks(); + this._bindSettings(); + }, + + /** + * Connect signals + */ + _connector: function(builder, object, signal, handler) { + object.connect(signal, Lang.bind(this, this._SignalHandler[handler])); + }, + + _updateVerticalRelatedOptions: function() { + let position = this._getPanelPosition(this._currentMonitorIndex); + let isVertical = position == Pos.LEFT || position == Pos.RIGHT; + let showDesktopWidthLabel = this._builder.get_object('show_showdesktop_width_label'); + + showDesktopWidthLabel.set_text(isVertical ? _('Show Desktop button height (px)') : _('Show Desktop button width (px)')); + + this._displayPanelPositionsForMonitor(this._currentMonitorIndex); + }, + + _maybeDisableTopPosition: function() { + let keepTopPanel = this._settings.get_boolean('stockgs-keep-top-panel'); + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let topAvailable = !keepTopPanel || (!monitorSync && this._currentMonitorIndex != this.monitors[0]); + let topRadio = this._builder.get_object('position_top_button'); + + topRadio.set_sensitive(topAvailable); + topRadio.set_tooltip_text(!topAvailable ? _('Unavailable when gnome-shell top panel is present') : ''); + }, + + _getPanelPosition: function(monitorIndex) { + return PanelSettings.getPanelPosition(this._settings, monitorIndex); + }, + + _setPanelPosition: function(position) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelPosition(this._settings, monitorIndex, position); + }); + this._setAnchorLabels(this._currentMonitorIndex); + }, + + _setPositionRadios: function(position) { + this._ignorePositionRadios = true; + + switch (position) { + case Pos.BOTTOM: + this._builder.get_object('position_bottom_button').set_active(true); + break; + case Pos.TOP: + this._builder.get_object('position_top_button').set_active(true); + break; + case Pos.LEFT: + this._builder.get_object('position_left_button').set_active(true); + break; + case Pos.RIGHT: + this._builder.get_object('position_right_button').set_active(true); + break; + } + + this._ignorePositionRadios = false; + }, + + /** + * Set panel anchor combo labels according to whether the monitor's panel is vertical + * or horizontal, or if all monitors' panels are being configured and they are a mix + * of vertical and horizontal. + */ + _setAnchorLabels: function(currentMonitorIndex) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [currentMonitorIndex]; + const allVertical = monitorsToSetFor.every(i => { + const position = PanelSettings.getPanelPosition(this._settings, i); + return position === Pos.LEFT || position === Pos.RIGHT + }); + const allHorizontal = monitorsToSetFor.every(i => { + const position = PanelSettings.getPanelPosition(this._settings, i); + return position === Pos.TOP || position === Pos.BOTTOM; + }); + + const anchor_combo = this._builder.get_object('panel_anchor_combo'); + anchor_combo.remove_all(); + + if (allHorizontal) { + anchor_combo.append(Pos.START, _('Left')); + anchor_combo.append(Pos.MIDDLE, _('Center')); + anchor_combo.append(Pos.END, _('Right')); + } else if (allVertical) { + anchor_combo.append(Pos.START, _('Top')); + anchor_combo.append(Pos.MIDDLE, _('Middle')); + anchor_combo.append(Pos.END, _('Bottom')); + } else { + // Setting for a mix of horizontal and vertical panels on different monitors. + anchor_combo.append(Pos.START, _('Start')); + anchor_combo.append(Pos.MIDDLE, _('Middle')); + anchor_combo.append(Pos.END, _('End')); + } + + // Set combo box after re-populating its options. But only if it's for a single-panel + // configuration, or a multi-panel configuration where they all have the same anchor + // setting. So don't set the combo box if there is a multi-panel configuration with + // different anchor settings. + const someAnchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); + if (monitorsToSetFor.every(i => + PanelSettings.getPanelAnchor(this._settings, i) === someAnchor)) { + const panel_anchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); + this._builder.get_object('panel_anchor_combo').set_active_id(panel_anchor); + } + }, + + /** + * When a monitor is selected, update the widgets for panel position, size, anchoring, + * and contents so they accurately show the settings for the panel on that monitor. + */ + _updateWidgetSettingsForMonitor: function(monitorIndex) { + // Update display of panel screen position setting + this._maybeDisableTopPosition(); + const panelPosition = this._getPanelPosition(monitorIndex); + this._setPositionRadios(panelPosition); + + // Update display of thickness, length, and anchor settings + const panel_size_scale = this._builder.get_object('panel_size_scale'); + const size = PanelSettings.getPanelSize(this._settings, monitorIndex); + panel_size_scale.set_value(size); + + const panel_length_scale = this._builder.get_object('panel_length_scale'); + const length = PanelSettings.getPanelLength(this._settings, monitorIndex); + panel_length_scale.set_value(length); + this._setAnchorWidgetSensitivity(length); + + this._setAnchorLabels(monitorIndex); + + // Update display of panel content settings + this._displayPanelPositionsForMonitor(monitorIndex); + }, + + /** + * Anchor is only relevant if panel length is less than 100%. Enable or disable + * anchor widget sensitivity accordingly. + */ + _setAnchorWidgetSensitivity: function(panelLength) { + const isPartialLength = panelLength < 100; + this._builder.get_object('panel_anchor_label').set_sensitive(isPartialLength); + this._builder.get_object('panel_anchor_combo').set_sensitive(isPartialLength); + }, + + _displayPanelPositionsForMonitor: function(monitorIndex) { + let taskbarListBox = this._builder.get_object('taskbar_display_listbox'); + + while(taskbarListBox.get_first_child()) + { + taskbarListBox.remove(taskbarListBox.get_first_child()); + } + + let labels = {}; + let panelPosition = this._getPanelPosition(monitorIndex); + let isVertical = panelPosition == Pos.LEFT || panelPosition == Pos.RIGHT; + let panelElementPositionsSettings = PanelSettings.getSettingsJson(this._settings, 'panel-element-positions'); + let panelElementPositions = panelElementPositionsSettings[monitorIndex] || Pos.defaults; + let updateElementsSettings = () => { + let newPanelElementPositions = []; + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let monitors = monitorSync ? this.monitors : [monitorIndex]; + + let child = taskbarListBox.get_first_child(); + while (child != null) + { + newPanelElementPositions.push({ + element: child.id, + visible: child.visibleToggleBtn.get_active(), + position: child.positionCombo.get_active_id() + }); + child = child.get_next_sibling(); + } + + monitors.forEach(m => panelElementPositionsSettings[m] = newPanelElementPositions); + this._settings.set_string('panel-element-positions', JSON.stringify(panelElementPositionsSettings)); + }; + + + labels[Pos.SHOW_APPS_BTN] = _('Show Applications button'); + labels[Pos.ACTIVITIES_BTN] = _('Activities button'); + labels[Pos.TASKBAR] = _('Taskbar'); + labels[Pos.DATE_MENU] = _('Date menu'); + labels[Pos.SYSTEM_MENU] = _('System menu'); + labels[Pos.LEFT_BOX] = _('Left box'); + labels[Pos.CENTER_BOX] = _('Center box'); + labels[Pos.RIGHT_BOX] = _('Right box'); + labels[Pos.DESKTOP_BTN] = _('Desktop button'); + + panelElementPositions.forEach(el => { + let row = new Gtk.ListBoxRow(); + let grid = new Gtk.Grid({ margin_start: 12, margin_end: 12, column_spacing: 8 }); + let upDownGrid = new Gtk.Grid({ column_spacing: 2 }); + let upBtn = new Gtk.Button({ tooltip_text: _('Move up') }); + let upImg = new Gtk.Image({ icon_name: 'go-up-symbolic', pixel_size: 12 }); + let downBtn = new Gtk.Button({ tooltip_text: _('Move down') }); + let downImg = new Gtk.Image({ icon_name: 'go-down-symbolic', pixel_size: 12 }); + let visibleToggleBtn = new Gtk.ToggleButton({ label: _('Visible'), active: el.visible }); + let positionCombo = new Gtk.ComboBoxText({ tooltip_text: _('Select element position') }); + let upDownClickHandler = limit => { + let index = row.get_index(); + + if (index != limit) { + taskbarListBox.remove(row); + taskbarListBox.insert(row, index + (!limit ? -1 : 1)); + updateElementsSettings(); + } + }; + + positionCombo.append(Pos.STACKED_TL, isVertical ? _('Stacked to top') : _('Stacked to left')); + positionCombo.append(Pos.STACKED_BR, isVertical ? _('Stacked to bottom') :_('Stacked to right')); + positionCombo.append(Pos.CENTERED, _('Centered')); + positionCombo.append(Pos.CENTERED_MONITOR, _('Monitor Center')); + positionCombo.set_active_id(el.position); + + upBtn.connect('clicked', () => upDownClickHandler(0)); + downBtn.connect('clicked', () => upDownClickHandler(panelElementPositions.length - 1)); + visibleToggleBtn.connect('toggled', () => updateElementsSettings()); + positionCombo.connect('changed', () => updateElementsSettings()); + + upBtn.set_child(upImg); + downBtn.set_child(downImg); + + upDownGrid.attach(upBtn, 0, 0, 1, 1); + upDownGrid.attach(downBtn, 1, 0, 1, 1); + + grid.attach(upDownGrid, 0, 0, 1, 1); + grid.attach(new Gtk.Label({ label: labels[el.element], xalign: 0, hexpand: true }), 1, 0, 1, 1); + + if (Pos.optionDialogFunctions[el.element]) { + let cogImg = new Gtk.Image({ icon_name: 'emblem-system-symbolic' }); + let optionsBtn = new Gtk.Button({ tooltip_text: _('More options') }); + + optionsBtn.get_style_context().add_class('circular'); + optionsBtn.set_child(cogImg); + grid.attach(optionsBtn, 2, 0, 1, 1); + + optionsBtn.connect('clicked', () => this[Pos.optionDialogFunctions[el.element]]()); + } + + grid.attach(visibleToggleBtn, 3, 0, 1, 1); + grid.attach(positionCombo, 4, 0, 1, 1); + + row.id = el.element; + row.visibleToggleBtn = visibleToggleBtn; + row.positionCombo = positionCombo; + + row.set_child(grid); + taskbarListBox.insert(row, -1); + }); + }, + + _showShowAppsButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Applications options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('show_applications_options'); + dialog.get_content_area().append(box); + + let fileChooserButton = this._builder.get_object('show_applications_icon_file_filebutton'); + let fileChooser = new Gtk.FileChooserNative({ title: _('Open icon'), transient_for: dialog }); + let fileImage = this._builder.get_object('show_applications_current_icon_image'); + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + fileChooser.filter = fileFilter; + + let handleIconChange = function(newIconPath) { + if (newIconPath && GLib.file_test(newIconPath, GLib.FileTest.EXISTS)) { + let file = Gio.File.new_for_path(newIconPath); + let pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale(file.read(null), 32, 32, true, null); + + fileImage.set_from_pixbuf(pixbuf); + fileChooser.set_file(file); + fileChooserButton.set_label(newIconPath); + } else { + newIconPath = ''; + fileImage.set_from_icon_name('view-app-grid-symbolic'); + let picturesFolder = Gio.File.new_for_path(GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES)); + fileChooser.set_file(picturesFolder); + fileChooserButton.set_label("(None)"); + } + + this._settings.set_string('show-apps-icon-file', newIconPath || ''); + }; + + fileChooserButton.connect('clicked', Lang.bind(this, function() { + fileChooser.show(); + })); + + fileChooser.connect('response', widget => handleIconChange.call(this, widget.get_file().get_path())); + handleIconChange.call(this, this._settings.get_string('show-apps-icon-file')); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-apps-icon-side-padding', this._settings.get_default_value('show-apps-icon-side-padding')); + this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); + this._settings.set_value('show-apps-override-escape', this._settings.get_default_value('show-apps-override-escape')); + handleIconChange.call(this, null); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + fileChooser.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + }, + + _showDesktopButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Desktop options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_show_showdesktop_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('showdesktop-button-width', widget.get_value()); + })); + + this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); + this._builder.get_object('show_showdesktop_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-showdesktop-delay', widget.get_value()); + })); + + this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); + this._builder.get_object('show_showdesktop_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-showdesktop-time', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('showdesktop-button-width', this._settings.get_default_value('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + + this._settings.set_value('show-showdesktop-hover', this._settings.get_default_value('show-showdesktop-hover')); + + this._settings.set_value('show-showdesktop-delay', this._settings.get_default_value('show-showdesktop-delay')); + this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); + + this._settings.set_value('show-showdesktop-time', this._settings.get_default_value('show-showdesktop-time')); + this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + }, + + _addFormatValueCallbacks: function() { + // position + this._builder.get_object('panel_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // style + this._builder.get_object('appicon_margin_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('appicon_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // fine-tune box1 + this._builder.get_object('tray_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('leftbox_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // fine-tune box2 + this._builder.get_object('tray_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('statusicon_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('leftbox_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // animate hovering app icons dialog + this._builder.get_object('animate_appicon_hover_options_duration_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d ms").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_rotation_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d °").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_travel_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d %%").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_zoom_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d %%").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_convexity_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%.1f").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_extent_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return Gettext.ngettext("%d icon", "%d icons", value).format(value); + })); + }, + + _bindSettings: function() { + // size options + let panel_size_scale = this._builder.get_object('panel_size_scale'); + panel_size_scale.set_range(DEFAULT_PANEL_SIZES[DEFAULT_PANEL_SIZES.length - 1], DEFAULT_PANEL_SIZES[0]); + DEFAULT_PANEL_SIZES.slice(1, -1).forEach(function(val) { + panel_size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); + }); + + // Correct for rtl languages + if (this._rtl) { + // Flip value position: this is not done automatically + panel_size_scale.set_value_pos(Gtk.PositionType.LEFT); + // I suppose due to a bug, having a more than one mark and one above a value of 100 + // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable + // and then manually inverting it + panel_size_scale.set_flippable(false); + panel_size_scale.set_inverted(true); + } + + // Dots Position option + let dotPosition = this._settings.get_string('dot-position'); + + switch (dotPosition) { + case 'BOTTOM': + this._builder.get_object('dots_bottom_button').set_active(true); + break; + case 'TOP': + this._builder.get_object('dots_top_button').set_active(true); + break; + case 'LEFT': + this._builder.get_object('dots_left_button').set_active(true); + break; + case 'RIGHT': + this._builder.get_object('dots_right_button').set_active(true); + break; + } + + this._builder.get_object('dot_style_focused_combo').set_active_id(this._settings.get_string('dot-style-focused')); + this._builder.get_object('dot_style_focused_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('dot-style-focused', widget.get_active_id()); + })); + + this._builder.get_object('dot_style_unfocused_combo').set_active_id(this._settings.get_string('dot-style-unfocused')); + this._builder.get_object('dot_style_unfocused_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('dot-style-unfocused', widget.get_active_id()); + })); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + let idx = i; + this._builder.get_object('dot_color_' + idx + '_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('dot-color-' + idx, hexString); + })); + + this._builder.get_object('dot_color_unfocused_' + idx + '_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('dot-color-unfocused-' + idx, hexString); + })); + } + + this._builder.get_object('dot_color_apply_all_button').connect('clicked', Lang.bind(this, function() { + for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-' + i, this._settings.get_value('dot-color-1')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + } + })); + + this._builder.get_object('dot_color_unfocused_apply_all_button').connect('clicked', Lang.bind(this, function() { + for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_value('dot-color-unfocused-1')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + })); + + this._builder.get_object('focus_highlight_color_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('focus-highlight-color', hexString); + })); + + this._builder.get_object('dot_style_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Running Indicator Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_dots_options'); + dialog.get_content_area().append(box); + + this._settings.bind('dot-color-dominant', + this._builder.get_object('dot_color_dominant_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('dot_color_override_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + // when either becomes active, turn the other off + this._builder.get_object('dot_color_dominant_switch').connect('state-set', Lang.bind (this, function(widget) { + if (widget.get_active()) this._settings.set_boolean('dot-color-override', false); + })); + this._builder.get_object('dot_color_override_switch').connect('state-set', Lang.bind (this, function(widget) { + if (widget.get_active()) this._settings.set_boolean('dot-color-dominant', false); + })); + + this._settings.bind('dot-color-unfocused-different', + this._builder.get_object('dot_color_unfocused_different_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('grid_dot_color'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('dot_color_unfocused_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-unfocused-different', + this._builder.get_object('grid_dot_color_unfocused'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + + this._settings.bind('focus-highlight', + this._builder.get_object('focus_highlight_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight', + this._builder.get_object('grid_focus_highlight_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_dominant_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_color_label'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('focus-highlight-color')); + this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); + }).apply(this); + + this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); + this._builder.get_object('focus_highlight_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('focus-highlight-opacity', widget.get_value()); + })); + + this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); + this._builder.get_object('dot_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('dot-size', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('dot-color-dominant', this._settings.get_default_value('dot-color-dominant')); + this._settings.set_value('dot-color-override', this._settings.get_default_value('dot-color-override')); + this._settings.set_value('dot-color-unfocused-different', this._settings.get_default_value('dot-color-unfocused-different')); + + this._settings.set_value('focus-highlight-color', this._settings.get_default_value('focus-highlight-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('focus-highlight-color')); + this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); + + this._settings.set_value('focus-highlight-opacity', this._settings.get_default_value('focus-highlight-opacity')); + this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-' + i, this._settings.get_default_value('dot-color-' + i)); + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + + this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_default_value('dot-color-unfocused-' + i)); + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + + this._settings.set_value('dot-size', this._settings.get_default_value('dot-size')); + this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); + + this._settings.set_value('focus-highlight', this._settings.get_default_value('focus-highlight')); + this._settings.set_value('focus-highlight-dominant', this._settings.get_default_value('focus-highlight-dominant')); + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + //multi-monitor + this.monitors = this._settings.get_value('available-monitors').deep_unpack(); + + let dtpPrimaryMonitorIndex = this.monitors.indexOf(this._settings.get_int('primary-monitor')); + + if (dtpPrimaryMonitorIndex < 0) { + dtpPrimaryMonitorIndex = 0; + } + + this._currentMonitorIndex = this.monitors[dtpPrimaryMonitorIndex]; + + this._settings.connect('changed::panel-positions', () => this._updateVerticalRelatedOptions()); + this._updateVerticalRelatedOptions(); + + for (let i = 0; i < this.monitors.length; ++i) { + //the primary index is the first one in the "available-monitors" setting + let label = !i ? _('Primary monitor') : _('Monitor ') + (i + 1); + + this._builder.get_object('multimon_primary_combo').append_text(label); + this._builder.get_object('taskbar_position_monitor_combo').append_text(label); + } + + this._builder.get_object('multimon_primary_combo').set_active(dtpPrimaryMonitorIndex); + this._builder.get_object('taskbar_position_monitor_combo').set_active(dtpPrimaryMonitorIndex); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_sync_button'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_monitor_combo'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.connect('changed::panel-element-positions-monitors-sync', () => { + this._maybeDisableTopPosition(); + // The anchor combo box may has different labels for single- or all-monitor configuration. + this._setAnchorLabels(this._currentMonitorIndex); + }); + + this._builder.get_object('multimon_primary_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('primary-monitor', this.monitors[widget.get_active()]); + })); + + this._builder.get_object('taskbar_position_monitor_combo').connect('changed', Lang.bind (this, function(widget) { + this._currentMonitorIndex = this.monitors[widget.get_active()]; + this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); + })); + + this._settings.bind('multi-monitors', + this._builder.get_object('multimon_multi_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + if (this.monitors.length === 1) { + this._builder.get_object('multimon_multi_switch').set_sensitive(false); + } + + const panel_length_scale = this._builder.get_object('panel_length_scale'); + panel_length_scale.connect('value-changed', Lang.bind (this, function(widget) { + const value = widget.get_value(); + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelLength(this._settings, monitorIndex, value); + }); + + this._setAnchorWidgetSensitivity(value); + })); + + this._builder.get_object('panel_anchor_combo').connect('changed', Lang.bind (this, function(widget) { + const value = widget.get_active_id(); + // Value can be null while anchor labels are being swapped out + if (value !== null) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelAnchor(this._settings, monitorIndex, value); + }); + } + })); + + this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); + + //dynamic opacity + this._settings.bind('trans-use-custom-bg', + this._builder.get_object('trans_bg_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-bg', + this._builder.get_object('trans_bg_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('trans-bg-color')); + this._builder.get_object('trans_bg_color_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_bg_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-bg-color', hexString); + })); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_override_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('trans_opacity_override_switch').connect('notify::active', (widget) => { + if (!widget.get_active()) + this._builder.get_object('trans_dyn_switch').set_active(false); + }); + + this._builder.get_object('trans_opacity_spinbutton').set_value(this._settings.get_double('trans-panel-opacity') * 100); + this._builder.get_object('trans_opacity_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-panel-opacity', widget.get_value() * 0.01); + })); + + this._settings.bind('trans-use-dynamic-opacity', + this._builder.get_object('trans_dyn_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-dynamic-opacity', + this._builder.get_object('trans_dyn_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-dynamic-behavior', + this._builder.get_object('trans_options_window_type_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-gradient', + this._builder.get_object('trans_gradient_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-gradient', + this._builder.get_object('trans_gradient_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + rgba.parse(this._settings.get_string('trans-gradient-top-color')); + this._builder.get_object('trans_gradient_color1_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_gradient_color1_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-gradient-top-color', hexString); + })); + + this._builder.get_object('trans_gradient_color1_spinbutton').set_value(this._settings.get_double('trans-gradient-top-opacity') * 100); + this._builder.get_object('trans_gradient_color1_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-gradient-top-opacity', widget.get_value() * 0.01); + })); + + rgba.parse(this._settings.get_string('trans-gradient-bottom-color')); + this._builder.get_object('trans_gradient_color2_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_gradient_color2_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-gradient-bottom-color', hexString); + })); + + this._builder.get_object('trans_gradient_color2_spinbutton').set_value(this._settings.get_double('trans-gradient-bottom-opacity') * 100); + this._builder.get_object('trans_gradient_color2_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-gradient-bottom-opacity', widget.get_value() * 0.01); + })); + + this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); + this._builder.get_object('trans_options_distance_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('trans-dynamic-distance', widget.get_value()); + })); + + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); + this._builder.get_object('trans_options_min_opacity_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-dynamic-anim-target', widget.get_value() * 0.01); + })); + + this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); + this._builder.get_object('trans_options_anim_time_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('trans-dynamic-anim-time', widget.get_value()); + })); + + this._builder.get_object('trans_dyn_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Dynamic opacity options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_dynamic_opacity_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('trans-dynamic-behavior', this._settings.get_default_value('trans-dynamic-behavior')); + + this._settings.set_value('trans-dynamic-distance', this._settings.get_default_value('trans-dynamic-distance')); + this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); + + this._settings.set_value('trans-dynamic-anim-target', this._settings.get_default_value('trans-dynamic-anim-target')); + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); + + this._settings.set_value('trans-dynamic-anim-time', this._settings.get_default_value('trans-dynamic-anim-time')); + this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + this._settings.bind('desktop-line-use-custom-color', + this._builder.get_object('override_show_desktop_line_color_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('desktop-line-use-custom-color', + this._builder.get_object('override_show_desktop_line_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + rgba.parse(this._settings.get_string('desktop-line-custom-color')); + this._builder.get_object('override_show_desktop_line_color_colorbutton').set_rgba(rgba); + this._builder.get_object('override_show_desktop_line_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + this._settings.set_string('desktop-line-custom-color', css); + })); + + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_window_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_behaviour_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-behaviour', + this._builder.get_object('intellihide_behaviour_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-use-pressure', + this._builder.get_object('intellihide_use_pressure_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-use-pressure', + this._builder.get_object('intellihide_use_pressure_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-show-in-fullscreen', + this._builder.get_object('intellihide_show_in_fullscreen_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-only-secondary', + this._builder.get_object('intellihide_only_secondary_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('multi-monitors', + this._builder.get_object('grid_intellihide_only_secondary'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('multimon_multi_switch').connect('notify::active', (widget) => { + if (!widget.get_active()) + this._builder.get_object('intellihide_only_secondary_switch').set_active(false); + }); + + this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); + this._builder.get_object('intellihide_pressure_threshold_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('intellihide-pressure-threshold', widget.get_value()); + })); + + this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); + this._builder.get_object('intellihide_pressure_time_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('intellihide-pressure-time', widget.get_value()); + })); + + this._settings.bind('intellihide-key-toggle-text', + this._builder.get_object('intellihide_toggle_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::intellihide-key-toggle-text', () => setShortcut(this._settings, 'intellihide-key-toggle')); + + this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); + this._builder.get_object('intellihide_animation_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-animation-time', widget.get_value()); + })); + + this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); + this._builder.get_object('intellihide_close_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-close-delay', widget.get_value()); + })); + + this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); + this._builder.get_object('intellihide_enable_start_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-enable-start-delay', widget.get_value()); + })); + + this._builder.get_object('intellihide_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Intellihide options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_intellihide_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('intellihide-hide-from-windows', this._settings.get_default_value('intellihide-hide-from-windows')); + this._settings.set_value('intellihide-behaviour', this._settings.get_default_value('intellihide-behaviour')); + this._settings.set_value('intellihide-use-pressure', this._settings.get_default_value('intellihide-use-pressure')); + this._settings.set_value('intellihide-show-in-fullscreen', this._settings.get_default_value('intellihide-show-in-fullscreen')); + this._settings.set_value('intellihide-only-secondary', this._settings.get_default_value('intellihide-only-secondary')); + + this._settings.set_value('intellihide-pressure-threshold', this._settings.get_default_value('intellihide-pressure-threshold')); + this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); + + this._settings.set_value('intellihide-pressure-time', this._settings.get_default_value('intellihide-pressure-time')); + this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); + + this._settings.set_value('intellihide-key-toggle-text', this._settings.get_default_value('intellihide-key-toggle-text')); + + this._settings.set_value('intellihide-animation-time', this._settings.get_default_value('intellihide-animation-time')); + this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); + + this._settings.set_value('intellihide-close-delay', this._settings.get_default_value('intellihide-close-delay')); + this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); + + this._settings.set_value('intellihide-enable-start-delay', this._settings.get_default_value('intellihide-enable-start-delay')); + this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + // Behavior panel + + this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); + this._builder.get_object('show_applications_side_padding_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-apps-icon-side-padding', widget.get_value()); + })); + + this._settings.bind('show-apps-override-escape', + this._builder.get_object('show_applications_esc_key_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-hover', + this._builder.get_object('show_showdesktop_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-hover', + this._builder.get_object('grid_show_showdesktop_hide_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-appmenu', + this._builder.get_object('show_appmenu_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-tooltip', + this._builder.get_object('show_tooltip_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('show_favorite_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites-all-monitors', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-running-apps', + this._builder.get_object('show_runnning_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._setPreviewTitlePosition(); + + this._builder.get_object('grid_preview_title_font_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('window-preview-title-font-color', hexString); + })); + + this._builder.get_object('show_window_previews_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Window preview options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let scrolledWindow = this._builder.get_object('box_window_preview_options'); + + dialog.get_content_area().append(scrolledWindow); + + this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); + this._builder.get_object('preview_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-window-previews-timeout', widget.get_value()); + })); + + this._settings.bind('preview-middle-click-close', + this._builder.get_object('preview_middle_click_close_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-fixed-x', + this._builder.get_object('preview_aspect_ratio_x_fixed_togglebutton'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-fixed-y', + this._builder.get_object('preview_aspect_ratio_y_fixed_togglebutton'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('preview-use-custom-opacity', + this._builder.get_object('preview_custom_opacity_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('preview-use-custom-opacity', + this._builder.get_object('preview_custom_opacity_spinbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-use-custom-icon-size', + this._builder.get_object('preview_custom_icon_size_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-use-custom-icon-size', + this._builder.get_object('preview_custom_icon_size_spinbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); + this._builder.get_object('preview_custom_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('preview-custom-opacity', widget.get_value()); + })); + + this._settings.bind('peek-mode', + this._builder.get_object('peek_mode_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('peek-mode', + this._builder.get_object('grid_enter_peek_mode_timeout'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('peek-mode', + this._builder.get_object('grid_peek_mode_opacity'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-show-title', + this._builder.get_object('preview_show_title_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_custom_icon_size'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_size'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_weight'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_font_color'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); + this._builder.get_object('enter_peek_mode_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('enter-peek-mode-timeout', widget.get_value()); + })); + + this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); + this._builder.get_object('leave_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('leave-timeout', widget.get_value()); + })); + + this._settings.bind('window-preview-hide-immediate-click', + this._builder.get_object('preview_immediate_click_button'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); + this._builder.get_object('animation_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-animation-time', widget.get_value()); + })); + + this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); + this._builder.get_object('peek_mode_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('peek-mode-opacity', widget.get_value()); + })); + + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-size', widget.get_value()); + })); + + this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); + this._builder.get_object('preview_aspect_ratio_x_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-aspect-ratio-x', parseInt(widget.get_active_id(), 10)); + })); + + this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); + this._builder.get_object('preview_aspect_ratio_y_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-aspect-ratio-y', parseInt(widget.get_active_id(), 10)); + })); + + this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); + this._builder.get_object('preview_padding_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-padding', widget.get_value()); + })); + + this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); + this._builder.get_object('preview_title_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-title-font-size', widget.get_value()); + })); + + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); + this._builder.get_object('preview_custom_icon_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-custom-icon-size', widget.get_value()); + })); + + this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); + this._builder.get_object('grid_preview_title_weight_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('window-preview-title-font-weight', widget.get_active_id()); + })); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('window-preview-title-font-color')); + this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); + }).apply(this); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-window-previews-timeout', this._settings.get_default_value('show-window-previews-timeout')); + this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); + + this._settings.set_value('leave-timeout', this._settings.get_default_value('leave-timeout')); + this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); + + this._settings.set_value('window-preview-hide-immediate-click', this._settings.get_default_value('window-preview-hide-immediate-click')); + + this._settings.set_value('window-preview-animation-time', this._settings.get_default_value('window-preview-animation-time')); + this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); + + this._settings.set_value('preview-use-custom-opacity', this._settings.get_default_value('preview-use-custom-opacity')); + + this._settings.set_value('window-preview-use-custom-icon-size', this._settings.get_default_value('window-preview-use-custom-icon-size')); + + this._settings.set_value('preview-custom-opacity', this._settings.get_default_value('preview-custom-opacity')); + this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); + + this._settings.set_value('window-preview-title-position', this._settings.get_default_value('window-preview-title-position')); + this._setPreviewTitlePosition(); + + this._settings.set_value('peek-mode', this._settings.get_default_value('peek-mode')); + this._settings.set_value('window-preview-show-title', this._settings.get_default_value('window-preview-show-title')); + this._settings.set_value('enter-peek-mode-timeout', this._settings.get_default_value('enter-peek-mode-timeout')); + this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); + this._settings.set_value('peek-mode-opacity', this._settings.get_default_value('peek-mode-opacity')); + this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); + + this._settings.set_value('window-preview-size', this._settings.get_default_value('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + + this._settings.set_value('window-preview-fixed-x', this._settings.get_default_value('window-preview-fixed-x')); + this._settings.set_value('window-preview-fixed-y', this._settings.get_default_value('window-preview-fixed-y')); + + this._settings.set_value('window-preview-aspect-ratio-x', this._settings.get_default_value('window-preview-aspect-ratio-x')); + this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); + + this._settings.set_value('window-preview-aspect-ratio-y', this._settings.get_default_value('window-preview-aspect-ratio-y')); + this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); + + this._settings.set_value('window-preview-padding', this._settings.get_default_value('window-preview-padding')); + this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); + + this._settings.set_value('preview-middle-click-close', this._settings.get_default_value('preview-middle-click-close')); + + this._settings.set_value('window-preview-title-font-size', this._settings.get_default_value('window-preview-title-font-size')); + this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); + + this._settings.set_value('window-preview-custom-icon-size', this._settings.get_default_value('window-preview-custom-icon-size')); + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); + + this._settings.set_value('window-preview-title-font-weight', this._settings.get_default_value('window-preview-title-font-weight')); + this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); + + this._settings.set_value('window-preview-title-font-color', this._settings.get_default_value('window-preview-title-font-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('window-preview-title-font-color')); + this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(scrolledWindow); + dialog.destroy(); + } + return; + })); + + dialog.show(); + + })); + + this._settings.bind('isolate-workspaces', + this._builder.get_object('isolate_workspaces_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('isolate-monitors', + this._builder.get_object('multimon_multi_isolate_monitor_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('overview-click-to-exit', + this._builder.get_object('clicktoexit_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('hide-overview-on-startup', + this._builder.get_object('hide_overview_on_startup_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps', + this._builder.get_object('group_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('group-apps', + this._builder.get_object('show_group_apps_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._builder.get_object('group_apps_label_font_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('group-apps-label-font-color', hexString); + })); + + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('group-apps-label-font-color-minimized', hexString); + })); + + this._settings.bind('group-apps-use-fixed-width', + this._builder.get_object('group_apps_use_fixed_width_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps-underline-unfocused', + this._builder.get_object('group_apps_underline_unfocused_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps-use-launchers', + this._builder.get_object('group_apps_use_launchers_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('show_group_apps_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Ungrouped application options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_group_apps_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); + this._builder.get_object('group_apps_label_font_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('group-apps-label-font-size', widget.get_value()); + })); + + this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); + this._builder.get_object('group_apps_label_font_weight_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('group-apps-label-font-weight', widget.get_active_id()); + })); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color')); + this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); + }).apply(this); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color-minimized')); + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(rgba); + }).apply(this); + + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('group-apps-label-max-width', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('group-apps-label-font-size', this._settings.get_default_value('group-apps-label-font-size')); + this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); + + this._settings.set_value('group-apps-label-font-weight', this._settings.get_default_value('group-apps-label-font-weight')); + this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); + + this._settings.set_value('group-apps-label-font-color', this._settings.get_default_value('group-apps-label-font-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color')); + this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); + + this._settings.set_value('group-apps-label-font-color-minimized', this._settings.get_default_value('group-apps-label-font-color-minimized')); + let minimizedFontColor = new Gdk.RGBA(); + minimizedFontColor.parse(this._settings.get_string('group-apps-label-font-color-minimized')); + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(minimizedFontColor); + + this._settings.set_value('group-apps-label-max-width', this._settings.get_default_value('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + + this._settings.set_value('group-apps-use-fixed-width', this._settings.get_default_value('group-apps-use-fixed-width')); + this._settings.set_value('group-apps-underline-unfocused', this._settings.get_default_value('group-apps-underline-unfocused')); + this._settings.set_value('group-apps-use-launchers', this._settings.get_default_value('group-apps-use-launchers')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(600, 1); + + })); + + this._builder.get_object('click_action_combo').set_active_id(this._settings.get_string('click-action')); + this._builder.get_object('click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('click-action', widget.get_active_id()); + })); + + this._builder.get_object('shift_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-click-action', widget.get_active_id()); + })); + + this._builder.get_object('middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('middle-click-action', widget.get_active_id()); + })); + this._builder.get_object('shift_middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-middle-click-action', widget.get_active_id()); + })); + + // Create dialog for middle-click options + this._builder.get_object('middle_click_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Customize middle-click behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_middle_click_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); + + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); + + this._settings.bind('shift-click-action', + this._builder.get_object('shift_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('middle-click-action', + this._builder.get_object('middle_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('shift-middle-click-action', + this._builder.get_object('shift_middle_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings for the relevant keys + let keys = ['shift-click-action', 'middle-click-action', 'shift-middle-click-action']; + keys.forEach(function(val) { + this._settings.set_value(val, this._settings.get_default_value(val)); + }, this); + this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(700, 1); + + })); + + this._builder.get_object('scroll_panel_combo').set_active_id(this._settings.get_string('scroll-panel-action')); + this._builder.get_object('scroll_panel_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('scroll-panel-action', widget.get_active_id()); + })); + + this._builder.get_object('scroll_icon_combo').set_active_id(this._settings.get_string('scroll-icon-action')); + this._builder.get_object('scroll_icon_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('scroll-icon-action', widget.get_active_id()); + })); + + // Create dialog for panel scroll options + this._builder.get_object('scroll_panel_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Customize panel scroll behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('scroll_panel_options_box'); + dialog.get_content_area().append(box); + + this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); + this._builder.get_object('scroll_panel_options_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('scroll-panel-delay', widget.get_value()); + })); + + this._settings.bind('scroll-panel-show-ws-popup', + this._builder.get_object('scroll_panel_options_show_ws_popup_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('scroll-panel-delay', this._settings.get_default_value('scroll-panel-delay')); + this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); + + this._settings.set_value('scroll-panel-show-ws-popup', this._settings.get_default_value('scroll-panel-show-ws-popup')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(640, 1); + + })); + + // Create dialog for icon scroll options + this._builder.get_object('scroll_icon_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Customize icon scroll behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('scroll_icon_options_box'); + dialog.get_content_area().append(box); + + this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); + this._builder.get_object('scroll_icon_options_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('scroll-icon-delay', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('scroll-icon-delay', this._settings.get_default_value('scroll-icon-delay')); + this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(640, 1); + + })); + + this._settings.bind('hot-keys', + this._builder.get_object('hot_keys_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('hot-keys', + this._builder.get_object('overlay_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('overlay_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('hotkeys-overlay-combo', widget.get_active_id()); + })); + + this._settings.bind('shortcut-previews', + this._builder.get_object('shortcut_preview_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('shortcut_num_keys_combo').set_active_id(this._settings.get_string('shortcut-num-keys')); + this._builder.get_object('shortcut_num_keys_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shortcut-num-keys', widget.get_active_id()); + })); + + this._settings.connect('changed::hotkey-prefix-text', Lang.bind(this, function() {checkHotkeyPrefix(this._settings);})); + + this._builder.get_object('hotkey_prefix_combo').set_active_id(this._settings.get_string('hotkey-prefix-text')); + + this._settings.bind('hotkey-prefix-text', + this._builder.get_object('hotkey_prefix_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('overlay_combo').set_active_id(this._settings.get_string('hotkeys-overlay-combo')); + + this._settings.bind('hotkeys-overlay-combo', + this._builder.get_object('overlay_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('overlay-timeout', + this._builder.get_object('timeout_spinbutton'), + 'value', + Gio.SettingsBindFlags.DEFAULT); + if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') { + this._builder.get_object('timeout_spinbutton').set_sensitive(false); + } + + this._settings.connect('changed::hotkeys-overlay-combo', Lang.bind(this, function() { + if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') + this._builder.get_object('timeout_spinbutton').set_sensitive(false); + else + this._builder.get_object('timeout_spinbutton').set_sensitive(true); + })); + + this._settings.bind('shortcut-text', + this._builder.get_object('shortcut_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::shortcut-text', Lang.bind(this, function() {setShortcut(this._settings, 'shortcut');})); + + // Create dialog for number overlay options + this._builder.get_object('overlay_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Advanced hotkeys options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_overlay_shortcut'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings for the relevant keys + let keys = ['hotkey-prefix-text', 'shortcut-text', 'hotkeys-overlay-combo', 'overlay-timeout', 'shortcut-previews']; + keys.forEach(function(val) { + this._settings.set_value(val, this._settings.get_default_value(val)); + }, this); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(600, 1); + + })); + + // setup dialog for secondary menu options + this._builder.get_object('secondarymenu_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Secondary Menu Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_secondarymenu_options'); + dialog.get_content_area().append(box); + + this._settings.bind('secondarymenu-contains-appmenu', + this._builder.get_object('secondarymenu_appmenu_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('secondarymenu-contains-showdetails', + this._builder.get_object('secondarymenu_showdetails_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('secondarymenu-contains-appmenu', this._settings.get_default_value('secondarymenu-contains-appmenu')); + this._settings.set_value('secondarymenu-contains-showdetails', this._settings.get_default_value('secondarymenu-contains-showdetails')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(480, 1); + + })); + + // setup dialog for advanced options + this._builder.get_object('button_advanced_options').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Advanced Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_advanced_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(480, 1); + + })); + + // Fine-tune panel + + let sizeScales = [ + {objectName: 'tray_size_scale', valueName: 'tray-size', range: DEFAULT_FONT_SIZES }, + {objectName: 'leftbox_size_scale', valueName: 'leftbox-size', range: DEFAULT_FONT_SIZES }, + {objectName: 'appicon_margin_scale', valueName: 'appicon-margin', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'appicon_padding_scale', valueName: 'appicon-padding', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'tray_padding_scale', valueName: 'tray-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'leftbox_padding_scale', valueName: 'leftbox-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'statusicon_padding_scale', valueName: 'status-icon-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS } + ]; + + for(var idx in sizeScales) { + let size_scale = this._builder.get_object(sizeScales[idx].objectName); + let range = sizeScales[idx].range; + size_scale.set_range(range[range.length - 1], range[0]); + let value; + if (sizeScales[idx].objectName === 'panel_length_scale') { + value = PanelSettings.getPanelLength(this._settings, this._currentMonitorIndex); + } else { + value = this._settings.get_int(sizeScales[idx].valueName); + } + size_scale.set_value(value); + // Add marks from range arrays, omitting the first and last values. + range.slice(1, -1).forEach(function(val) { + size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); + }); + + // Corrent for rtl languages + if (this._rtl) { + // Flip value position: this is not done automatically + size_scale.set_value_pos(Gtk.PositionType.LEFT); + // I suppose due to a bug, having a more than one mark and one above a value of 100 + // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable + // and then manually inverting it + size_scale.set_flippable(false); + size_scale.set_inverted(true); + } + } + + this._settings.bind('animate-app-switch', + this._builder.get_object('animate_app_switch_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-window-launch', + this._builder.get_object('animate_window_launch_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-appicon-hover', + this._builder.get_object('animate_appicon_hover_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-appicon-hover', + this._builder.get_object('animate_appicon_hover_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + { + this._settings.bind('animate-appicon-hover-animation-type', + this._builder.get_object('animate_appicon_hover_options_type_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + let scales = [ + ['animate_appicon_hover_options_duration_scale', 'animate-appicon-hover-animation-duration', 1], + ['animate_appicon_hover_options_rotation_scale', 'animate-appicon-hover-animation-rotation', 1], + ['animate_appicon_hover_options_travel_scale', 'animate-appicon-hover-animation-travel', 100], + ['animate_appicon_hover_options_zoom_scale', 'animate-appicon-hover-animation-zoom', 100], + ['animate_appicon_hover_options_convexity_scale', 'animate-appicon-hover-animation-convexity', 1], + ['animate_appicon_hover_options_extent_scale', 'animate-appicon-hover-animation-extent', 1], + ]; + + let updateScale = scale => { + let [id, key, factor] = scale; + let type = this._settings.get_string('animate-appicon-hover-animation-type'); + let value = this._settings.get_value(key).deep_unpack()[type]; + let defaultValue = this._settings.get_default_value(key).deep_unpack()[type]; + this._builder.get_object(id).sensitive = defaultValue !== undefined; + this._builder.get_object(id).set_value(value * factor || 0); + this._builder.get_object(id).clear_marks(); + this._builder.get_object(id).add_mark(defaultValue * factor, Gtk.PositionType.TOP, + defaultValue !== undefined ? (defaultValue * factor).toString() : ' '); + }; + + scales.forEach(scale => { + let [id, key, factor] = scale; + this._settings.connect('changed::' + key, () => updateScale(scale)); + this._builder.get_object(id).connect('value-changed', widget => { + let type = this._settings.get_string('animate-appicon-hover-animation-type'); + let variant = this._settings.get_value(key); + let unpacked = variant.deep_unpack(); + if (unpacked[type] != widget.get_value() / factor) { + unpacked[type] = widget.get_value() / factor; + this._settings.set_value(key, new GLib.Variant(variant.get_type_string(), unpacked)); + } + }); + }); + + this._settings.connect('changed::animate-appicon-hover-animation-type', () => scales.forEach(updateScale)); + scales.forEach(updateScale); + } + + this._builder.get_object('animate_appicon_hover_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('App icon animation options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('animate_appicon_hover_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('animate-appicon-hover-animation-type', this._settings.get_default_value('animate-appicon-hover-animation-type')); + this._settings.set_value('animate-appicon-hover-animation-duration', this._settings.get_default_value('animate-appicon-hover-animation-duration')); + this._settings.set_value('animate-appicon-hover-animation-rotation', this._settings.get_default_value('animate-appicon-hover-animation-rotation')); + this._settings.set_value('animate-appicon-hover-animation-travel', this._settings.get_default_value('animate-appicon-hover-animation-travel')); + this._settings.set_value('animate-appicon-hover-animation-zoom', this._settings.get_default_value('animate-appicon-hover-animation-zoom')); + this._settings.set_value('animate-appicon-hover-animation-convexity', this._settings.get_default_value('animate-appicon-hover-animation-convexity')); + this._settings.set_value('animate-appicon-hover-animation-extent', this._settings.get_default_value('animate-appicon-hover-animation-extent')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + + })); + + this._settings.bind('stockgs-keep-dash', + this._builder.get_object('stockgs_dash_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('stockgs-keep-top-panel', + this._builder.get_object('stockgs_top_panel_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + + + this._settings.connect('changed::stockgs-keep-top-panel', () => this._maybeDisableTopPosition()); + + this._maybeDisableTopPosition(); + + this._settings.bind('stockgs-panelbtn-click-only', + this._builder.get_object('stockgs_panelbtn_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('stockgs-force-hotcorner', + this._builder.get_object('stockgs_hotcorner_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + // About Panel + + this._builder.get_object('extension_version').set_label(Me.metadata.version.toString() + (Me.metadata.commit ? ' (' + Me.metadata.commit + ')' : '')); + + this._builder.get_object('importexport_export_button').connect('clicked', widget => { + this._showFileChooser( + _('Export settings'), + { action: Gtk.FileChooserAction.SAVE }, + "Save", + filename => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + + out.write_all(GLib.spawn_command_line_sync('dconf dump ' + SCHEMA_PATH)[1], null); + out.close(null); + } + ); + }); + + this._builder.get_object('importexport_import_button').connect('clicked', widget => { + this._showFileChooser( + _('Import settings'), + { action: Gtk.FileChooserAction.OPEN }, + "Open", + filename => { + if (filename && GLib.file_test(filename, GLib.FileTest.EXISTS)) { + let settingsFile = Gio.File.new_for_path(filename); + let [ , pid, stdin, stdout, stderr] = + GLib.spawn_async_with_pipes( + null, + ['dconf', 'load', SCHEMA_PATH], + null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null + ); + + stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); + GLib.close(stdout); + GLib.close(stderr); + + let [ , , , retCode] = GLib.spawn_command_line_sync(GSET + ' -d ' + Me.uuid); + if (retCode == 0) { + GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, () => GLib.spawn_command_line_sync(GSET + ' -e ' + Me.uuid)); + } + + stdin.splice(settingsFile.read(null), Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, null); + } + } + ); + }); + + }, + + _setPreviewTitlePosition: function() { + switch (this._settings.get_string('window-preview-title-position')) { + case 'BOTTOM': + this._builder.get_object('preview_title_position_bottom_button').set_active(true); + break; + case 'TOP': + this._builder.get_object('preview_title_position_top_button').set_active(true); + break; + } + }, + + _showFileChooser: function(title, params, acceptBtn, acceptHandler) { + let dialog = new Gtk.FileChooserDialog(mergeObjects({ title: title, transient_for: this.notebook.get_root() }, params)); + + dialog.add_button("Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button(acceptBtn, Gtk.ResponseType.ACCEPT); + + dialog.show(); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + acceptHandler.call(this, dialog.get_file().get_path()); + dialog.destroy(); + })); + } +}); + + +const BuilderScope = GObject.registerClass({ + Implements: [Gtk.BuilderScope], +}, class BuilderScope extends GObject.Object { + + _init(preferences) { + this._preferences = preferences; + super._init(); + } + + vfunc_create_closure(builder, handlerName, flags, connectObject) { + if (flags & Gtk.BuilderClosureFlags.SWAPPED) + throw new Error('Unsupported template signal flag "swapped"'); + + if (typeof this[handlerName] === 'undefined') + throw new Error(`${handlerName} is undefined`); + + return this[handlerName].bind(connectObject || this); + } + + on_btn_click(connectObject) { + connectObject.set_label("Clicked"); + } + + position_bottom_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.BOTTOM); + } + + position_top_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.TOP); + } + + position_left_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.LEFT); + } + + position_right_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.RIGHT); + } + + dots_bottom_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "BOTTOM"); + } + + dots_top_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "TOP"); + } + + dots_left_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "LEFT"); + } + + dots_right_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "RIGHT"); + } + + preview_title_position_bottom_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('window-preview-title-position', 'BOTTOM'); + } + + preview_title_position_top_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('window-preview-title-position', 'TOP'); + } + + panel_size_scale_value_changed_cb(scale) { + // Avoid settings the size continuously + if (this._preferences._panel_size_timeout > 0) + Mainloop.source_remove(this._preferences._panel_size_timeout); + + this._preferences._panel_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this._preferences, function() { + const value = scale.get_value(); + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelSize(this._settings, monitorIndex, value); + }); + + this._panel_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + tray_size_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._tray_size_timeout > 0) + Mainloop.source_remove(this._preferences._tray_size_timeout); + + this._preferences._tray_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('tray-size', scale.get_value()); + this._preferences._tray_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + leftbox_size_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._leftbox_size_timeout > 0) + Mainloop.source_remove(this._preferences._leftbox_size_timeout); + + this._preferences._leftbox_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('leftbox-size', scale.get_value()); + this._preferences._leftbox_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + appicon_margin_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_margin_timeout > 0) + Mainloop.source_remove(this._preferences._appicon_margin_timeout); + + this._preferences._appicon_margin_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('appicon-margin', scale.get_value()); + this._preferences._appicon_margin_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + appicon_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_padding_timeout > 0) + Mainloop.source_remove(this._preferences._appicon_padding_timeout); + + this._preferences._appicon_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('appicon-padding', scale.get_value()); + this._preferences._appicon_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + tray_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._tray_padding_timeout > 0) + Mainloop.source_remove(this._preferences._tray_padding_timeout); + + this._preferences._tray_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('tray-padding', scale.get_value()); + this._preferences._tray_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + statusicon_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._statusicon_padding_timeout > 0) + Mainloop.source_remove(this._preferences._statusicon_padding_timeout); + + this._preferences._statusicon_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('status-icon-padding', scale.get_value()); + this._preferences._statusicon_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + leftbox_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._leftbox_padding_timeout > 0) + Mainloop.source_remove(this._preferences._leftbox_padding_timeout); + + this._preferences._leftbox_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('leftbox-padding', scale.get_value()); + this._preferences._leftbox_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } +}); + +function init() { + Convenience.initTranslations(); +} + +function buildPrefsWidget() { + Gtk.Window.list_toplevels()[0].set_default_size(680, 740); + + let preferences = new Preferences(); + + return preferences.notebook; +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js new file mode 100644 index 0000000..1e84e82 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js @@ -0,0 +1,598 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gio = imports.gi.Gio; +const Cairo = imports.cairo; +const Clutter = imports.gi.Clutter; +const Pango = imports.gi.Pango; +const St = imports.gi.St; +const Signals = imports.signals; +const Utils = Me.imports.utils; + + +var ProgressManager = Utils.defineClass({ + Name: 'DashToPanel.ProgressManager', + + _init: function() { + + this._entriesByDBusName = {}; + + this._launcher_entry_dbus_signal_id = + Gio.DBus.session.signal_subscribe(null, // sender + 'com.canonical.Unity.LauncherEntry', // iface + null, // member + null, // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onEntrySignalReceived.bind(this)); + + this._dbus_name_owner_changed_signal_id = + Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender + 'org.freedesktop.DBus', // interface + 'NameOwnerChanged', // member + '/org/freedesktop/DBus', // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onDBusNameOwnerChanged.bind(this)); + + this._acquireUnityDBus(); + }, + + destroy: function() { + if (this._launcher_entry_dbus_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id); + } + + if (this._dbus_name_owner_changed_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id); + } + + this._releaseUnityDBus(); + }, + + size: function() { + return Object.keys(this._entriesByDBusName).length; + }, + + lookupByDBusName: function(dbusName) { + return this._entriesByDBusName.hasOwnProperty(dbusName) ? this._entriesByDBusName[dbusName] : null; + }, + + lookupById: function(appId) { + let ret = []; + for (let dbusName in this._entriesByDBusName) { + let entry = this._entriesByDBusName[dbusName]; + if (entry && entry.appId() == appId) { + ret.push(entry); + } + } + + return ret; + }, + + addEntry: function(entry) { + let existingEntry = this.lookupByDBusName(entry.dbusName()); + if (existingEntry) { + existingEntry.update(entry); + } else { + this._entriesByDBusName[entry.dbusName()] = entry; + this.emit('progress-entry-added', entry); + } + }, + + removeEntry: function(entry) { + delete this._entriesByDBusName[entry.dbusName()] + this.emit('progress-entry-removed', entry); + }, + + _acquireUnityDBus: function() { + if (!this._unity_bus_id) { + Gio.DBus.session.own_name('com.canonical.Unity', + Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null); + } + }, + + _releaseUnityDBus: function() { + if (this._unity_bus_id) { + Gio.DBus.session.unown_name(this._unity_bus_id); + this._unity_bus_id = 0; + } + }, + + _onEntrySignalReceived: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !signal_name) + return; + + if (signal_name == 'Update') { + if (!sender_name) { + return; + } + + this._handleUpdateRequest(sender_name, parameters); + } + }, + + _onDBusNameOwnerChanged: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !this.size()) + return; + + let [name, before, after] = parameters.deep_unpack(); + + if (!after) { + if (this._entriesByDBusName.hasOwnProperty(before)) { + this.removeEntry(this._entriesByDBusName[before]); + } + } + }, + + _handleUpdateRequest: function(senderName, parameters) { + if (!senderName || !parameters) { + return; + } + + let [appUri, properties] = parameters.deep_unpack(); + let appId = appUri.replace(/(^\w+:|^)\/\//, ''); + let entry = this.lookupByDBusName(senderName); + + if (entry) { + entry.setDBusName(senderName); + entry.update(properties); + } else { + let entry = new AppProgress(senderName, appId, properties); + this.addEntry(entry); + } + } +}); +Signals.addSignalMethods(ProgressManager.prototype); + +var AppProgress = Utils.defineClass({ + Name: 'DashToPanel.AppProgress', + + _init: function(dbusName, appId, properties) { + this._dbusName = dbusName; + this._appId = appId; + this._count = 0; + this._countVisible = false; + this._progress = 0.0; + this._progressVisible = false; + this._urgent = false; + this.update(properties); + }, + + appId: function() { + return this._appId; + }, + + dbusName: function() { + return this._dbusName; + }, + + count: function() { + return this._count; + }, + + setCount: function(count) { + if (this._count != count) { + this._count = count; + this.emit('count-changed', this._count); + } + }, + + countVisible: function() { + return this._countVisible; + }, + + setCountVisible: function(countVisible) { + if (this._countVisible != countVisible) { + this._countVisible = countVisible; + this.emit('count-visible-changed', this._countVisible); + } + }, + + progress: function() { + return this._progress; + }, + + setProgress: function(progress) { + if (this._progress != progress) { + this._progress = progress; + this.emit('progress-changed', this._progress); + } + }, + + progressVisible: function() { + return this._progressVisible; + }, + + setProgressVisible: function(progressVisible) { + if (this._progressVisible != progressVisible) { + this._progressVisible = progressVisible; + this.emit('progress-visible-changed', this._progressVisible); + } + }, + + urgent: function() { + return this._urgent; + }, + + setUrgent: function(urgent) { + if (this._urgent != urgent) { + this._urgent = urgent; + this.emit('urgent-changed', this._urgent); + } + }, + + setDBusName: function(dbusName) { + if (this._dbusName != dbusName) { + let oldName = this._dbusName; + this._dbusName = dbusName; + this.emit('dbus-name-changed', oldName); + } + }, + + update: function(other) { + if (other instanceof AppProgress) { + this.setDBusName(other.dbusName()) + this.setCount(other.count()); + this.setCountVisible(other.countVisible()); + this.setProgress(other.progress()); + this.setProgressVisible(other.progressVisible()) + this.setUrgent(other.urgent()); + } else { + for (let property in other) { + if (other.hasOwnProperty(property)) { + if (property == 'count') { + this.setCount(other[property].get_int64()); + } else if (property == 'count-visible') { + this.setCountVisible(Me.settings.get_boolean('progress-show-count') && other[property].get_boolean()); + } else if (property == 'progress') { + this.setProgress(other[property].get_double()); + } else if (property == 'progress-visible') { + this.setProgressVisible(Me.settings.get_boolean('progress-show-bar') && other[property].get_boolean()); + } else if (property == 'urgent') { + this.setUrgent(other[property].get_boolean()); + } else { + // Not implemented yet + } + } + } + } + } +}); +Signals.addSignalMethods(AppProgress.prototype); + + +var ProgressIndicator = Utils.defineClass({ + Name: 'DashToPanel.ProgressIndicator', + + _init: function(source, progressManager) { + this._source = source; + this._progressManager = progressManager; + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._sourceDestroyId = this._source.actor.connect('destroy', () => { + this._signalsHandler.destroy(); + }); + + this._notificationBadgeLabel = new St.Label({ style_class: 'badge' }); + this._notificationBadgeBin = new St.Bin({ + child: this._notificationBadgeLabel, y: 2, x: 2 + }); + this._notificationBadgeLabel.add_style_class_name('notification-badge'); + this._notificationBadgeCount = 0; + this._notificationBadgeBin.hide(); + + this._source._dtpIconContainer.add_child(this._notificationBadgeBin); + this._source._dtpIconContainer.connect('notify::allocation', this.updateNotificationBadge.bind(this)); + + this._progressManagerEntries = []; + this._progressManager.lookupById(this._source.app.id).forEach( + (entry) => { + this.insertEntry(entry); + } + ); + + this._signalsHandler.add([ + this._progressManager, + 'progress-entry-added', + this._onEntryAdded.bind(this) + ], [ + this._progressManager, + 'progress-entry-removed', + this._onEntryRemoved.bind(this) + ]); + }, + + destroy: function() { + this._source.actor.disconnect(this._sourceDestroyId); + this._signalsHandler.destroy(); + }, + + _onEntryAdded: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.insertEntry(entry); + } + }, + + _onEntryRemoved: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.removeEntry(entry); + } + }, + + updateNotificationBadge: function() { + this._source.updateNumberOverlay(this._notificationBadgeBin); + this._notificationBadgeLabel.clutter_text.ellipsize = Pango.EllipsizeMode.MIDDLE; + }, + + _notificationBadgeCountToText: function(count) { + if (count <= 9999) { + return count.toString(); + } else if (count < 1e5) { + let thousands = count / 1e3; + return thousands.toFixed(1).toString() + "k"; + } else if (count < 1e6) { + let thousands = count / 1e3; + return thousands.toFixed(0).toString() + "k"; + } else if (count < 1e8) { + let millions = count / 1e6; + return millions.toFixed(1).toString() + "M"; + } else if (count < 1e9) { + let millions = count / 1e6; + return millions.toFixed(0).toString() + "M"; + } else { + let billions = count / 1e9; + return billions.toFixed(1).toString() + "B"; + } + }, + + setNotificationBadge: function(count) { + this._notificationBadgeCount = count; + let text = this._notificationBadgeCountToText(count); + this._notificationBadgeLabel.set_text(text); + }, + + toggleNotificationBadge: function(activate) { + if (activate && this._notificationBadgeCount > 0) { + this.updateNotificationBadge(); + this._notificationBadgeBin.show(); + } + else + this._notificationBadgeBin.hide(); + }, + + _showProgressOverlay: function() { + if (this._progressOverlayArea) { + this._updateProgressOverlay(); + return; + } + + this._progressOverlayArea = new St.DrawingArea({x_expand: true, y_expand: true}); + this._progressOverlayArea.add_style_class_name('progress-bar'); + this._progressOverlayArea.connect('repaint', () => { + this._drawProgressOverlay(this._progressOverlayArea); + }); + + this._source._iconContainer.add_child(this._progressOverlayArea); + let node = this._progressOverlayArea.get_theme_node(); + + let [hasColor, color] = node.lookup_color('-progress-bar-background', false); + if (hasColor) + this._progressbar_background = color + else + this._progressbar_background = new Clutter.Color({red: 204, green: 204, blue: 204, alpha: 255}); + + [hasColor, color] = node.lookup_color('-progress-bar-border', false); + if (hasColor) + this._progressbar_border = color; + else + this._progressbar_border = new Clutter.Color({red: 230, green: 230, blue: 230, alpha: 255}); + + this._updateProgressOverlay(); + }, + + _hideProgressOverlay: function() { + if (this._progressOverlayArea) + this._progressOverlayArea.destroy(); + + this._progressOverlayArea = null; + this._progressbar_background = null; + this._progressbar_border = null; + }, + + _updateProgressOverlay: function() { + + if (this._progressOverlayArea) { + this._progressOverlayArea.queue_repaint(); + } + }, + + _drawProgressOverlay: function(area) { + let scaleFactor = Utils.getScaleFactor(); + let [surfaceWidth, surfaceHeight] = area.get_surface_size(); + let cr = area.get_context(); + + let iconSize = this._source.icon.iconSize * scaleFactor; + + let x = Math.floor((surfaceWidth - iconSize) / 2); + let y = Math.floor((surfaceHeight - iconSize) / 2); + + let lineWidth = Math.floor(1.0 * scaleFactor); + let padding = Math.floor(iconSize * 0.05); + let width = iconSize - 2.0*padding; + let height = Math.floor(Math.min(18.0*scaleFactor, 0.20*iconSize)); + x += padding; + y += iconSize - height - padding; + + cr.setLineWidth(lineWidth); + + // Draw the outer stroke + let stroke = new Cairo.LinearGradient(0, y, 0, y + height); + let fill = null; + stroke.addColorStopRGBA(0.5, 0.5, 0.5, 0.5, 0.1); + stroke.addColorStopRGBA(0.9, 0.8, 0.8, 0.8, 0.4); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the background + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + stroke = Cairo.SolidPattern.createRGBA(0.20, 0.20, 0.20, 0.9); + fill = new Cairo.LinearGradient(0, y, 0, y + height); + fill.addColorStopRGBA(0.4, 0.25, 0.25, 0.25, 1.0); + fill.addColorStopRGBA(0.9, 0.35, 0.35, 0.35, 1.0); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the finished bar + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + let finishedWidth = Math.ceil(this._progress * width); + + let bg = this._progressbar_background; + let bd = this._progressbar_border; + + stroke = Cairo.SolidPattern.createRGBA(bd.red/255, bd.green/255, bd.blue/255, bd.alpha/255); + fill = Cairo.SolidPattern.createRGBA(bg.red/255, bg.green/255, bg.blue/255, bg.alpha/255); + + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + Utils.drawRoundedLine(cr, x + lineWidth/2.0 + width - finishedWidth, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + else + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + + cr.$dispose(); + }, + + setProgress: function(progress) { + this._progress = Math.min(Math.max(progress, 0.0), 1.0); + this._updateProgressOverlay(); + }, + + toggleProgressOverlay: function(activate) { + if (activate) { + this._showProgressOverlay(); + } + else { + this._hideProgressOverlay(); + } + }, + + insertEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) !== -1) + return; + + this._progressManagerEntries.push(appProgress); + this._selectEntry(appProgress); + }, + + removeEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) == -1) + return; + + this._progressManagerEntries.splice(this._progressManagerEntries.indexOf(appProgress), 1); + + if (this._progressManagerEntries.length > 0) { + this._selectEntry(this._progressManagerEntries[this._progressManagerEntries.length-1]); + } else { + this.setNotificationBadge(0); + this.toggleNotificationBadge(false); + this.setProgress(0); + this.toggleProgressOverlay(false); + this.setUrgent(false); + } + }, + + _selectEntry: function(appProgress) { + if (!appProgress) + return; + + this._signalsHandler.removeWithLabel('progress-entry'); + + this._signalsHandler.addWithLabel('progress-entry', + [ + appProgress, + 'count-changed', + (appProgress, value) => { + this.setNotificationBadge(value); + } + ], [ + appProgress, + 'count-visible-changed', + (appProgress, value) => { + this.toggleNotificationBadge(value); + } + ], [ + appProgress, + 'progress-changed', + (appProgress, value) => { + this.setProgress(value); + } + ], [ + appProgress, + 'progress-visible-changed', + (appProgress, value) => { + this.toggleProgressOverlay(value); + } + ], [ + appProgress, + 'urgent-changed', + (appProgress, value) => { + this.setUrgent(value) + } + ]); + + this.setNotificationBadge(appProgress.count()); + this.toggleNotificationBadge(appProgress.countVisible()); + this.setProgress(appProgress.progress()); + this.toggleProgressOverlay(appProgress.progressVisible()); + + this._isUrgent = false; + }, + + setUrgent: function(urgent) { + const icon = this._source.icon._iconBin; + if (urgent) { + if (!this._isUrgent) { + icon.set_pivot_point(0.5, 0.5); + this._source.iconAnimator.addAnimation(icon, 'dance'); + this._isUrgent = true; + } + } else { + if (this._isUrgent) { + this._source.iconAnimator.removeAnimation(icon, 'dance'); + this._isUrgent = false; + } + icon.rotation_angle_z = 0; + } + } +}); diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js new file mode 100644 index 0000000..c298f84 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js @@ -0,0 +1,262 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Lang = imports.lang; +const Meta = imports.gi.Meta; + +const Layout = imports.ui.layout; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; + +//timeout intervals +const MIN_UPDATE_MS = 200; + +//timeout names +const T1 = 'limitUpdateTimeout'; + +var Mode = { + ALL_WINDOWS: 0, + FOCUSED_WINDOWS: 1, + MAXIMIZED_WINDOWS: 2 +}; + +var ProximityWatch = Utils.defineClass({ + Name: 'DashToPanel.ProximityWatch', + + _init: function(actor, mode, xThreshold, yThreshold, handler) { + this.actor = actor; + this.overlap = 0; + this.mode = mode; + this.threshold = [xThreshold, yThreshold]; + this.handler = handler; + + this._allocationChangedId = actor.connect('notify::allocation', () => this._update()); + + this._update(); + }, + + destroy: function() { + this.actor.disconnect(this._allocationChangedId); + }, + + _update: function() { + this.monitorIndex = Main.layoutManager.findIndexForActor(this.actor); + + this._updateWatchRect(); + }, + + _updateWatchRect: function() { + let [actorX, actorY] = this.actor.get_position(); + + this.rect = new Meta.Rectangle({ + x: actorX - this.threshold[0], + y: actorY - this.threshold[1], + width: this.actor.width + this.threshold[0] * 2, + height: this.actor.height + this.threshold[1] * 2 + }); + }, +}); + +var ProximityManager = Utils.defineClass({ + Name: 'DashToPanel.ProximityManager', + + _init: function() { + this._counter = 1; + this._watches = {}; + this._focusedWindowInfo = null; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._bindSignals(); + this._setFocusedWindow(); + }, + + createWatch: function(actor, mode, xThreshold, yThreshold, handler) { + let watch = new ProximityWatch(actor, mode, xThreshold, yThreshold, handler); + + this._watches[this._counter] = watch; + this.update(); + + return this._counter++; + }, + + removeWatch: function(id) { + if (this._watches[id]) { + this._watches[id].destroy(); + delete this._watches[id]; + } + }, + + update: function() { + this._queueUpdate(true); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + this._disconnectFocusedWindow(); + Object.keys(this._watches).forEach(id => this.removeWatch(id)); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + global.window_manager, + 'switch-workspace', + () => Object.keys(this._watches).forEach(id => this._watches[id].overlap = 0) + ], + [ + Main.overview, + 'hidden', + () => this._queueUpdate() + ], + [ + global.display, + 'notify::focus-window', + () => { + this._setFocusedWindow(); + this._queueUpdate(); + } + ], + [ + global.window_group, + [ + 'actor-added', + 'actor-removed' + ], + () => this._queueUpdate() + ] + ); + }, + + _setFocusedWindow: function() { + this._disconnectFocusedWindow(); + + let focusedWindow = global.display.focus_window; + + if (focusedWindow) { + let focusedWindowInfo = this._getFocusedWindowInfo(focusedWindow); + + if (focusedWindowInfo && this._checkIfHandledWindowType(focusedWindowInfo.metaWindow)) { + focusedWindowInfo.allocationId = focusedWindowInfo.window.connect('notify::allocation', () => this._queueUpdate()); + focusedWindowInfo.destroyId = focusedWindowInfo.window.connect('destroy', () => this._disconnectFocusedWindow(true)); + + this._focusedWindowInfo = focusedWindowInfo; + } + } + }, + + _getFocusedWindowInfo: function(focusedWindow) { + let window = focusedWindow.get_compositor_private(); + let focusedWindowInfo; + + if (window) { + focusedWindowInfo = { window: window }; + focusedWindowInfo.metaWindow = focusedWindowInfo.window.get_meta_window(); + + if (focusedWindow.is_attached_dialog()) { + let mainMetaWindow = focusedWindow.get_transient_for(); + + if (focusedWindowInfo.metaWindow.get_frame_rect().height < mainMetaWindow.get_frame_rect().height) { + focusedWindowInfo.window = mainMetaWindow.get_compositor_private(); + focusedWindowInfo.metaWindow = mainMetaWindow; + } + } + } + + return focusedWindowInfo; + }, + + _disconnectFocusedWindow: function(destroy) { + if (this._focusedWindowInfo && !destroy) { + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.allocationId); + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.destroyId); + } + + this._focusedWindowInfo = null; + }, + + _getHandledWindows: function() { + return global.get_window_actors() + .filter(w => w.visible) + .map(w => w.get_meta_window()) + .filter(mw => this._checkIfHandledWindow(mw)); + }, + + _checkIfHandledWindow: function(metaWindow) { + return metaWindow && !metaWindow.minimized && + this._checkIfHandledWindowType(metaWindow); + }, + + _checkIfHandledWindowType: function(metaWindow) { + let metaWindowType = metaWindow.get_window_type(); + + //https://www.roojs.org/seed/gir-1.2-gtk-3.0/seed/Meta.WindowType.html + return metaWindowType <= Meta.WindowType.SPLASHSCREEN && + metaWindowType != Meta.WindowType.DESKTOP; + }, + + _queueUpdate: function(noDelay) { + if (!noDelay && this._timeoutsHandler.getId(T1)) { + //limit the number of updates + this._pendingUpdate = true; + return; + } + + this._timeoutsHandler.add([T1, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + + let metaWindows = this._getHandledWindows(); + + Object.keys(this._watches).forEach(id => { + let watch = this._watches[id]; + let overlap = this._update(watch, metaWindows); + + if (overlap !== watch.overlap) { + watch.handler(overlap); + watch.overlap = overlap; + } + }); + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdate(); + } + }, + + _update: function(watch, metaWindows) { + if (watch.mode === Mode.FOCUSED_WINDOWS) { + return (this._focusedWindowInfo && + this._checkIfHandledWindow(this._focusedWindowInfo.metaWindow) && + this._checkProximity(this._focusedWindowInfo.metaWindow, watch)); + } else if (watch.mode === Mode.MAXIMIZED_WINDOWS) { + return metaWindows.some(mw => mw.maximized_vertically && mw.maximized_horizontally && + mw.get_monitor() == watch.monitorIndex); + } + + //Mode.ALL_WINDOWS + return metaWindows.some(mw => this._checkProximity(mw, watch)); + }, + + _checkProximity: function(metaWindow, watch) { + return metaWindow.get_frame_rect().overlap(watch.rect); + }, +}); \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..ef5dc7d725cc6ada68fe998189bc3350e0edcf9b GIT binary patch literal 17276 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 U$w{AwIrcfSca2Za-&NTE0-?-ey8r+H literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml new file mode 100644 index 0000000..7e8ea3a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -0,0 +1,1278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'BOTTOM' + Panel position (Deprecated) + Panel is shown on the Bottom or Top of the screen. + + + true + Sync element positions + Sync panel element positions on all monitors. + + + '{}' + Panel positions + Panel positions (JSON). + + + '{}' + Panel element positions + Panel element positions (JSON). + + + '{}' + Percentages of screen edge for panel to span + Length of the panels, in percent (JSON). + + + '{}' + Positions along screen edge + Where to show the panels if it is not the full length of the screen edge (JSON). + + + '{}' + Panel sizes + Sizes of panels, in pixels. + + + 48 + Panel size (Deprecated) + Set the size of the panel. + + + false + Override Show Desktop line color + Replace current Show Desktop button line color + + + "rgba(200,200,200,0.2)" + Custom Show Desktop line color + Custom Show Desktop button line color + + + 'BOTTOM' + Dot position + Running indicators are shown on the Bottom or Top of the screen. + + + 'METRO' + Style of the running indicator (focused) + Style of the running indicator for the icon for the currently focused application + + + 'METRO' + Style of the running indicator (unfocused) + Style of the running indicator for the icon for applications which are not currently focused + + + false + Running indicator dominant color + Whether to use the app icon's dominant color for .app-well-running-dot + + + false + Running indicator color override + Whether to override the theme background color for .app-well-running-dot + + + "#5294e2" + Color of running indicator (1 window) + Customize the color of the running indicator when one window is running for that application + + + "#5294e2" + Color of running indicator (2 windows) + Customize the color of the running indicator when two windows are running for that application + + + "#5294e2" + Color of running indicator (3 windows) + Customize the color of the running indicator when three windows are running for that application + + + "#5294e2" + Color of running indicator (4+ windows) + Customize the color of the running indicator when four or more windows are running for that application + + + false + Unfocused color is different than focused + Whether to apply a 2nd color scheme to the indicator when the app is not focused + + + "#5294e2" + Color of unfocused running indicator (1 window) + Customize the color of the unfocused running indicator when one window is running for that application + + + "#5294e2" + Color of unfocused running indicator (2 windows) + Customize the color of the unfocused running indicator when two windows are running for that application + + + "#5294e2" + Color of unfocused running indicator (3 windows) + Customize the color of the unfocused running indicator when three windows are running for that application + + + "#5294e2" + Color of unfocused running indicator (4+ windows) + Customize the color of the unfocused running indicator when four or more windows are running for that application + + + 3 + Running indicator height + Height of the running indicator line/diameter of window indicator dots + + + true + Highlight icon of focused application + Whether to highlight the background of the currently focused application's icon + + + false + Highlight icon dominant color + Base the active window highlight color on that application's icon + + + "#EEEEEE" + Color of highlight of focused application + Customize the color of the highlight of the focused application + + + 25 + Opacity of highlight of focused application + Customize the opacity of the highlight of the focused application + + + false + Keep dash + Whether to keep the stock gnome-shell dash while in overview + + + false + Keep top panel + Whether to keep the stock gnome-shell top panel + + + false + Panel menu buttons require click + Whether to activate the panel menu buttons on hover or on click + + + false + Force hot corner + Wheter to force having an Activities hot corner on the primary monitor + + + false + Lock the taskbar + Specifies if the user can modify the taskbar + + + false + Override theme background color + Replace current theme background color for the panel + + + "#000" + Custom background color + Custom background color for the panel + + + false + Custom background color + Replace current theme background color for the panel + + + false + Dynamic opacity + Enable dynamic opacity + + + 0.4 + Panel opacity + Custom opacity for the panel + + + 'ALL_WINDOWS' + Dynamic opacity behavior + Dictates which window type affects the panel opacity + + + 20 + Distance to change opacity + The distance a window needs to be from the panel to change opacity + + + 0.8 + Modified panel opacity + Modified opacity for the panel when a window is near + + + 300 + Opacity change duration + The duration of the animation when the opacity changes + + + false + Custom gradient + Replace current theme gradient for the panel + + + "#000" + Custom gradient top color + Custom gradient top color for the panel + + + 0 + Custom gradient top opacity + Custom gradient top opacity for the panel + + + "#000" + Custom gradient bottom color + Custom gradient bottom color for the panel + + + 0.2 + Custom gradient bottom opacity + Custom gradient bottom opacity for the panel + + + false + Intellihide + Whether to intelligently hide the panel + + + false + Only hide from windows + Dictates if the dash should only hide when in conflict with windows + + + 'FOCUSED_WINDOWS' + Intellihide behaviour + Dictates how to intelligently hide the panel + + + false + Intellihide pressure + To reveal the panel, pressure needs to be applied to the edege of the screen + + + 100 + Intellihide pressure threshold + The pressure needed to reveal the panel + + + 1000 + Intellihide pressure time + The numer of milliseconds that the pressure needs to be applied to reveal the panel + + + false + Intellihide pressure + Allow the panel to be revealed while an application is in fullscreen mode + + + false + Intellihide only secondary + Whether to only hide secondary panels + + + 200 + Intellihide animation time + The animation time (ms) to hide and reveal the panel + + + 400 + Intellihide close delay + The delay (ms) before hiding the panel + + + "<Super>i" + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + i']]]> + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + 2000 + Intellihide enable start delay + The delay before enabling intellihide on start + + + "" + Custom Show Applications icon + Customize the Show Applications icon + + + 8 + Show Applications icon side padding + Customize the Show Applications icon side padding + + + true + Override escape key + Override the escape key to return to the desktop when entering the overview using the Show Applications button + + + [] + Show Apps button context menu commands + Commands to add to the Show Apps button right click menu + + + [] + Show Apps button context menu titles + Titles for commands added to Show Apps button right click menu + + + [] + Panel context menu commands + Commands to add to the panel right click menu + + + [] + Panel context menu titles + Titles for commands added to panel right click menu + + + false + Show activities button + Show activities button on the left hand side of the taskbar + + + 8 + Width of show Desktop button + Customize the width of the show Desktop button + + + false + Show desktop on hover + Show the desktop on mouse hover + + + 1000 + Delay show desktop + Delay before showing the desktop + + + 300 + Show desktop animation time + Window fade animation time when showing the destop + + + false + Show appMenu button + Show appMenu on the right hand side of the panel + + + true + Show window preview + Show preview of running window on hover of app icon + + + true + Show tooltip + Show tooltip on hover of app icon + + + true + Show running apps + Show or hide running application icons in the dash + + + true + Show favorites apps + Show or hide favorite application icons in the dash + + + 400 + Icon enter display time + Amount of time after entering icon to wait before displaying window preview if icon is not clicked or mouse has not left. + + + true + Enable peek mode + Peek a window upon hover for some time + + + true + Display title in preview + Display window title in preview + + + false + Window previews manual styling + This defines if the default window previews styling should be applied + + + 'TOP' + Title position + Position of the window title, close button and icon in preview. + + + "#dddddd" + Window previews title font color + This defines the window preview titles font color. + + + 14 + Window previews title font size + This defines the window preview titles font size. + + + false + Window previews use custom icon size + Window previews use custom application icon size. + + + 16 + Window previews custom icon size + Window previews custom application icon size. + + + 260 + Window previews animation time + This defines the window previews animation time. + + + 'inherit' + Font weight of window preview titles + This defines the font weight of window preview titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. + + + 240 + Window previews size + Preferred window previews size + + + false + Fixed aspect ratio X + This defines if the window previews use a fixed aspect ratio X. + + + true + Fixed aspect ratio Y + This defines if the window previews use a fixed aspect ratio Y. + + + 8 + Window previews padding + The padding of the window previews + + + 16 + Aspect ratio X + The window previews respected aspect ratio X. + + + 9 + Aspect ratio Y + The window previews respected aspect ratio Y. + + + false + Immediate hide on icon click + The window previews immediately hide when an application icon is clicked. + + + false + Provide workspace isolation + Dash shows only windows from the current workspace + + + false + Close overview by clicking in empty space + Close overview or app grid by clicking in empty space + + + false + Hide overview on startup + Hide overview on startup, which would be shown by default at gnome startup. + + + true + Group applications + Dash groups the application instances under the same icon + + + 14 + Application title font size + When the applications are ungrouped, this defines the application titles font size. + + + 'inherit' + Font weight of application titles + When the applications are ungrouped, this defines font weight of application titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. + + + "#dddddd" + Application title font color + When the applications are ungrouped, this defines the application titles font color. + + + "#dddddd" + Minimized application title font color + When the applications are ungrouped, this defines the titles font color for minimized applications. + + + 160 + Application title max width + When the applications are ungrouped, this defines the application titles maximum width. + + + true + Use a fixed width for the application titles + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + + + true + Display running indicators on unfocused applications + When the applications are ungrouped, this defines if running applications should display an indicator. + + + false + Use favorite icons as application launchers + When the applications are ungrouped, this defines if running applications stay separate from the favorite icons. + + + 0 + Primary monitor index + Specifies the index of the primary monitor. + + + true + Display panels on all monitors + Specifies if a panel is shown on every monitors + + + [] + Available monitors + Available gnome-shell (Mutter) monitors, internal use + + + false + Provide monitor isolation + Dash shows only windows from the current monitor + + + true + Display the favorites on all monitors + Specifies if every panel should display the favorite applications. If false, the favorite appplications are only displayed on the primary monitor. + + + true + Customize click behaviour + Customize action on various mouse events + + + true + Minimize on shift+click + + + true + Activate only one window + + + 'CYCLE-MIN' + Action when clicking on a running app + Set the action that is executed when clicking on the icon of a running application + + + 'MINIMIZE' + Action when shift+clicking on a running app + Set the action that is executed when shift+clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when middle-clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when shift+middle-clicking on the icon of a running application + + + 'SWITCH_WORKSPACE' + Action when scrolling over the panel + Set the action that is executed when scrolling over the panel + + + 0 + Delay between panel mouse scroll events + Set the minimum delay between panel mouse scroll events + + + true + Show the workspace switch head-up when workspace is changed by scrolling on the panel + + + 'CYCLE_WINDOWS' + Action when scrolling over a running app + Set the action that is executed when scrolling over a running application + + + 0 + Delay between icon mouse scroll events + Set the minimum delay between icon mouse scroll events + + + 100 + Icon leave preview timeout + Amount of time to leave preview windows open when the mouse has left the application's icon. + + + 500 + Enter window peeking mode timeout + Amount of time of inactivity to enter the window peeking mode when the mouse has entered a window preview. + + + 40 + Window peeking mode opacity + All windows except for the peeked one have their opacity set to the same value. + + + true + Middle click preview to close window + Middle click on the window preview to close that window + + + true + Window previews use custom opacity + Window previews background use a different opacity from the panel + + + 80 + Window previews background opacity + Window previews use this custom background opacity. + + + 0 + Tray font size + Set the size of the tray font. (0 for default) + + + 0 + Leftbox font size + Set the size of the leftBox font. (0 for default) + + + 8 + App icon margin + Set the margin for application icons in the embedded dash. + + + 4 + App icon padding + Set the padding for application icons in the embedded dash. + + + -1 + Tray item padding + Set the size of the tray padding. (-1 for default) + + + -1 + Leftbox item padding + Set the size of the leftBox padding. (-1 for default) + + + -1 + Status icon padding + Set the size of the aggregate (status) menu icon padding. (-1 for default) + + + true + Animate running indicator when open/closing/switching applications + + + true + Animate when new window launched + + + false + Animate app icon on hover + + + 'SIMPLE' + App icon hover animation type + + + {'RIPPLE':2,'PLANK':1} + App icon hover animation curve convexity (1 is linear, more is convex, less is concave) + + + {'SIMPLE':160,'RIPPLE':130,'PLANK':100} + App icon hover animation duration in milliseconds + + + {'RIPPLE':4,'PLANK':4} + App icon hover animation extent (maximum number of animated icons) + + + {'SIMPLE':0,'RIPPLE':10,'PLANK':0} + App icon hover animation rotation in degrees + + + {'SIMPLE':0.30,'RIPPLE':0.40,'PLANK':0} + App icon hover animation travel translation in relation to the app icon size + + + {'SIMPLE':1,'RIPPLE':1.25,'PLANK':2} + App icon hover animation zoom scale in relation to the app icon size + + + true + Integrate items from the gnome appmenu into the right click menu + + + false + Display Show Details to open Gnome Software from right click menu + + + "<Super>q" + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + q']]]> + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + 2000 + Timeout to hide the dock, in seconds + Sets the time duration before the dock is hidden again. + + + 750 + Timeout to hide the dock, in seconds + Sets the time duration before the dock is hidden again. + + + 'TEMPORARILY' + Transitivity of the number overlay + You can choose between NEVER, TEMPORARILY and ALWAYS. + + + false + Super Hot-Keys + Launch and switch between dash items using Super+(0-9) + + + 'Super' + Prefix to use for hotkeys + You can choose between Super or SuperAlt as the prefix for hotkeys. + + + false + Show window previews + When multiple instances of the application are available, show their window previews + + + 'BOTH' + Hotkeys number keys + Which number keys are used for the hotkeys + + + 1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + 2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + 3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + 4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + 5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + 6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + 7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + 8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + 9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + 0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + 1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + 2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + 3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + 4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + 5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + 6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + 7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + 8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + 9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + 0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + 1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + 2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + 3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + 4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + 5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + 6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + 7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + 8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + 9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + 0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + KP_1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + KP_2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + KP_3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + KP_4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + KP_5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + KP_6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + KP_7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + KP_8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + KP_9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + KP_0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + KP_1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + KP_4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + KP_5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + KP_6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + KP_7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + KP_8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + KP_9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + KP_0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + KP_1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + KP_4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + KP_5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + KP_6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + KP_7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + KP_8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + KP_9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + KP_0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + true + Show progress bar on app icon + Whether to show progress bar overlay on app icon, for supported applications. + + + true + Show badge count on app icon + Whether to show badge count overlay on app icon, for supported applications. + + + diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css new file mode 100644 index 0000000..6917e24 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css @@ -0,0 +1,151 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +#dashtopanelTaskbar .dash-item-container > StWidget { + margin: 0; + padding: 0; +} + +#dashtopanelScrollview .app-well-app .overview-icon, +.dashtopanelMainPanel .show-apps .overview-icon { + background: none; + border: none; + margin: 0; + padding: 0; +} + +#dashtopanelScrollview .app-well-app .overview-label { + /* must match TITLE_RIGHT_PADDING in apppicons.js */ + padding-right: 8px; +} + +#dashtopanelScrollview .app-well-app:hover .overview-icon, +#dashtopanelScrollview .app-well-app:focus .overview-icon { + background: none; +} + +.dashtopanelMainPanel .show-apps:hover .overview-icon, +#dashtopanelScrollview .app-well-app:hover .dtp-container, +#dashtopanelScrollview .app-well-app:focus .dtp-container { + background-color: rgba(238, 238, 236, 0.1); +} + +#dashtopanelScrollview .app-well-app:hover .dtp-container.animate-appicon-hover { + background: none; +} + +#dashtopanelScrollview .app-well-app:active .dtp-container { + background-color: rgba(238, 238, 236, 0.18); +} + +#dashtopanelScrollview .app-well-app .favorite { + background-color: rgba(80, 150, 255, 0.4); +} + +#dashtopanelScrollview .app-well-app-running-dot { + margin-bottom: 0; +} + +#dashtopanelTaskbar .scrollview-fade { + background-gradient-end: rgba(0, 0, 0, 0); +} + +.dashtopanelSecondaryMenu { + max-width: 400px; +} + +.dashtopanelMainPanel.vertical .panel-button { + text-align: center; +} + +.dashtopanelMainPanel.vertical .panel-button.vertical *, +.dashtopanelMainPanel.vertical .panel-button.clock-display * { + padding: 0; + margin: 0; +} + +.dashtopanelMainPanel.vertical .panel-button > *, +.dashtopanelMainPanel.vertical .panel-button.vertical > *, +.dashtopanelMainPanel.vertical .panel-button.clock-display > * { + padding: 8px 0; +} + +#dashtopanelThumbnailList { + spacing: 0em; + padding: 0 1em; +} + +#dashtopanelThumbnailList .popup-menu-item { + padding: 0; + border-radius: 5px; + spacing: 0; +} + +#dashtopanelThumbnailList .window-box { + padding: 0; + spacing: 0; +} + +#dashtopanelThumbnailList .preview-window-title { + padding-top: 1em; +} + +.popup-menu.panel-menu { + margin-bottom: 0; +} + +#panel #panelLeft, #panel #panelCenter { + spacing: 0px; +} + +.showdesktop-button-dark-hovered { + background-color: rgba(200, 200, 200, .4); +} + +.showdesktop-button-light-hovered { + background-color: rgba(55, 55, 55, .4); +} + +.panel-corner.hidden:active, .panel-corner.hidden:overview, .panel-corner.hidden:focus { + -panel-corner-border-color: rgba(0, 0, 0, .001); +} +#dashtopanelScrollview .badge { + color: rgba(255, 255, 255, 1); + font-weight: bold; + text-align: center; +} + +#dashtopanelScrollview .number-overlay { + background-color: rgba(0,0,0,0.8); +} + +#dashtopanelScrollview .notification-badge { + background-color: rgba(255,0,0,0.8); +} + +#dashtopanelScrollview .progress-bar { + /* Customization of the progress bar style, e.g.: + -progress-bar-background: rgba(0.8, 0.8, 0.8, 1); + -progress-bar-border: rgba(0.9, 0.9, 0.9, 1); + */ +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js new file mode 100644 index 0000000..4f74d1e --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js @@ -0,0 +1,1557 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Signals = imports.signals; +const Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; + +const SearchController = imports.ui.main.overview._overview._controls._searchController; +const AppDisplay = imports.ui.main.overview._overview._controls.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const AppIcons = Me.imports.appIcons; +const Panel = Me.imports.panel; +const PanelManager = Me.imports.panelManager; +const PanelSettings = Me.imports.panelSettings; +const Pos = Me.imports.panelPositions; +const Utils = Me.imports.utils; +const WindowPreview = Me.imports.windowPreview; + +var DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME / (Dash.DASH_ANIMATION_TIME > 1 ? 1000 : 1); +var DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; +var MIN_ICON_SIZE = 4; + +/** + * Extend DashItemContainer + * + * - set label position based on taskbar orientation + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this ugly pattern. + */ + +function extendDashItemContainer(dashItemContainer) { + dashItemContainer.showLabel = AppIcons.ItemShowLabel; +}; + +const iconAnimationSettings = { + _getDictValue: function(key) { + let type = Me.settings.get_string('animate-appicon-hover-animation-type'); + return Me.settings.get_value(key).deep_unpack()[type] || 0; + }, + + get type() { + if (!Me.settings.get_boolean('animate-appicon-hover')) + return ""; + + return Me.settings.get_string('animate-appicon-hover-animation-type'); + }, + + get convexity() { + return Math.max(0, this._getDictValue('animate-appicon-hover-animation-convexity')); + }, + + get duration() { + return this._getDictValue('animate-appicon-hover-animation-duration'); + }, + + get extent() { + return Math.max(1, this._getDictValue('animate-appicon-hover-animation-extent')); + }, + + get rotation() { + return this._getDictValue('animate-appicon-hover-animation-rotation'); + }, + + get travel() { + return Math.max(0, this._getDictValue('animate-appicon-hover-animation-travel')); + }, + + get zoom() { + return Math.max(1, this._getDictValue('animate-appicon-hover-animation-zoom')); + }, +}; + +/* This class is a fork of the upstream DashActor class (ui.dash.js) + * + * Summary of changes: + * - modified chldBox calculations for when 'show-apps-at-top' option is checked + * - handle horizontal dash + */ +var taskbarActor = Utils.defineClass({ + Name: 'DashToPanel-TaskbarActor', + Extends: St.Widget, + + _init: function(delegate) { + this._delegate = delegate; + this._currentBackgroundColor = 0; + this.callParent('_init', { name: 'dashtopanelTaskbar', + layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation[delegate.dtpPanel.getOrientation().toUpperCase()] }), + clip_to_allocation: true }); + }, + + vfunc_allocate: function(box, flags)  { + Utils.setAllocation(this, box, flags); + + let panel = this._delegate.dtpPanel; + let availFixedSize = box[panel.fixedCoord.c2] - box[panel.fixedCoord.c1]; + let availVarSize = box[panel.varCoord.c2] - box[panel.varCoord.c1]; + let [dummy, scrollview, leftFade, rightFade] = this.get_children(); + let [, natSize] = this[panel.sizeFunc](availFixedSize); + let childBox = new Clutter.ActorBox(); + let orientation = panel.getOrientation(); + + Utils.allocate(dummy, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c1]; + childBox[panel.varCoord.c2] = Math.min(availVarSize, natSize); + childBox[panel.fixedCoord.c1] = box[panel.fixedCoord.c1]; + childBox[panel.fixedCoord.c2] = box[panel.fixedCoord.c2]; + + Utils.allocate(scrollview, childBox, flags); + + let [value, , upper, , , pageSize] = scrollview[orientation[0] + 'scroll'].adjustment.get_values(); + upper = Math.floor(upper); + scrollview._dtpFadeSize = upper > pageSize ? this._delegate.iconSize : 0; + + if (this._currentBackgroundColor !== panel.dynamicTransparency.currentBackgroundColor) { + this._currentBackgroundColor = panel.dynamicTransparency.currentBackgroundColor; + let gradientStyle = 'background-gradient-start: ' + this._currentBackgroundColor + + 'background-gradient-direction: ' + orientation; + + leftFade.set_style(gradientStyle); + rightFade.set_style(gradientStyle); + } + + childBox[panel.varCoord.c2] = childBox[panel.varCoord.c1] + (value > 0 ? scrollview._dtpFadeSize : 0); + Utils.allocate(leftFade, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c2] - (value + pageSize < upper ? scrollview._dtpFadeSize : 0); + childBox[panel.varCoord.c2] = box[panel.varCoord.c2]; + Utils.allocate(rightFade, childBox, flags); + }, + + // We want to request the natural size of all our children + // as our natural width, so we chain up to StWidget (which + // then calls BoxLayout) + vfunc_get_preferred_width: function(forHeight) { + let [, natWidth] = St.Widget.prototype.vfunc_get_preferred_width.call(this, forHeight); + + return [0, natWidth]; + }, + + vfunc_get_preferred_height: function(forWidth) { + let [, natHeight] = St.Widget.prototype.vfunc_get_preferred_height.call(this, forWidth); + + return [0, natHeight]; + }, +}); + +/* This class is a fork of the upstream dash class (ui.dash.js) + * + * Summary of changes: + * - disconnect global signals adding a destroy method; + * - play animations even when not in overview mode + * - set a maximum icon size + * - show running and/or favorite applications + * - emit a custom signal when an app icon is added + * - Add scrollview + * Ensure actor is visible on keyfocus inside the scrollview + * - add 128px icon size, might be useful for hidpi display + * - Sync minimization application target position. + */ + +var taskbar = Utils.defineClass({ + Name: 'DashToPanel.Taskbar', + + _init : function(panel) { + this.dtpPanel = panel; + + // start at smallest size due to running indicator drawing area expanding but not shrinking + this.iconSize = 16; + + this._shownInitially = false; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._showLabelTimeoutId = 0; + this._resetHoverTimeoutId = 0; + this._ensureAppIconVisibilityTimeoutId = 0; + this._labelShowing = false; + this.fullScrollView = 0; + + let isVertical = panel.checkIfVertical(); + + this._box = new St.BoxLayout({ vertical: isVertical, + clip_to_allocation: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START }); + + this._container = new taskbarActor(this); + this._scrollView = new St.ScrollView({ name: 'dashtopanelScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: true }); + + this._scrollView.connect('leave-event', Lang.bind(this, this._onLeaveEvent)); + this._scrollView.connect('motion-event', Lang.bind(this, this._onMotionEvent)); + this._scrollView.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); + this._scrollView.add_actor(this._box); + + this._showAppsIconWrapper = panel.showAppsIconWrapper; + this._showAppsIconWrapper.connect('menu-state-changed', Lang.bind(this, function(showAppsIconWrapper, opened) { + this._itemMenuStateChanged(showAppsIconWrapper, opened); + })); + // an instance of the showAppsIcon class is encapsulated in the wrapper + this._showAppsIcon = this._showAppsIconWrapper.realShowAppsIcon; + this.showAppsButton = this._showAppsIcon.toggleButton; + + if (isVertical) { + this.showAppsButton.set_width(panel.geom.w); + } + + this.showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled)); + + this.showAppsButton.checked = (SearchController._showAppsButton) ? SearchController._showAppsButton.checked : false; + + this._showAppsIcon.childScale = 1; + this._showAppsIcon.childOpacity = 255; + this._showAppsIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(this._showAppsIcon, this._showAppsIconWrapper); + + this._container.add_child(new St.Widget({ width: 0, reactive: false })); + this._container.add_actor(this._scrollView); + + let orientation = panel.getOrientation(); + let fadeStyle = 'background-gradient-direction:' + orientation; + let fade1 = new St.Widget({ style_class: 'scrollview-fade', reactive: false }); + let fade2 = new St.Widget({ style_class: 'scrollview-fade', + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: 180 }); + + fade1.set_style(fadeStyle); + fade2.set_style(fadeStyle); + + this._container.add_actor(fade1); + this._container.add_actor(fade2); + + this.previewMenu = new WindowPreview.PreviewMenu(panel); + this.previewMenu.enable(); + + let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; + this.actor = new St.Bin({ child: this._container, + y_align: St.Align.START, x_align:rtl?St.Align.END:St.Align.START + }); + + let adjustment = this._scrollView[orientation[0] + 'scroll'].adjustment; + + this._workId = Main.initializeDeferredWork(this._box, Lang.bind(this, this._redisplay)); + + this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); + + this._appSystem = Shell.AppSystem.get_default(); + + this.iconAnimator = new PanelManager.IconAnimator(this.dtpPanel.panel.actor); + + this._signalsHandler.add( + [ + this.dtpPanel.panel.actor, + 'notify::height', + () => this._queueRedisplay() + ], + [ + this.dtpPanel.panel.actor, + 'notify::width', + () => this._queueRedisplay() + ], + [ + this._appSystem, + 'installed-changed', + Lang.bind(this, function() { + AppFavorites.getAppFavorites().reload(); + this._queueRedisplay(); + }) + ], + [ + this._appSystem, + 'app-state-changed', + Lang.bind(this, this._queueRedisplay) + ], + [ + AppFavorites.getAppFavorites(), + 'changed', + Lang.bind(this, this._queueRedisplay) + ], + [ + global.window_manager, + 'switch-workspace', + () => this._connectWorkspaceSignals() + ], + [ + Utils.DisplayWrapper.getScreen(), + [ + 'window-entered-monitor', + 'window-left-monitor' + ], + () => { + if (Me.settings.get_boolean('isolate-monitors')) { + this._queueRedisplay(); + } + } + ], + [ + Main.overview, + 'item-drag-begin', + Lang.bind(this, this._onDragBegin) + ], + [ + Main.overview, + 'item-drag-end', + Lang.bind(this, this._onDragEnd) + ], + [ + Main.overview, + 'item-drag-cancelled', + Lang.bind(this, this._onDragCancelled) + ], + [ + // Ensure the ShowAppsButton status is kept in sync + SearchController._showAppsButton, + 'notify::checked', + Lang.bind(this, this._syncShowAppsButtonToggled) + ], + [ + Me.settings, + [ + 'changed::dot-size', + 'changed::show-favorites', + 'changed::show-running-apps', + 'changed::show-favorites-all-monitors' + ], + Lang.bind(this, this._redisplay) + ], + [ + Me.settings, + 'changed::group-apps', + Lang.bind(this, function() { + this.isGroupApps = Me.settings.get_boolean('group-apps'); + this._connectWorkspaceSignals(); + }) + ], + [ + Me.settings, + [ + 'changed::group-apps-use-launchers', + 'changed::taskbar-locked' + ], + () => this.resetAppIcons() + ], + [ + adjustment, + [ + 'notify::upper', + 'notify::pageSize' + ], + () => this._onScrollSizeChange(adjustment) + ] + ); + + this.isGroupApps = Me.settings.get_boolean('group-apps'); + + this._onScrollSizeChange(adjustment); + this._connectWorkspaceSignals(); + }, + + destroy: function() { + this.iconAnimator.destroy(); + + this._signalsHandler.destroy(); + this._signalsHandler = 0; + + this._container.destroy(); + + this.previewMenu.disable(); + this.previewMenu.destroy(); + + this._disconnectWorkspaceSignals(); + }, + + _dropIconAnimations: function() { + this._getTaskbarIcons().forEach(item => { + item.raise(0); + item.stretch(0); + }); + }, + + _updateIconAnimations: function(pointerX, pointerY) { + this._iconAnimationTimestamp = Date.now(); + let type = iconAnimationSettings.type; + + if (!pointerX || !pointerY) + [pointerX, pointerY] = global.get_pointer(); + + this._getTaskbarIcons().forEach(item => { + let [x, y] = item.get_transformed_position(); + let [width, height] = item.get_transformed_size(); + let [centerX, centerY] = [x + width / 2, y + height / 2]; + let size = this._box.vertical ? height : width; + let difference = this._box.vertical ? pointerY - centerY : pointerX - centerX; + let distance = Math.abs(difference); + let maxDistance = (iconAnimationSettings.extent / 2) * size; + + if (type == 'PLANK') { + // Make the position stable for items that are far from the pointer. + let translation = distance <= maxDistance ? + distance / (2 + 8 * distance / maxDistance) : + // the previous expression with distance = maxDistance + maxDistance / 10; + + if (difference > 0) + translation *= -1; + + item.stretch(translation); + } + + if (distance <= maxDistance) { + let level = (maxDistance - distance) / maxDistance; + level = Math.pow(level, iconAnimationSettings.convexity); + item.raise(level); + } else { + item.raise(0); + } + }); + }, + + _onLeaveEvent: function(actor) { + let [stageX, stageY] = global.get_pointer(); + let [success, x, y] = actor.transform_stage_point(stageX, stageY); + if (success && !actor.allocation.contains(x, y) && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) + this._dropIconAnimations(); + + return Clutter.EVENT_PROPAGATE; + }, + + _onMotionEvent: function(actor_, event) { + if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { + let timestamp = Date.now(); + if (!this._iconAnimationTimestamp || + (timestamp - this._iconAnimationTimestamp >= iconAnimationSettings.duration / 2)) { + let [pointerX, pointerY] = event.get_coords(); + this._updateIconAnimations(pointerX, pointerY); + } + } + + return Clutter.EVENT_PROPAGATE; + }, + + _onScrollEvent: function(actor, event) { + + let orientation = this.dtpPanel.getOrientation(); + + // reset timeout to avid conflicts with the mousehover event + if (this._ensureAppIconVisibilityTimeoutId>0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + + // Skip to avoid double events mouse + if (event.is_pointer_emulated()) + return Clutter.EVENT_STOP; + + let adjustment, delta; + + adjustment = this._scrollView[orientation[0] + 'scroll'].get_adjustment(); + + let increment = adjustment.step_increment; + + switch ( event.get_scroll_direction() ) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + delta = -increment; + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + delta = +increment; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + delta = dy*increment; + delta += dx*increment; + break; + + } + + adjustment.set_value(adjustment.get_value() + delta); + + return Clutter.EVENT_STOP; + + }, + + _onScrollSizeChange: function(adjustment) { + // Update minimization animation target position on scrollview change. + this._updateAppIcons(); + + // When applications are ungrouped and there is some empty space on the horizontal taskbar, + // force a fixed label width to prevent the icons from "wiggling" when an animation runs + // (adding or removing an icon). When the taskbar is full, revert to a dynamic label width + // to allow them to resize and make room for new icons. + if (!this.dtpPanel.checkIfVertical() && !this.isGroupApps) { + let initial = this.fullScrollView; + + if (!this.fullScrollView && Math.floor(adjustment.upper) > adjustment.page_size) { + this.fullScrollView = adjustment.page_size; + } else if (adjustment.page_size < this.fullScrollView) { + this.fullScrollView = 0; + } + + if (initial != this.fullScrollView) { + this._getAppIcons().forEach(a => a.updateTitleStyle()); + } + } + }, + + _onDragBegin: function() { + this._dragCancelled = false; + this._dragMonitor = { + dragMotion: Lang.bind(this, this._onDragMotion) + }; + DND.addDragMonitor(this._dragMonitor); + + if (this._box.get_n_children() == 0) { + this._emptyDropTarget = new Dash.EmptyDropTargetItem(); + this._box.insert_child_at_index(this._emptyDropTarget, 0); + this._emptyDropTarget.show(true); + } + + this._toggleFavortieHighlight(true); + }, + + _onDragCancelled: function() { + this._dragCancelled = true; + + if (this._dragInfo) { + this._box.set_child_at_index(this._dragInfo[1]._dashItemContainer, this._dragInfo[0]); + } + + this._endDrag(); + }, + + _onDragEnd: function() { + if (this._dragCancelled) + return; + + this._endDrag(); + }, + + _endDrag: function() { + if (this._dragInfo && this._dragInfo[1]._dashItemContainer instanceof DragPlaceholderItem) { + this._box.remove_child(this._dragInfo[1]._dashItemContainer); + this._dragInfo[1]._dashItemContainer.destroy(); + delete this._dragInfo[1]._dashItemContainer; + } + + this._dragInfo = null; + this._clearEmptyDropTarget(); + this._showAppsIcon.setDragApp(null); + DND.removeDragMonitor(this._dragMonitor); + + this._toggleFavortieHighlight(); + }, + + _onDragMotion: function(dragEvent) { + let app = Dash.getAppFromSource(dragEvent.source); + if (app == null) + return DND.DragMotionResult.CONTINUE; + + let showAppsHovered = this._showAppsIcon.contains(dragEvent.targetActor); + + if (showAppsHovered) + this._showAppsIcon.setDragApp(app); + else + this._showAppsIcon.setDragApp(null); + + return DND.DragMotionResult.CONTINUE; + }, + + _toggleFavortieHighlight: function(show) { + let appFavorites = AppFavorites.getAppFavorites(); + let cssFuncName = (show ? 'add' : 'remove') + '_style_class_name'; + + this._getAppIcons().filter(appIcon => appFavorites.isFavorite(appIcon.app.get_id())) + .forEach(fav => fav._container[cssFuncName]('favorite')); + }, + + handleIsolatedWorkspaceSwitch: function() { + this._shownInitially = this.isGroupApps; + this._queueRedisplay(); + }, + + _connectWorkspaceSignals: function() { + this._disconnectWorkspaceSignals(); + + this._lastWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + + this._workspaceWindowAddedId = this._lastWorkspace.connect('window-added', () => this._queueRedisplay()); + this._workspaceWindowRemovedId = this._lastWorkspace.connect('window-removed', () => this._queueRedisplay()); + }, + + _disconnectWorkspaceSignals: function() { + if (this._lastWorkspace) { + this._lastWorkspace.disconnect(this._workspaceWindowAddedId); + this._lastWorkspace.disconnect(this._workspaceWindowRemovedId); + + this._lastWorkspace = null; + } + }, + + _queueRedisplay: function () { + Main.queueDeferredWork(this._workId); + }, + + _hookUpLabel: function(item, syncHandler) { + item.child.connect('notify::hover', Lang.bind(this, function() { + this._syncLabel(item, syncHandler); + })); + + syncHandler.connect('sync-tooltip', Lang.bind(this, function() { + this._syncLabel(item, syncHandler); + })); + }, + + _createAppItem: function(app, window, isLauncher) { + let appIcon = new AppIcons.taskbarAppIcon( + { + app: app, + window: window, + isLauncher: isLauncher + }, + this.dtpPanel, + { + setSizeManually: true, + showLabel: false, + isDraggable: !Me.settings.get_boolean('taskbar-locked'), + }, + this.previewMenu, + this.iconAnimator + ); + + if (appIcon._draggable) { + appIcon._draggable.connect('drag-begin', + Lang.bind(this, function() { + appIcon.actor.opacity = 0; + appIcon.isDragged = 1; + this._dropIconAnimations(); + })); + appIcon._draggable.connect('drag-end', + Lang.bind(this, function() { + appIcon.actor.opacity = 255; + delete appIcon.isDragged; + this._updateAppIcons(); + })); + } + + appIcon.connect('menu-state-changed', + Lang.bind(this, function(appIcon, opened) { + this._itemMenuStateChanged(item, opened); + })); + + let item = new TaskbarItemContainer(); + + item._dtpPanel = this.dtpPanel + extendDashItemContainer(item); + + item.setChild(appIcon.actor); + appIcon._dashItemContainer = item; + + appIcon.actor.connect('notify::hover', Lang.bind(this, function() { + if (appIcon.actor.hover){ + this._ensureAppIconVisibilityTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, function(){ + Utils.ensureActorVisibleInScrollView(this._scrollView, appIcon.actor, this._scrollView._dtpFadeSize); + this._ensureAppIconVisibilityTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + + if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') + appIcon.actor.get_parent().raise(1); + else if (!appIcon.isDragged && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) + this._updateIconAnimations(); + } else { + if (this._ensureAppIconVisibilityTimeoutId>0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + + if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') + appIcon.actor.get_parent().raise(0); + } + })); + + appIcon.actor.connect('clicked', + Lang.bind(this, function(actor) { + Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); + })); + + appIcon.actor.connect('key-focus-in', Lang.bind(this, function(actor) { + let [x_shift, y_shift] = Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); + + // This signal is triggered also by mouse click. The popup menu is opened at the original + // coordinates. Thus correct for the shift which is going to be applied to the scrollview. + if (appIcon._menu) { + appIcon._menu._boxPointer.xOffset = -x_shift; + appIcon._menu._boxPointer.yOffset = -y_shift; + } + })); + + // Override default AppIcon label_actor, now the + // accessible_name is set at DashItemContainer.setLabelText + appIcon.actor.label_actor = null; + item.setLabelText(app.get_name()); + + appIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(item, appIcon); + + return item; + }, + + // Return an array with the "proper" appIcons currently in the taskbar + _getAppIcons: function() { + // Only consider children which are "proper" icons and which are not + // animating out (which means they will be destroyed at the end of + // the animation) + return this._getTaskbarIcons().map(function(actor){ + return actor.child._delegate; + }); + }, + + _getTaskbarIcons: function(includeAnimated) { + return this._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.icon && + (includeAnimated || !actor.animatingOut); + }); + }, + + _updateAppIcons: function() { + let appIcons = this._getAppIcons(); + + appIcons.filter(icon => icon.constructor === AppIcons.taskbarAppIcon).forEach(icon => { + icon.updateIcon(); + }); + }, + + _itemMenuStateChanged: function(item, opened) { + // When the menu closes, it calls sync_hover, which means + // that the notify::hover handler does everything we need to. + if (opened) { + if (this._showLabelTimeoutId > 0) { + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + } + + item.hideLabel(); + } else { + // I want to listen from outside when a menu is closed. I used to + // add a custom signal to the appIcon, since gnome 3.8 the signal + // calling this callback was added upstream. + this.emit('menu-closed'); + + // The icon menu grabs the events and, once it is closed, the pointer is maybe + // no longer over the taskbar and the animations are not dropped. + if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { + this._scrollView.sync_hover(); + if (!this._scrollView.hover) + this._dropIconAnimations(); + } + } + }, + + _syncLabel: function (item, syncHandler) { + let shouldShow = syncHandler ? syncHandler.shouldShowTooltip() : item.child.get_hover(); + + if (shouldShow) { + if (this._showLabelTimeoutId == 0) { + let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; + this._showLabelTimeoutId = Mainloop.timeout_add(timeout, + Lang.bind(this, function() { + this._labelShowing = true; + item.showLabel(); + this._showLabelTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel'); + if (this._resetHoverTimeoutId > 0) { + Mainloop.source_remove(this._resetHoverTimeoutId); + this._resetHoverTimeoutId = 0; + } + } + } else { + if (this._showLabelTimeoutId > 0) + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + item.hideLabel(); + if (this._labelShowing) { + this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT, + Lang.bind(this, function() { + this._labelShowing = false; + this._resetHoverTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing'); + } + } + }, + + _adjustIconSize: function() { + const thisMonitorIndex = this.dtpPanel.monitor.index; + let panelSize = PanelSettings.getPanelSize(Me.settings, thisMonitorIndex); + let availSize = panelSize - Me.settings.get_int('appicon-padding') * 2; + let minIconSize = MIN_ICON_SIZE + panelSize % 2; + + if (availSize == this.iconSize) + return; + + if (availSize < minIconSize) { + availSize = minIconSize; + } + + // For the icon size, we only consider children which are "proper" + // icons and which are not animating out (which means they will be + // destroyed at the end of the animation) + let iconChildren = this._getTaskbarIcons().concat([this._showAppsIcon]); + let scale = this.iconSize / availSize; + + this.iconSize = availSize; + + for (let i = 0; i < iconChildren.length; i++) { + let icon = iconChildren[i].child._delegate.icon; + + // Set the new size immediately, to keep the icons' sizes + // in sync with this.iconSize + icon.setIconSize(this.iconSize); + + // Don't animate the icon size change when the overview + // is transitioning, or when initially filling + // the taskbar + if (Main.overview.animationInProgress || + !this._shownInitially) + continue; + + let [targetWidth, targetHeight] = icon.icon.get_size(); + + // Scale the icon's texture to the previous size and + // tween to the new size + icon.icon.set_size(icon.icon.width * scale, icon.icon.height * scale); + + Utils.animate(icon.icon, + { width: targetWidth, + height: targetHeight, + time: DASH_ANIMATION_TIME, + transition: 'easeOutQuad', + }); + } + }, + + sortAppsCompareFunction: function(appA, appB) { + return getAppStableSequence(appA, this.dtpPanel.monitor) - + getAppStableSequence(appB, this.dtpPanel.monitor); + }, + + getAppInfos: function() { + //get the user's favorite apps + let favoriteApps = this._checkIfShowingFavorites() ? AppFavorites.getAppFavorites().getFavorites() : []; + + //find the apps that should be in the taskbar: the favorites first, then add the running apps + // When using isolation, we filter out apps that have no windows in + // the current workspace (this check is done in AppIcons.getInterestingWindows) + let runningApps = this._checkIfShowingRunningApps() ? this._getRunningApps().sort(this.sortAppsCompareFunction.bind(this)) : []; + + if (!this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers')) { + return this._createAppInfos(favoriteApps, [], true) + .concat(this._createAppInfos(runningApps) + .filter(appInfo => appInfo.windows.length)); + } else { + return this._createAppInfos(favoriteApps.concat(runningApps.filter(app => favoriteApps.indexOf(app) < 0))) + .filter(appInfo => appInfo.windows.length || favoriteApps.indexOf(appInfo.app) >= 0); + } + }, + + _redisplay: function () { + if (!this._signalsHandler) { + return; + } + + //get the currently displayed appIcons + let currentAppIcons = this._getTaskbarIcons(); + let expectedAppInfos = this.getAppInfos(); + + //remove the appIcons which are not in the expected apps list + for (let i = currentAppIcons.length - 1; i > -1; --i) { + let appIcon = currentAppIcons[i].child._delegate; + let appIndex = Utils.findIndex(expectedAppInfos, appInfo => appInfo.app == appIcon.app && + appInfo.isLauncher == appIcon.isLauncher); + + if (appIndex < 0 || + (appIcon.window && (this.isGroupApps || expectedAppInfos[appIndex].windows.indexOf(appIcon.window) < 0)) || + (!appIcon.window && !appIcon.isLauncher && + !this.isGroupApps && expectedAppInfos[appIndex].windows.length)) { + currentAppIcons[i][this._shownInitially ? 'animateOutAndDestroy' : 'destroy'](); + currentAppIcons.splice(i, 1); + } + } + + //if needed, reorder the existing appIcons and create the missing ones + let currentPosition = 0; + for (let i = 0, l = expectedAppInfos.length; i < l; ++i) { + let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? + [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : + expectedAppInfos[i].windows.map(window => ({ app: expectedAppInfos[i].app, window: window, isLauncher: false })); + + for (let j = 0, ll = neededAppIcons.length; j < ll; ++j) { + //check if the icon already exists + let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && + appIcon.child._delegate.window == neededAppIcons[j].window); + + if (matchingAppIconIndex > 0 && matchingAppIconIndex != currentPosition) { + //moved icon, reposition it + this._box.remove_child(currentAppIcons[matchingAppIconIndex]); + this._box.insert_child_at_index(currentAppIcons[matchingAppIconIndex], currentPosition); + } else if (matchingAppIconIndex < 0) { + //the icon doesn't exist yet, create a new one + let newAppIcon = this._createAppItem(neededAppIcons[j].app, neededAppIcons[j].window, neededAppIcons[j].isLauncher); + + this._box.insert_child_at_index(newAppIcon, currentPosition); + currentAppIcons.splice(currentPosition, 0, newAppIcon); + + // Skip animations on first run when adding the initial set + // of items, to avoid all items zooming in at once + newAppIcon.show(this._shownInitially); + } + + ++currentPosition; + } + } + + this._adjustIconSize(); + + // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 + // Without it, StBoxLayout may use a stale size cache + this._box.queue_relayout(); + + // This is required for icon reordering when the scrollview is used. + this._updateAppIcons(); + + // This will update the size, and the corresponding number for each icon on the primary panel + if (this.dtpPanel.isPrimary) { + this._updateNumberOverlay(); + } + + this._shownInitially = true; + }, + + _checkIfShowingRunningApps: function() { + return Me.settings.get_boolean('show-running-apps'); + }, + + _checkIfShowingFavorites: function() { + return Me.settings.get_boolean('show-favorites') && + (this.dtpPanel.isPrimary || Me.settings.get_boolean('show-favorites-all-monitors')); + }, + + _getRunningApps: function() { + let tracker = Shell.WindowTracker.get_default(); + let windows = global.get_window_actors(); + let apps = []; + + for (let i = 0, l = windows.length; i < l; ++i) { + let app = tracker.get_window_app(windows[i].metaWindow); + + if (app && apps.indexOf(app) < 0) { + apps.push(app); + } + } + + return apps; + }, + + _createAppInfos: function(apps, defaultWindows, defaultIsLauncher) { + return apps.map(app => ({ + app: app, + isLauncher: defaultIsLauncher || false, + windows: defaultWindows || AppIcons.getInterestingWindows(app, this.dtpPanel.monitor) + .sort(sortWindowsCompareFunction) + })); + }, + + // Reset the displayed apps icon to mantain the correct order + resetAppIcons : function(geometryChange) { + let children = this._getTaskbarIcons(true); + + for (let i = 0; i < children.length; i++) { + let item = children[i]; + item.destroy(); + } + + // to avoid ugly animations, just suppress them like when taskbar is first loaded. + this._shownInitially = false; + this._redisplay(); + + if (geometryChange && this.dtpPanel.checkIfVertical()) { + this.previewMenu._updateClip(); + } + }, + + _updateNumberOverlay: function() { + let seenApps = {}; + let counter = 0; + + this._getAppIcons().forEach(function(icon) { + if (!seenApps[icon.app]) { + seenApps[icon.app] = 1; + counter++; + } + + if (counter <= 10) { + icon.setNumberOverlay(counter == 10 ? 0 : counter); + } else { + // No overlay after 10 + icon.setNumberOverlay(-1); + } + + icon.updateHotkeyNumberOverlay(); + }); + + if (Me.settings.get_boolean('hot-keys') && + Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.toggleNumberOverlay(true); + }, + + toggleNumberOverlay: function(activate) { + let appIcons = this._getAppIcons(); + appIcons.forEach(function(icon) { + icon.toggleNumberOverlay(activate); + }); + }, + + _clearEmptyDropTarget: function() { + if (this._emptyDropTarget) { + this._emptyDropTarget.animateOutAndDestroy(); + this._emptyDropTarget = null; + } + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) + return DND.DragMotionResult.CONTINUE; + + // Don't allow favoriting of transient apps + if (source.app == null || source.app.is_window_backed()) + return DND.DragMotionResult.NO_DROP; + + if (!this._settings.is_writable('favorite-apps')) + return DND.DragMotionResult.NO_DROP; + + let sourceActor = source instanceof St.Widget ? source : source.actor; + let isVertical = this.dtpPanel.checkIfVertical(); + + if (!this._box.contains(sourceActor) && !source._dashItemContainer) { + //not an appIcon of the taskbar, probably from the applications view + source._dashItemContainer = new DragPlaceholderItem(source, this.iconSize, isVertical); + this._box.insert_child_above(source._dashItemContainer, null); + } + + let sizeProp = isVertical ? 'height' : 'width'; + let posProp = isVertical ? 'y' : 'x'; + let pos = isVertical ? y : x; + + let currentAppIcons = this._getAppIcons(); + let sourceIndex = currentAppIcons.indexOf(source); + let hoveredIndex = Utils.findIndex(currentAppIcons, + appIcon => pos >= appIcon._dashItemContainer[posProp] && + pos <= (appIcon._dashItemContainer[posProp] + appIcon._dashItemContainer[sizeProp])); + + if (!this._dragInfo) { + this._dragInfo = [sourceIndex, source]; + } + + if (hoveredIndex >= 0) { + let isLeft = pos < currentAppIcons[hoveredIndex]._dashItemContainer[posProp] + currentAppIcons[hoveredIndex]._dashItemContainer[sizeProp] * .5; + + // Don't allow positioning before or after self and between icons of same app + if (!(hoveredIndex === sourceIndex || + (isLeft && hoveredIndex - 1 == sourceIndex) || + (isLeft && hoveredIndex - 1 >= 0 && source.app != currentAppIcons[hoveredIndex - 1].app && + currentAppIcons[hoveredIndex - 1].app == currentAppIcons[hoveredIndex].app) || + (!isLeft && hoveredIndex + 1 == sourceIndex) || + (!isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != currentAppIcons[hoveredIndex + 1].app && + currentAppIcons[hoveredIndex + 1].app == currentAppIcons[hoveredIndex].app))) { + this._box.set_child_at_index(source._dashItemContainer, hoveredIndex); + + // Ensure the next and previous icon are visible when moving the icon + // (I assume there's room for both of them) + if (hoveredIndex > 1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex-1], this._scrollView._dtpFadeSize); + if (hoveredIndex < this._box.get_children().length-1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex+1], this._scrollView._dtpFadeSize); + } + } + + return this._dragInfo[0] !== sourceIndex ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.CONTINUE; + }, + + // Draggable target interface + acceptDrop : function(source, actor, x, y, time) { + // Don't allow favoriting of transient apps + if (!source.app || source.app.is_window_backed() || !this._settings.is_writable('favorite-apps')) { + return false; + } + + let appIcons = this._getAppIcons(); + let sourceIndex = appIcons.indexOf(source); + let usingLaunchers = !this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers'); + + // dragging the icon to its original position + if (this._dragInfo[0] === sourceIndex) { + return true; + } + + let appFavorites = AppFavorites.getAppFavorites(); + let sourceAppId = source.app.get_id(); + let appIsFavorite = appFavorites.isFavorite(sourceAppId); + let replacingIndex = sourceIndex + (sourceIndex > this._dragInfo[0] ? -1 : 1); + let favoriteIndex = replacingIndex >= 0 ? appFavorites.getFavorites().indexOf(appIcons[replacingIndex].app) : 0; + let sameApps = appIcons.filter(a => a != source && a.app == source.app); + let showingFavorites = this._checkIfShowingFavorites(); + let favoritesCount = 0; + let position = 0; + let interestingWindows = {}; + let getAppWindows = app => { + if (!interestingWindows[app]) { + interestingWindows[app] = AppIcons.getInterestingWindows(app, this.dtpPanel.monitor); + } + + let appWindows = interestingWindows[app]; //prevents "reference to undefined property Symbol.toPrimitive" warning + return appWindows; + }; + + if (sameApps.length && + ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && + (!appIcons[sourceIndex + 1] || appIcons[sourceIndex + 1].app !== source.app))) { + appIcons.splice(appIcons.indexOf(sameApps[0]), sameApps.length); + Array.prototype.splice.apply(appIcons, [sourceIndex + 1, 0].concat(sameApps)); + } + + for (let i = 0, l = appIcons.length; i < l; ++i) { + let windows = []; + + if (!usingLaunchers || (!source.isLauncher && !appIcons[i].isLauncher)) { + windows = appIcons[i].window ? [appIcons[i].window] : getAppWindows(appIcons[i].app); + } + + windows.forEach(w => w._dtpPosition = position++); + + if (showingFavorites && + ((usingLaunchers && appIcons[i].isLauncher) || + (!usingLaunchers && appFavorites.isFavorite(appIcons[i].app.get_id())))) { + ++favoritesCount; + } + } + + if (sourceIndex < favoritesCount) { + if (appIsFavorite) { + appFavorites.moveFavoriteToPos(sourceAppId, favoriteIndex); + } else { + appFavorites.addFavoriteAtPos(sourceAppId, favoriteIndex); + } + } else if (appIsFavorite && showingFavorites && (!usingLaunchers || source.isLauncher)) { + appFavorites.removeFavorite(sourceAppId); + } + + appFavorites.emit('changed'); + + return true; + }, + + _onShowAppsButtonToggled: function() { + // Sync the status of the default appButtons. Only if the two statuses are + // different, that means the user interacted with the extension provided + // application button, cutomize the behaviour. Otherwise the shell has changed the + // status (due to the _syncShowAppsButtonToggled function below) and it + // has already performed the desired action. + let selector = SearchController; + + if (selector._showAppsButton && + selector._showAppsButton.checked !== this.showAppsButton.checked) { + // find visible view + + if (this.showAppsButton.checked) { + if (Me.settings.get_boolean('show-apps-override-escape')) { + //override escape key to return to the desktop when entering the overview using the showapps button + SearchController._onStageKeyPress = function(actor, event) { + if (Main.modalCount == 1 && event.get_key_symbol() === Clutter.KEY_Escape) { + this._searchActive ? this.reset() : Main.overview.hide(); + + return Clutter.EVENT_STOP; + } + + return this.__proto__._onStageKeyPress.call(this, actor, event); + }; + } + + // force spring animation triggering.By default the animation only + // runs if we are already inside the overview. + if (!Main.overview._shown) { + this.forcedOverview = true; + let grid = AppDisplay._grid; + let onShownCb; + let overviewSignal = Config.PACKAGE_VERSION > '3.38.1' ? 'showing' : 'shown'; + let overviewShowingId = Main.overview.connect(overviewSignal, () => { + Main.overview.disconnect(overviewShowingId); + onShownCb(); + }); + + onShownCb = () => grid.emit('animation-done'); + } + + //temporarily use as primary the monitor on which the showapps btn was clicked, this is + //restored by the panel when exiting the overview + this.dtpPanel.panelManager.setFocusedMonitor(this.dtpPanel.monitor); + + let overviewHiddenId = Main.overview.connect('hidden', () => { + Main.overview.disconnect(overviewHiddenId); + delete SearchController._onStageKeyPress; + }); + + // Finally show the overview + selector._showAppsButton.checked = true; + Main.overview.show(2 /*APP_GRID*/); + } + else { + if (this.forcedOverview) { + // force exiting overview if needed + + Main.overview.hide(); + this.forcedOverview = false; + } + else { + selector._showAppsButton.checked = false; + this.forcedOverview = false; + } + } + } + }, + + _syncShowAppsButtonToggled: function() { + let status = SearchController._showAppsButton.checked; + if (this.showAppsButton.checked !== status) + this.showAppsButton.checked = status; + }, + + showShowAppsButton: function() { + this.showAppsButton.visible = true; + this.showAppsButton.set_width(-1); + this.showAppsButton.set_height(-1); + }, + + popupFocusedAppSecondaryMenu: function() { + let appIcons = this._getAppIcons(); + let tracker = Shell.WindowTracker.get_default(); + + for(let i in appIcons) { + if(appIcons[i].app == tracker.focus_app) { + let appIcon = appIcons[i]; + if(appIcon._menu && appIcon._menu.isOpen) + appIcon._menu.close(); + else + appIcon.popupMenu(); + + appIcon.sync_hover(); + break; + } + } + }, +}); + +Signals.addSignalMethods(taskbar.prototype); + +const CloneContainerConstraint = Utils.defineClass({ + Name: 'DashToPanel-CloneContainerConstraint', + Extends: Clutter.BindConstraint, + + vfunc_update_allocation: function(actor, actorBox) { + if (!this.source) + return; + + let [stageX, stageY] = this.source.get_transformed_position(); + let [width, height] = this.source.get_transformed_size(); + + actorBox.set_origin(stageX, stageY); + actorBox.set_size(width, height); + }, +}); + +var TaskbarItemContainer = Utils.defineClass({ + Name: 'DashToPanel-TaskbarItemContainer', + Extends: Dash.DashItemContainer, + + vfunc_allocate: function(box, flags) { + if (this.child == null) + return; + + Utils.setAllocation(this, box, flags); + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let [minChildWidth, minChildHeight, natChildWidth, natChildHeight] = this.child.get_preferred_size(); + let [childScaleX, childScaleY] = this.child.get_scale(); + + let childWidth = Math.min(natChildWidth * childScaleX, availWidth); + let childHeight = Math.min(natChildHeight * childScaleY, availHeight); + let childBox = new Clutter.ActorBox(); + + childBox.x1 = (availWidth - childWidth) / 2; + childBox.y1 = (availHeight - childHeight) / 2; + childBox.x2 = childBox.x1 + childWidth; + childBox.y2 = childBox.y1 + childHeight; + + Utils.allocate(this.child, childBox, flags); + }, + + // In case appIcon is removed from the taskbar while it is hovered, + // restore opacity before dashItemContainer.animateOutAndDestroy does the destroy animation. + animateOutAndDestroy: function() { + if (this._raisedClone) { + this._raisedClone.source.opacity = 255; + this._raisedClone.destroy(); + } + + this.callParent('animateOutAndDestroy'); + }, + + // For ItemShowLabel + _getIconAnimationOffset: function() { + if (!Me.settings.get_boolean('animate-appicon-hover')) + return 0; + + let travel = iconAnimationSettings.travel; + let zoom = iconAnimationSettings.zoom; + return this._dtpPanel.dtpSize * (travel + (zoom - 1) / 2); + }, + + _updateCloneContainerPosition: function(cloneContainer) { + let [stageX, stageY] = this.get_transformed_position(); + + if (Config.PACKAGE_VERSION >= '3.36') + cloneContainer.set_position(stageX - this.translation_x, stageY - this.translation_y); + else + cloneContainer.set_position(stageX, stageY); + }, + + _createRaisedClone: function() { + let [width, height] = this.get_transformed_size(); + + // "clone" of this child (appIcon actor) + let cloneButton = this.child._delegate.getCloneButton(); + + // "clone" of this (taskbarItemContainer) + let cloneContainer = new St.Bin({ + child: cloneButton, + width: width, height: height, + reactive: false, + }); + + this._updateCloneContainerPosition(cloneContainer); + + // For the stretch animation + if (Config.PACKAGE_VERSION >= '3.36') { + let boundProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; + this.bind_property(boundProperty, cloneContainer, boundProperty, GObject.BindingFlags.SYNC_CREATE); + } else { + let constraint = new CloneContainerConstraint({ source: this }); + cloneContainer.add_constraint(constraint); + } + + // The clone follows its source when the taskbar is scrolled. + let taskbarScrollView = this.get_parent().get_parent(); + let adjustment = this._dtpPanel.checkIfVertical() ? taskbarScrollView.vscroll.get_adjustment() : taskbarScrollView.hscroll.get_adjustment(); + let adjustmentChangedId = adjustment.connect('notify::value', () => this._updateCloneContainerPosition(cloneContainer)); + + // Update clone position when an item is added to / removed from the taskbar. + let taskbarBox = this.get_parent(); + let taskbarBoxAllocationChangedId = taskbarBox.connect('notify::allocation', () => this._updateCloneContainerPosition(cloneContainer)); + + // The clone itself + this._raisedClone = cloneButton.child; + this._raisedClone.connect('destroy', () => { + adjustment.disconnect(adjustmentChangedId); + taskbarBox.disconnect(taskbarBoxAllocationChangedId); + Mainloop.idle_add(() => cloneContainer.destroy()); + delete this._raisedClone; + }); + + this._raisedClone.source.opacity = 0; + Main.uiGroup.add_actor(cloneContainer); + }, + + // Animate the clone. + // AppIcon actors cannot go outside the taskbar so the animation is done with a clone. + // If level is zero, the clone is dropped and destroyed. + raise: function(level) { + if (this._raisedClone) + Utils.stopAnimations(this._raisedClone); + else if (level) + this._createRaisedClone(); + else + return; + + let panelPosition = this._dtpPanel.getPosition(); + let panelElementPositions = this._dtpPanel.panelManager.panelsElementPositions[this._dtpPanel.monitor.index] || Pos.defaults; + let taskbarPosition = panelElementPositions.filter(pos => pos.element == 'taskbar')[0].position; + + let vertical = panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT; + let translationDirection = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT ? 1 : -1; + let rotationDirection; + if (panelPosition == St.Side.LEFT || taskbarPosition == Pos.STACKED_TL) + rotationDirection = -1; + else if (panelPosition == St.Side.RIGHT || taskbarPosition == Pos.STACKED_BR) + rotationDirection = 1; + else { + let items = this.get_parent().get_children(); + let index = items.indexOf(this); + rotationDirection = (index - (items.length - 1) / 2) / ((items.length - 1) / 2); + } + + let duration = iconAnimationSettings.duration / 1000; + let rotation = iconAnimationSettings.rotation; + let travel = iconAnimationSettings.travel; + let zoom = iconAnimationSettings.zoom; + + // level is about 1 for the icon that is hovered, less for others. + // time depends on the translation to do. + let [width, height] = this._raisedClone.source.get_transformed_size(); + let translationMax = (vertical ? width : height) * (travel + (zoom - 1) / 2); + let translationEnd = translationMax * level; + let translationDone = vertical ? this._raisedClone.translation_x : this._raisedClone.translation_y; + let translationTodo = Math.abs(translationEnd - translationDone); + let scale = 1 + (zoom - 1) * level; + let rotationAngleZ = rotationDirection * rotation * level; + let time = duration * translationTodo / translationMax; + + let options = { + scale_x: scale, scale_y: scale, + rotation_angle_z: rotationAngleZ, + time: time, + transition: 'easeOutQuad', + onComplete: () => { + if (!level) { + this._raisedClone.source.opacity = 255; + this._raisedClone.destroy(); + delete this._raisedClone; + } + }, + }; + options[vertical ? 'translation_x' : 'translation_y'] = translationDirection * translationEnd; + + Utils.animate(this._raisedClone, options); + }, + + // Animate this and cloneContainer, since cloneContainer translation is bound to this. + stretch: function(translation) { + let duration = iconAnimationSettings.duration / 1000; + let zoom = iconAnimationSettings.zoom; + let animatedProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; + let isShowing = this.opacity != 255 || this.child.opacity != 255; + + if (isShowing) { + // Do no stop the animation initiated in DashItemContainer.show. + this[animatedProperty] = zoom * translation; + } else { + let options = { + time: duration, + transition: 'easeOutQuad', + }; + options[animatedProperty] = zoom * translation; + + Utils.stopAnimations(this); + Utils.animate(this, options); + } + }, +}); + +var DragPlaceholderItem = Utils.defineClass({ + Name: 'DashToPanel-DragPlaceholderItem', + Extends: St.Widget, + + _init: function(appIcon, iconSize, isVertical) { + this.callParent('_init', { style: AppIcons.getIconContainerStyle(isVertical), layout_manager: new Clutter.BinLayout() }); + + this.child = { _delegate: appIcon }; + + this._clone = new Clutter.Clone({ + source: appIcon.icon._iconBin, + width: iconSize, + height: iconSize + }); + + this.add_actor(this._clone); + }, + + destroy: function() { + this._clone.destroy(); + this.callParent('destroy'); + }, +}); + +function getAppStableSequence(app, monitor) { + let windows = AppIcons.getInterestingWindows(app, monitor); + + return windows.reduce((prevWindow, window) => { + return Math.min(prevWindow, getWindowStableSequence(window)); + }, Infinity); +} + +function sortWindowsCompareFunction(windowA, windowB) { + return getWindowStableSequence(windowA) - getWindowStableSequence(windowB); +} + +function getWindowStableSequence(window) { + return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js new file mode 100644 index 0000000..aa86d7a --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js @@ -0,0 +1,269 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Clutter = imports.gi.Clutter; +const GdkPixbuf = imports.gi.GdkPixbuf; +const Lang = imports.lang; +const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const St = imports.gi.St; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +var DynamicTransparency = Utils.defineClass({ + Name: 'DashToPanel.DynamicTransparency', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this._proximityManager = dtpPanel.panelManager.proximityManager; + this._proximityWatchId = 0; + this._windowOverlap = false; + this.currentBackgroundColor = 0; + + this._initialPanelStyle = dtpPanel.panel.actor.get_style(); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._initialPanelCornerStyle = dtpPanel.panel._leftCorner.actor.get_style(); + } + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._bindSignals(); + + this._updateAnimationDuration(); + this._updateAllAndSet(); + this._updateProximityWatch(); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._proximityManager.removeWatch(this._proximityWatchId); + + this._dtpPanel.panel.actor.set_style(this._initialPanelStyle); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(this._initialPanelCornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(this._initialPanelCornerStyle); + } + }, + + updateExternalStyle: function() { + this._updateComplementaryStyles(); + this._setBackground(); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + Utils.getStageTheme(), + 'changed', + () => this._updateAllAndSet() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._updateAlphaAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-bg', + 'changed::trans-bg-color' + ], + () => this._updateColorAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-opacity', + 'changed::trans-panel-opacity', + 'changed::trans-bg-color', + 'changed::trans-dynamic-anim-target', + 'changed::trans-use-dynamic-opacity' + ], + () => this._updateAlphaAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-gradient', + 'changed::trans-gradient-top-color', + 'changed::trans-gradient-bottom-color', + 'changed::trans-gradient-top-opacity', + 'changed::trans-gradient-bottom-opacity' + ], + () => this._updateGradientAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-dynamic-behavior', + 'changed::trans-use-dynamic-opacity', + 'changed::trans-dynamic-distance' + ], + () => this._updateProximityWatch() + ], + [ + Me.settings, + 'changed::trans-dynamic-anim-time', + () => this._updateAnimationDuration() + ] + ); + }, + + _updateProximityWatch: function() { + this._proximityManager.removeWatch(this._proximityWatchId); + + if (Me.settings.get_boolean('trans-use-dynamic-opacity')) { + let isVertical = this._dtpPanel.checkIfVertical(); + let threshold = Me.settings.get_int('trans-dynamic-distance'); + + this._proximityWatchId = this._proximityManager.createWatch( + this._dtpPanel.panelBox.get_parent(), + Proximity.Mode[Me.settings.get_string('trans-dynamic-behavior')], + isVertical ? threshold : 0, + isVertical ? 0 : threshold, + overlap => { + this._windowOverlap = overlap; + this._updateAlphaAndSet(); + } + ); + } + }, + + _updateAnimationDuration: function() { + this.animationDuration = (Me.settings.get_int('trans-dynamic-anim-time') * 0.001) + 's;'; + }, + + _updateAllAndSet: function() { + let themeBackground = this._getThemeBackground(true); + + this._updateColor(themeBackground); + this._updateAlpha(themeBackground); + this._updateComplementaryStyles(); + this._updateGradient(); + this._setBackground(); + this._setGradient(); + }, + + _updateColorAndSet: function() { + this._updateColor(); + this._setBackground(); + }, + + _updateAlphaAndSet: function() { + this._updateAlpha(); + this._setBackground(); + }, + + _updateGradientAndSet: function() { + this._updateGradient(); + this._setGradient(); + }, + + _updateComplementaryStyles: function() { + let panelThemeNode = this._dtpPanel.panel.actor.get_theme_node(); + + this._complementaryStyles = 'border-radius: ' + panelThemeNode.get_border_radius(0) + 'px;'; + }, + + _updateColor: function(themeBackground) { + this.backgroundColorRgb = Me.settings.get_boolean('trans-use-custom-bg') ? + Me.settings.get_string('trans-bg-color') : + (themeBackground || this._getThemeBackground()); + }, + + _updateAlpha: function(themeBackground) { + if (this._windowOverlap && !Main.overview.visibleTarget && Me.settings.get_boolean('trans-use-dynamic-opacity')) { + this.alpha = Me.settings.get_double('trans-dynamic-anim-target'); + } else { + this.alpha = Me.settings.get_boolean('trans-use-custom-opacity') ? + Me.settings.get_double('trans-panel-opacity') : + (themeBackground || this._getThemeBackground()).alpha * 0.003921569; // 1 / 255 = 0.003921569 + } + }, + + _updateGradient: function() { + this._gradientStyle = ''; + + if (Me.settings.get_boolean('trans-use-custom-gradient')) { + this._gradientStyle += 'background-gradient-direction: ' + (this._dtpPanel.checkIfVertical() ? 'horizontal;' : 'vertical;') + + 'background-gradient-start: ' + Utils.getrgbaColor(Me.settings.get_string('trans-gradient-top-color'), + Me.settings.get_double('trans-gradient-top-opacity')) + + 'background-gradient-end: ' + Utils.getrgbaColor(Me.settings.get_string('trans-gradient-bottom-color'), + Me.settings.get_double('trans-gradient-bottom-opacity')); + } + }, + + _setBackground: function() { + this.currentBackgroundColor = Utils.getrgbaColor(this.backgroundColorRgb, this.alpha); + + let transition = 'transition-duration:' + this.animationDuration; + let cornerStyle = '-panel-corner-background-color: ' + this.currentBackgroundColor + transition; + + this._dtpPanel.set_style('background-color: ' + this.currentBackgroundColor + transition + this._complementaryStyles); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(cornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(cornerStyle); + } + }, + + _setGradient: function() { + this._dtpPanel.panel.actor.set_style( + 'background: none; ' + + 'border-image: none; ' + + 'background-image: none; ' + + this._gradientStyle + + 'transition-duration:' + this.animationDuration + ); + }, + + _getThemeBackground: function(reload) { + if (reload || !this._themeBackground) { + let fakePanel = new St.Bin({ name: 'panel' }); + Main.uiGroup.add_child(fakePanel); + let fakeTheme = fakePanel.get_theme_node() + this._themeBackground = this._getBackgroundImageColor(fakeTheme) || fakeTheme.get_background_color(); + Main.uiGroup.remove_child(fakePanel); + } + + return this._themeBackground; + }, + + _getBackgroundImageColor: function(theme) { + let bg = null; + + try { + let imageFile = theme.get_background_image() || theme.get_border_image().get_file(); + + if (imageFile) { + let imageBuf = GdkPixbuf.Pixbuf.new_from_file(imageFile.get_path()); + let pixels = imageBuf.get_pixels(); + + bg = { red: pixels[0], green: pixels[1], blue: pixels[2], alpha: pixels[3] }; + } + } catch (error) {} + + return bg; + } +}); \ No newline at end of file diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js new file mode 100644 index 0000000..d90d2cc --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js @@ -0,0 +1,1040 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const GdkPixbuf = imports.gi.GdkPixbuf; +const Gi = imports._gi; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const Util = imports.misc.util; + +var TRANSLATION_DOMAIN = imports.misc.extensionUtils.getCurrentExtension().metadata['gettext-domain']; +var SCROLL_TIME = Util.SCROLL_TIME / (Util.SCROLL_TIME > 1 ? 1000 : 1); + +//Clutter implicit animations are available since 3.34 +//prefer those over Tweener if available +if (Config.PACKAGE_VERSION < '3.34') { + var Tweener = imports.ui.tweener; +} + +var defineClass = function (classDef) { + let parentProto = classDef.Extends ? classDef.Extends.prototype : null; + + if (Config.PACKAGE_VERSION < '3.31.9') { + if (parentProto && (classDef.Extends.name || classDef.Extends.toString()).indexOf('DashToPanel.') < 0) { + classDef.callParent = function() { + let args = Array.prototype.slice.call(arguments); + let func = args.shift(); + + classDef.Extends.prototype[func].apply(this, args); + }; + } + + return new imports.lang.Class(classDef); + } + + let isGObject = parentProto instanceof GObject.Object; + let needsSuper = parentProto && !isGObject; + let getParentArgs = function(args) { + let parentArgs = []; + + (classDef.ParentConstrParams || parentArgs).forEach(p => { + if (p.constructor === Array) { + let param = args[p[0]]; + + parentArgs.push(p[1] ? param[p[1]] : param); + } else { + parentArgs.push(p); + } + }); + + return parentArgs; + }; + + let C = eval( + '(class C ' + (needsSuper ? 'extends Object' : '') + ' { ' + + ' constructor(...args) { ' + + (needsSuper ? 'super(...getParentArgs(args));' : '') + + (needsSuper || !parentProto ? 'this._init(...args);' : '') + + ' }' + + ' callParent(...args) { ' + + ' let func = args.shift(); ' + + ' if (!(func === \'_init\' && needsSuper))' + + ' super[func](...args); ' + + ' }' + + '})' + ); + + if (parentProto) { + Object.setPrototypeOf(C.prototype, parentProto); + Object.setPrototypeOf(C, classDef.Extends); + } + + Object.defineProperty(C, 'name', { value: classDef.Name }); + Object.keys(classDef) + .filter(k => classDef.hasOwnProperty(k) && classDef[k] instanceof Function) + .forEach(k => C.prototype[k] = classDef[k]); + + if (isGObject) { + C = GObject.registerClass({ Signals: classDef.Signals || {} }, C); + } + + return C; +}; + +// simplify global signals and function injections handling +// abstract class +var BasicHandler = defineClass({ + Name: 'DashToPanel.BasicHandler', + + _init: function(){ + this._storage = new Object(); + }, + + add: function(/*unlimited 3-long array arguments*/){ + + // convert arguments object to array, concatenate with generic + let args = [].concat('generic', [].slice.call(arguments)); + // call addWithLabel with ags as if they were passed arguments + this.addWithLabel.apply(this, args); + }, + + destroy: function() { + for( let label in this._storage ) + this.removeWithLabel(label); + }, + + addWithLabel: function( label /* plus unlimited 3-long array arguments*/) { + + if(this._storage[label] == undefined) + this._storage[label] = new Array(); + + // skip first element of the arguments + for( let i = 1; i < arguments.length; i++ ) { + let item = this._storage[label]; + let handlers = this._create(arguments[i]); + + for (let j = 0, l = handlers.length; j < l; ++j) { + item.push(handlers[j]); + } + } + + }, + + removeWithLabel: function(label){ + + if(this._storage[label]) { + for( let i = 0; i < this._storage[label].length; i++ ) { + this._remove(this._storage[label][i]); + } + + delete this._storage[label]; + } + }, + + /* Virtual methods to be implemented by subclass */ + // create single element to be stored in the storage structure + _create: function(item){ + throw new Error('no implementation of _create in ' + this); + }, + + // correctly delete single element + _remove: function(item){ + throw new Error('no implementation of _remove in ' + this); + } +}); + +// Manage global signals +var GlobalSignalsHandler = defineClass({ + Name: 'DashToPanel.GlobalSignalsHandler', + Extends: BasicHandler, + + _create: function(item) { + let handlers = []; + + item[1] = [].concat(item[1]); + + for (let i = 0, l = item[1].length; i < l; ++i) { + let object = item[0]; + let event = item[1][i]; + let callback = item[2] + try { + let id = object.connect(event, callback); + + handlers.push([object, id]); + } catch (e) + { + + } + } + + return handlers; + }, + + _remove: function(item){ + item[0].disconnect(item[1]); + } +}); + +/** + * Manage function injection: both instances and prototype can be overridden + * and restored + */ +var InjectionsHandler = defineClass({ + Name: 'DashToPanel.InjectionsHandler', + Extends: BasicHandler, + + _create: function(item) { + let object = item[0]; + let name = item[1]; + let injectedFunction = item[2]; + let original = object[name]; + + object[name] = injectedFunction; + return [[object, name, injectedFunction, original]]; + }, + + _remove: function(item) { + let object = item[0]; + let name = item[1]; + let original = item[3]; + object[name] = original; + } +}); + +/** + * Manage timeouts: the added timeouts have their id reset on completion + */ +var TimeoutsHandler = defineClass({ + Name: 'DashToPanel.TimeoutsHandler', + Extends: BasicHandler, + + _create: function(item) { + let name = item[0]; + let delay = item[1]; + let timeoutHandler = item[2]; + + this._remove(item); + + this[name] = Mainloop.timeout_add(delay, () => { + this[name] = 0; + timeoutHandler(); + }); + + return [[name]]; + }, + + remove: function(name) { + this._remove([name]) + }, + + _remove: function(item) { + let name = item[0]; + + if (this[name]) { + Mainloop.source_remove(this[name]); + this[name] = 0; + } + }, + + getId: function(name) { + return this[name] ? this[name] : 0; + } +}); + +// This is wrapper to maintain compatibility with GNOME-Shell 3.30+ as well as +// previous versions. +var DisplayWrapper = { + getScreen: function() { + return global.screen || global.display; + }, + + getWorkspaceManager: function() { + return global.screen || global.workspace_manager; + }, + + getMonitorManager: function() { + return global.screen || Meta.MonitorManager.get(); + } +}; + +var getCurrentWorkspace = function() { + return DisplayWrapper.getWorkspaceManager().get_active_workspace(); +}; + +var getWorkspaceByIndex = function(index) { + return DisplayWrapper.getWorkspaceManager().get_workspace_by_index(index); +}; + +var getWorkspaceCount = function() { + return DisplayWrapper.getWorkspaceManager().n_workspaces; +}; + +var getStageTheme = function() { + return St.ThemeContext.get_for_stage(global.stage); +}; + +var getScaleFactor = function() { + return getStageTheme().scale_factor || 1; +}; + +var getAppDisplayViews = function() { + //gnome-shell 3.38 only has one view and it is now the appDisplay + return imports.ui.appDisplay._views || [{ view: imports.ui.appDisplay }]; +}; + +var findIndex = function(array, predicate) { + if (Array.prototype.findIndex) { + return array.findIndex(predicate); + } + + for (let i = 0, l = array.length; i < l; ++i) { + if (predicate(array[i])) { + return i; + } + } + + return -1; +}; + +var find = function(array, predicate) { + let index = findIndex(array, predicate); + + if (index > -1) { + return array[index]; + } +}; + +var mergeObjects = function(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +var hookVfunc = function(proto, symbol, func) { + if (Gi.hook_up_vfunc_symbol && func) { + //gjs > 1.53.3 + proto[Gi.hook_up_vfunc_symbol](symbol, func); + } else { + //On older gjs, this is how to hook vfunc. It is buggy and can't be used reliably to replace + //already hooked functions. Since it's our only use for it, disabled for now (and probably forever) + //Gi.hook_up_vfunc(proto, symbol, func); + } +}; + +var wrapActor = function(actor) { + if (actor) { + Object.defineProperty(actor, 'actor', { + value: actor instanceof Clutter.Actor ? actor : actor.actor + }); + } +}; + +var getTransformedAllocation = function(actor) { + if (Config.PACKAGE_VERSION < '3.37') { + return Shell.util_get_transformed_allocation(actor); + } + + let extents = actor.get_transformed_extents(); + let topLeft = extents.get_top_left(); + let bottomRight = extents.get_bottom_right(); + + return { x1: topLeft.x, x2: bottomRight.x, y1: topLeft.y, y2: bottomRight.y }; +}; + +var allocate = function(actor, box, flags, useParent) { + let allocateObj = useParent ? actor.__proto__ : actor; + + allocateObj.allocate.apply(actor, getAllocationParams(box, flags)); +}; + +var setAllocation = function(actor, box, flags) { + actor.set_allocation.apply(actor, getAllocationParams(box, flags)); +}; + +var getAllocationParams = function(box, flags) { + let params = [box]; + + if (Config.PACKAGE_VERSION < '3.37') { + params.push(flags); + } + + return params; +}; + +var setClip = function(actor, x, y, width, height) { + actor.set_clip(0, 0, width, height); + actor.set_position(x, y); + actor.set_size(width, height); +}; + +var addKeybinding = function(key, settings, handler, modes) { + if (!Main.wm._allowedKeybindings[key]) { + Main.wm.addKeybinding( + key, + settings, + Meta.KeyBindingFlags.NONE, + modes || (Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW), + handler + ); + } +}; + +var removeKeybinding = function(key) { + if (Main.wm._allowedKeybindings[key]) { + Main.wm.removeKeybinding(key); + } +}; + +var getrgbColor = function(color) { + color = typeof color === 'string' ? Clutter.color_from_string(color)[1] : color; + + return { red: color.red, green: color.green, blue: color.blue }; +}; + +var getrgbaColor = function(color, alpha, offset) { + if (alpha <= 0) { + return 'transparent; '; + } + + let rgb = getrgbColor(color); + + if (offset) { + ['red', 'green', 'blue'].forEach(k => { + rgb[k] = Math.min(255, Math.max(0, rgb[k] + offset)); + + if (rgb[k] == color[k]) { + rgb[k] = Math.min(255, Math.max(0, rgb[k] - offset)); + } + }); + } + + return 'rgba(' + rgb.red + ',' + rgb.green + ',' + rgb.blue + ',' + (Math.floor(alpha * 100) * 0.01) + '); ' ; +}; + +var checkIfColorIsBright = function(color) { + let rgb = getrgbColor(color); + let brightness = 0.2126 * rgb.red + 0.7152 * rgb.green + 0.0722 * rgb.blue; + + return brightness > 128; +}; + +var getMouseScrollDirection = function(event) { + let direction; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + direction = 'up'; + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + direction = 'down'; + break; + } + + return direction; +}; + +var checkIfWindowHasTransient = function(window) { + let hasTransient; + + window.foreach_transient(t => !(hasTransient = true)); + + return hasTransient; +}; + +var activateSiblingWindow = function(windows, direction, startWindow) { + let windowIndex = windows.indexOf(global.display.focus_window); + let nextWindowIndex = windowIndex < 0 ? + startWindow ? windows.indexOf(startWindow) : 0 : + windowIndex + (direction == 'up' ? 1 : -1); + + if (nextWindowIndex == windows.length) { + nextWindowIndex = 0; + } else if (nextWindowIndex < 0) { + nextWindowIndex = windows.length - 1; + } + + if (windowIndex != nextWindowIndex) { + Main.activateWindow(windows[nextWindowIndex]); + } +}; + +var animateWindowOpacity = function(window, tweenOpts) { + //there currently is a mutter bug with the windowactor opacity, starting with 3.34 + //https://gitlab.gnome.org/GNOME/mutter/issues/836 + + if (Config.PACKAGE_VERSION > '3.35') { + //on 3.36, a workaround is to use the windowactor's child for the fade animation + //this leaves a "shadow" on the desktop, so the windowactor needs to be hidden + //when the animation is complete + let visible = tweenOpts.opacity > 0; + let windowActor = window; + + window = windowActor.get_first_child() || windowActor; + + if (!windowActor.visible && visible) { + window.opacity = 0; + windowActor.visible = visible; + } + + if (!visible) { + let initialOpacity = window.opacity; + + tweenOpts.onComplete = () => { + windowActor.visible = visible; + window.opacity = initialOpacity; + }; + } + } else if (Config.PACKAGE_VERSION > '3.33') { + //the workaround only works on 3.35+, so on 3.34, let's just hide the + //window without animation + return window.visible = (tweenOpts.opacity == 255); + } + + animate(window, tweenOpts); +}; + +var animate = function(actor, options) { + if (Tweener) { + return Tweener.addTween(actor, options); + } + + //to support both Tweener and Clutter animations, we use Tweener "time" + //and "delay" properties defined in seconds, as opposed to Clutter animations + //"duration" and "delay" which are defined in milliseconds + if (options.delay) { + options.delay = options.delay * 1000; + } + + options.duration = options.time * 1000; + delete options.time; + + if (options.transition) { + //map Tweener easing equations to Clutter animation modes + options.mode = { + 'easeInCubic': Clutter.AnimationMode.EASE_IN_CUBIC, + 'easeInOutCubic': Clutter.AnimationMode.EASE_IN_OUT_CUBIC, + 'easeInOutQuad': Clutter.AnimationMode.EASE_IN_OUT_QUAD, + 'easeOutQuad': Clutter.AnimationMode.EASE_OUT_QUAD + }[options.transition] || Clutter.AnimationMode.LINEAR; + + delete options.transition; + } + + let params = [options]; + + if ('value' in options && actor instanceof St.Adjustment) { + params.unshift(options.value); + delete options.value; + } + + actor.ease.apply(actor, params); +} + +var isAnimating = function(actor, prop) { + if (Tweener) { + return Tweener.isTweening(actor); + } + + return !!actor.get_transition(prop); +} + +var stopAnimations = function(actor) { + if (Tweener) { + return Tweener.removeTweens(actor); + } + + actor.remove_all_transitions(); +} + +var getIndicators = function(delegate) { + if (delegate instanceof St.BoxLayout) { + return delegate; + } + + return delegate.indicators; +} + +var getPoint = function(coords) { + if (Config.PACKAGE_VERSION > '3.35.1') { + return new imports.gi.Graphene.Point(coords); + } + + return new Clutter.Point(coords); +} + +var getPanelGhost = function() { + if (!Main.overview._panelGhost) { + return Main.overview._overview.get_first_child(); + } + + return Main.overview._panelGhost; +} + +var notify = function(text, iconName, action, isTransient) { + let source = new MessageTray.SystemNotificationSource(); + let notification = new MessageTray.Notification(source, 'Dash to Panel', text); + let notifyFunc = source.showNotification || source.notify; + + if (iconName) { + source.createIcon = function() { + return new St.Icon({ icon_name: iconName }); + }; + } + + if (action) { + if (!(action instanceof Array)) { + action = [action]; + } + + action.forEach(a => notification.addAction(a.text, a.func)); + } + + Main.messageTray.add(source); + + notification.setTransient(isTransient); + notifyFunc.call(source, notification); +}; + +/* + * This is a copy of the same function in utils.js, but also adjust horizontal scrolling + * and perform few further cheks on the current value to avoid changing the values when + * it would be clamp to the current one in any case. + * Return the amount of shift applied +*/ +var ensureActorVisibleInScrollView = function(scrollView, actor, fadeSize, onComplete) { + let vadjustment = scrollView.vscroll.adjustment; + let hadjustment = scrollView.hscroll.adjustment; + let [vvalue, vlower, vupper, vstepIncrement, vpageIncrement, vpageSize] = vadjustment.get_values(); + let [hvalue, hlower, hupper, hstepIncrement, hpageIncrement, hpageSize] = hadjustment.get_values(); + + let [hvalue0, vvalue0] = [hvalue, vvalue]; + + let voffset = fadeSize; + let hoffset = fadeSize; + + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2, x1 = box.x1, x2 = box.x2; + + let parent = actor.get_parent(); + while (parent != scrollView) { + if (!parent) + throw new Error("actor not in scroll view"); + + let box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + x1 += box.x1; + x2 += box.x1; + parent = parent.get_parent(); + } + + if (y1 < vvalue + voffset) + vvalue = Math.max(0, y1 - voffset); + else if (vvalue < vupper - vpageSize && y2 > vvalue + vpageSize - voffset) + vvalue = Math.min(vupper -vpageSize, y2 + voffset - vpageSize); + + if (x1 < hvalue + hoffset) + hvalue = Math.max(0, x1 - hoffset); + else if (hvalue < hupper - hpageSize && x2 > hvalue + hpageSize - hoffset) + hvalue = Math.min(hupper - hpageSize, x2 + hoffset - hpageSize); + + let tweenOpts = { + time: SCROLL_TIME, + onComplete: onComplete || (() => {}), + transition: 'easeOutQuad' + }; + + if (vvalue !== vvalue0) { + animate(vadjustment, mergeObjects(tweenOpts, { value: vvalue })); + } + + if (hvalue !== hvalue0) { + animate(hadjustment, mergeObjects(tweenOpts, { value: hvalue })); + } + + return [hvalue- hvalue0, vvalue - vvalue0]; +} + +/** + * ColorUtils is adapted from https://github.com/micheleg/dash-to-dock + */ +var ColorUtils = { + colorLuminance: function(r, g, b, dlum) { + // Darken or brighten color by a fraction dlum + // Each rgb value is modified by the same fraction. + // Return "#rrggbb" strin + + let rgbString = '#'; + + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2); + + return rgbString; + }, + + _decimalToHex: function(d, padding) { + // Convert decimal to an hexadecimal string adding the desired padding + + let hex = d.toString(16); + while (hex.length < padding) + hex = '0'+ hex; + return hex; + }, + + HSVtoRGB: function(h, s, v) { + // Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (h,s,v) independently or {h:h, s:s, v:v} object. + // Return {r:r, g:g, b:b} object. + + if (arguments.length === 1) { + s = h.s; + v = h.v; + h = h.h; + } + + let r,g,b; + let c = v*s; + let h1 = h*6; + let x = c*(1 - Math.abs(h1 % 2 - 1)); + let m = v - c; + + if (h1 <=1) + r = c + m, g = x + m, b = m; + else if (h1 <=2) + r = x + m, g = c + m, b = m; + else if (h1 <=3) + r = m, g = c + m, b = x + m; + else if (h1 <=4) + r = m, g = x + m, b = c + m; + else if (h1 <=5) + r = x + m, g = m, b = c + m; + else + r = c + m, g = m, b = x + m; + + return { + r: Math.round(r * 255), + g: Math.round(g * 255), + b: Math.round(b * 255) + }; + }, + + RGBtoHSV: function(r, g, b) { + // Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (r,g,b) independently or {r:r, g:g, b:b} object. + // Return {h:h, s:s, v:v} object. + + if (arguments.length === 1) { + r = r.r; + g = r.g; + b = r.b; + } + + let h,s,v; + + let M = Math.max(r, g, b); + let m = Math.min(r, g, b); + let c = M - m; + + if (c == 0) + h = 0; + else if (M == r) + h = ((g-b)/c) % 6; + else if (M == g) + h = (b-r)/c + 2; + else + h = (r-g)/c + 4; + + h = h/6; + v = M/255; + if (M !== 0) + s = c/M; + else + s = 0; + + return {h: h, s: s, v: v}; + } +}; + +/** + * DominantColorExtractor is adapted from https://github.com/micheleg/dash-to-dock + */ +let themeLoader = null; +let iconCacheMap = new Map(); +const MAX_CACHED_ITEMS = 1000; +const BATCH_SIZE_TO_DELETE = 50; +const DOMINANT_COLOR_ICON_SIZE = 64; + +var DominantColorExtractor = defineClass({ + Name: 'DashToPanel.DominantColorExtractor', + + _init: function(app){ + this._app = app; + }, + + /** + * Try to get the pixel buffer for the current icon, if not fail gracefully + */ + _getIconPixBuf: function() { + let iconTexture = this._app.create_icon_texture(16); + + if (themeLoader === null) { + let ifaceSettings = new Gio.Settings({ schema: "org.gnome.desktop.interface" }); + + themeLoader = new Gtk.IconTheme(), + themeLoader.set_custom_theme(ifaceSettings.get_string('icon-theme')); // Make sure the correct theme is loaded + } + + // Unable to load the icon texture, use fallback + if (iconTexture instanceof St.Icon === false) { + return null; + } + + iconTexture = iconTexture.get_gicon(); + + // Unable to load the icon texture, use fallback + if (iconTexture === null) { + return null; + } + + if (iconTexture instanceof Gio.FileIcon) { + // Use GdkPixBuf to load the pixel buffer from the provided file path + return GdkPixbuf.Pixbuf.new_from_file(iconTexture.get_file().get_path()); + } + + // Get the pixel buffer from the icon theme + let icon_info = themeLoader.lookup_icon(iconTexture.get_names()[0], DOMINANT_COLOR_ICON_SIZE, 0); + if (icon_info !== null) + return icon_info.load_icon(); + else + return null; + }, + + /** + * The backlight color choosing algorithm was mostly ported to javascript from the + * Unity7 C++ source of Canonicals: + * https://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/launcher/LauncherIcon.cpp + * so it more or less works the same way. + */ + _getColorPalette: function() { + if (iconCacheMap.get(this._app.get_id())) { + // We already know the answer + return iconCacheMap.get(this._app.get_id()); + } + + let pixBuf = this._getIconPixBuf(); + if (pixBuf == null) + return null; + + let pixels = pixBuf.get_pixels(), + offset = 0; + + let total = 0, + rTotal = 0, + gTotal = 0, + bTotal = 0; + + let resample_y = 1, + resample_x = 1; + + // Resampling of large icons + // We resample icons larger than twice the desired size, as the resampling + // to a size s + // DOMINANT_COLOR_ICON_SIZE < s < 2*DOMINANT_COLOR_ICON_SIZE, + // most of the case exactly DOMINANT_COLOR_ICON_SIZE as the icon size is tipycally + // a multiple of it. + let width = pixBuf.get_width(); + let height = pixBuf.get_height(); + + // Resample + if (height >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_y = Math.floor(height/DOMINANT_COLOR_ICON_SIZE); + + if (width >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_x = Math.floor(width/DOMINANT_COLOR_ICON_SIZE); + + if (resample_x !==1 || resample_y !== 1) + pixels = this._resamplePixels(pixels, resample_x, resample_y); + + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length; + for (let offset = 0; offset < limit; offset+=4) { + let r = pixels[offset], + g = pixels[offset + 1], + b = pixels[offset + 2], + a = pixels[offset + 3]; + + let saturation = (Math.max(r,g, b) - Math.min(r,g, b)); + let relevance = 0.1 * 255 * 255 + 0.9 * a * saturation; + + rTotal += r * relevance; + gTotal += g * relevance; + bTotal += b * relevance; + + total += relevance; + } + + total = total * 255; + + let r = rTotal / total, + g = gTotal / total, + b = bTotal / total; + + let hsv = ColorUtils.RGBtoHSV(r * 255, g * 255, b * 255); + + if (hsv.s > 0.15) + hsv.s = 0.65; + hsv.v = 0.90; + + let rgb = ColorUtils.HSVtoRGB(hsv.h, hsv.s, hsv.v); + + // Cache the result. + let backgroundColor = { + lighter: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0.2), + original: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0), + darker: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, -0.5) + }; + + if (iconCacheMap.size >= MAX_CACHED_ITEMS) { + //delete oldest cached values (which are in order of insertions) + let ctr=0; + for (let key of iconCacheMap.keys()) { + if (++ctr > BATCH_SIZE_TO_DELETE) + break; + iconCacheMap.delete(key); + } + } + + iconCacheMap.set(this._app.get_id(), backgroundColor); + + return backgroundColor; + }, + + /** + * Downsample large icons before scanning for the backlight color to + * improve performance. + * + * @param pixBuf + * @param pixels + * @param resampleX + * @param resampleY + * + * @return []; + */ + _resamplePixels: function (pixels, resampleX, resampleY) { + let resampledPixels = []; + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length / (resampleX * resampleY) / 4; + for (let i = 0; i < limit; i++) { + let pixel = i * resampleX * resampleY; + + resampledPixels.push(pixels[pixel * 4]); + resampledPixels.push(pixels[pixel * 4 + 1]); + resampledPixels.push(pixels[pixel * 4 + 2]); + resampledPixels.push(pixels[pixel * 4 + 3]); + } + + return resampledPixels; + } + +}); + +var drawRoundedLine = function(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) { + if (height > width) { + y += Math.floor((height - width) / 2.0); + height = width; + } + + height = 2.0 * Math.floor(height / 2.0); + + var leftRadius = isRoundLeft ? height / 2.0 : 0.0; + var rightRadius = isRoundRight ? height / 2.0 : 0.0; + + cr.moveTo(x + width - rightRadius, y); + cr.lineTo(x + leftRadius, y); + if (isRoundLeft) + cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2); + else + cr.lineTo(x, y + height); + cr.lineTo(x + width - rightRadius, y + height); + if (isRoundRight) + cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2); + else + cr.lineTo(x + width, y); + cr.closePath(); + + if (fill != null) { + cr.setSource(fill); + cr.fillPreserve(); + } + if (stroke != null) + cr.setSource(stroke); + cr.stroke(); +} + +/** + * Check if an app exists in the system. + */ +var checkedCommandsMap = new Map(); + +function checkIfCommandExists(app) { + let answer = checkedCommandsMap.get(app); + if (answer === undefined) { + // Command is a shell built in, use shell to call it. + // Quotes around app value are important. They let command operate + // on the whole value, instead of having shell interpret it. + let cmd = "sh -c 'command -v \"" + app + "\"'"; + try { + let out = GLib.spawn_command_line_sync(cmd); + // out contains 1: stdout, 2: stderr, 3: exit code + answer = out[3] == 0; + } catch (ex) { + answer = false; + } + + checkedCommandsMap.set(app, answer); + } + return answer; +} diff --git a/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js new file mode 100644 index 0000000..45d08a0 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js @@ -0,0 +1,1145 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const Meta = imports.gi.Meta; +const PopupMenu = imports.ui.popupMenu; +const Signals = imports.signals; +const St = imports.gi.St; +const WindowManager = imports.ui.windowManager; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +//timeout intervals +const ENSURE_VISIBLE_MS = 200; + +//timeout names +const T1 = 'openMenuTimeout'; +const T2 = 'closeMenuTimeout'; +const T3 = 'peekTimeout'; +const T4 = 'ensureVisibleTimeout'; + +const MAX_TRANSLATION = 40; +const HEADER_HEIGHT = 38; +const MAX_CLOSE_BUTTON_SIZE = 30; +const MIN_DIMENSION = 100; +const FOCUSED_COLOR_OFFSET = 24; +const HEADER_COLOR_OFFSET = -12; +const FADE_SIZE = 36; +const PEEK_INDEX_PROP = '_dtpPeekInitialIndex'; + +let headerHeight = 0; +let alphaBg = 0; +let isLeftButtons = false; +let isTopHeader = true; +let isManualStyling = false; +let scaleFactor = 1; +let animationTime = 0; +let aspectRatio = {}; + +var PreviewMenu = Utils.defineClass({ + Name: 'DashToPanel-PreviewMenu', + Extends: St.Widget, + Signals: { 'open-state-changed': {} }, + + _init: function(panel) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); + + let geom = panel.geom; + this.panel = panel; + this.currentAppIcon = null; + this._focusedPreview = null; + this._peekedWindow = null; + this.peekInitialWorkspaceIndex = -1; + this.opened = false; + this.isVertical = geom.position == St.Side.LEFT || geom.position == St.Side.RIGHT; + this._translationProp = 'translation_' + (this.isVertical ? 'x' : 'y'); + this._translationDirection = (geom.position == St.Side.TOP || geom.position == St.Side.LEFT ? -1 : 1); + this._translationOffset = Math.min(panel.dtpSize, MAX_TRANSLATION) * this._translationDirection; + + this.menu = new St.Widget({ + name: 'preview-menu', + layout_manager: new Clutter.BinLayout(), + reactive: true, + track_hover: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign[geom.position != St.Side.RIGHT ? 'START' : 'END'], + y_align: Clutter.ActorAlign[geom.position != St.Side.BOTTOM ? 'START' : 'END'] + }); + this._box = new St.BoxLayout({ vertical: this.isVertical }); + this._scrollView = new St.ScrollView({ + name: 'dashtopanelPreviewScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: true, + y_expand: !this.isVertical + }); + + this._scrollView.add_actor(this._box); + this.menu.add_child(this._scrollView); + this.add_child(this.menu); + }, + + enable: function() { + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + Main.layoutManager.addChrome(this, { affectsInputRegion: false }); + Main.layoutManager.trackChrome(this.menu, { affectsInputRegion: true }); + + this._resetHiddenState(); + this._refreshGlobals(); + this._updateClip(); + this.menu.set_position(1, 1); + + this._signalsHandler.add( + [ + this.menu, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._scrollView, + 'scroll-event', + this._onScrollEvent.bind(this) + ], + [ + this.panel.panelBox, + 'style-changed', + () => this._updateClip() + ], + [ + Utils.DisplayWrapper.getScreen(), + 'in-fullscreen-changed', + () => { + if (global.display.focus_window && global.display.focus_window.is_fullscreen()) { + this.close(true); + } + } + ], + [ + Me.settings, + [ + 'changed::panel-sizes', + 'changed::window-preview-size', + 'changed::window-preview-padding', + 'changed::window-preview-show-title' + ], + () => { + this._refreshGlobals(); + this._updateClip(); + } + ] + ); + }, + + disable: function() { + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + + this.close(true); + + Main.layoutManager.untrackChrome(this.menu); + Main.layoutManager.removeChrome(this); + }, + + requestOpen: function(appIcon) { + let timeout = Me.settings.get_int('show-window-previews-timeout'); + + if (this.opened) { + timeout = Math.min(100, timeout); + } + + this._endOpenCloseTimeouts(); + this._timeoutsHandler.add([T1, timeout, () => this.open(appIcon)]); + }, + + requestClose: function() { + this._endOpenCloseTimeouts(); + this._addCloseTimeout(); + }, + + open: function(appIcon) { + if (this.currentAppIcon != appIcon) { + this.currentAppIcon = appIcon; + + if (!this.opened) { + this._refreshGlobals(); + + this.set_height(this.clipHeight); + this.menu.show(); + + setStyle(this.menu, 'background: ' + Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, alphaBg)); + } + + this._mergeWindows(appIcon); + this._updatePosition(); + this._animateOpenOrClose(true); + + this._setReactive(true); + this._setOpenedState(true); + } + }, + + close: function(immediate) { + this._endOpenCloseTimeouts(); + this._removeFocus(); + this._endPeek(); + + if (immediate) { + Utils.stopAnimations(this.menu); + this._resetHiddenState(); + } else { + this._animateOpenOrClose(false, () => this._resetHiddenState()); + } + + this._setReactive(false); + this.currentAppIcon = null; + }, + + update: function(appIcon, windows) { + if (this.currentAppIcon == appIcon) { + if (windows && !windows.length) { + this.close(); + } else { + this._addAndRemoveWindows(windows); + this._updatePosition(); + } + } + }, + + updatePosition: function() { + this._updatePosition(); + }, + + focusNext: function() { + let previews = this._box.get_children(); + let currentIndex = this._focusedPreview ? previews.indexOf(this._focusedPreview) : -1; + let nextIndex = currentIndex + 1; + + nextIndex = previews[nextIndex] ? nextIndex : 0; + + if (previews[nextIndex]) { + this._removeFocus(); + previews[nextIndex].setFocus(true); + this._focusedPreview = previews[nextIndex]; + } + + return nextIndex; + }, + + activateFocused: function() { + if (this.opened && this._focusedPreview) { + this._focusedPreview.activate(); + } + }, + + requestPeek: function(window) { + this._timeoutsHandler.remove(T3); + + if (Me.settings.get_boolean('peek-mode')) { + if (this.peekInitialWorkspaceIndex < 0) { + this._timeoutsHandler.add([T3, Me.settings.get_int('enter-peek-mode-timeout'), () => this._peek(window)]); + } else { + this._peek(window); + } + } + }, + + endPeekHere: function() { + this._endPeek(true); + }, + + ensureVisible: function(preview) { + let [ , upper, pageSize] = this._getScrollAdjustmentValues(); + + if (upper > pageSize) { + this._timeoutsHandler.add([ + T4, + ENSURE_VISIBLE_MS, + () => Utils.ensureActorVisibleInScrollView(this._scrollView, preview, MIN_DIMENSION, () => this._updateScrollFade()) + ]); + } + }, + + getCurrentAppIcon: function() { + return this.currentAppIcon; + }, + + _setReactive: function(reactive) {  + this._box.get_children().forEach(c => c.reactive = reactive); + this.menu.reactive = reactive; + }, + + _setOpenedState: function(opened) { + this.opened = opened; + this.emit('open-state-changed'); + }, + + _resetHiddenState: function() { + this.menu.hide(); + this.set_height(0); + this._setOpenedState(false); + this.menu.opacity = 0; + this.menu[this._translationProp] = this._translationOffset; + this._box.get_children().forEach(c => c.destroy()); + }, + + _removeFocus: function() { + if (this._focusedPreview) { + this._focusedPreview.setFocus(false); + this._focusedPreview = null; + } + }, + + _mergeWindows: function(appIcon, windows) { + windows = windows || (appIcon.window ? [appIcon.window] : appIcon.getAppIconInterestingWindows()); + windows.sort(Taskbar.sortWindowsCompareFunction); + + let currentPreviews = this._box.get_children(); + let l = Math.max(windows.length, currentPreviews.length); + + for (let i = 0; i < l; ++i) { + if (currentPreviews[i] && windows[i]) { + currentPreviews[i].assignWindow(windows[i], this.opened); + } else if (!currentPreviews[i]) { + this._addNewPreview(windows[i]); + } else if (!windows[i]) { + currentPreviews[i][!this.opened ? 'destroy' : 'animateOut'](); + } + } + }, + + _addAndRemoveWindows: function(windows) { + let currentPreviews = this._box.get_children(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + + for (let i = 0, l = windows.length; i < l; ++i) { + let currentIndex = Utils.findIndex(currentPreviews, c => c.window == windows[i]); + + if (currentIndex < 0) { + this._addNewPreview(windows[i]); + } else { + currentPreviews[currentIndex].assignWindow(windows[i]); + currentPreviews.splice(currentIndex, 1); + + if (this._peekedWindow && this._peekedWindow == windows[i]) { + this.requestPeek(windows[i]); + } + } + } + + currentPreviews.forEach(c => c.animateOut()); + }, + + _addNewPreview: function(window) { + let preview = new Preview(this); + + this._box.add_child(preview); + preview.adjustOnStage(); + preview.assignWindow(window, this.opened); + }, + + _addCloseTimeout: function() { + this._timeoutsHandler.add([T2, Me.settings.get_int('leave-timeout'), () => this.close()]); + }, + + _onHoverChanged: function() { + this._endOpenCloseTimeouts(); + + if (this.currentAppIcon && !this.menu.hover) { + this._addCloseTimeout(); + this._endPeek(); + } + }, + + _onScrollEvent: function(actor, event) { + if (!event.is_pointer_emulated()) { + let vOrh = this.isVertical ? 'v' : 'h'; + let adjustment = this._scrollView['get_' + vOrh + 'scroll_bar']().get_adjustment(); + let increment = adjustment.step_increment; + let delta = increment; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + delta = -increment; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + delta = dy * increment; + delta += dx * increment; + break; + } + + adjustment.set_value(adjustment.get_value() + delta); + this._updateScrollFade(); + } + + return Clutter.EVENT_STOP; + }, + + _endOpenCloseTimeouts: function() { + this._timeoutsHandler.remove(T1); + this._timeoutsHandler.remove(T2); + this._timeoutsHandler.remove(T4); + }, + + _refreshGlobals: function() { + isLeftButtons = Meta.prefs_get_button_layout().left_buttons.indexOf(Meta.ButtonFunction.CLOSE) >= 0; + isTopHeader = Me.settings.get_string('window-preview-title-position') == 'TOP'; + isManualStyling = Me.settings.get_boolean('window-preview-manual-styling'); + scaleFactor = Utils.getScaleFactor(); + headerHeight = Me.settings.get_boolean('window-preview-show-title') ? HEADER_HEIGHT * scaleFactor : 0; + animationTime = Me.settings.get_int('window-preview-animation-time') * .001; + aspectRatio.x = { + size: Me.settings.get_int('window-preview-aspect-ratio-x'), + fixed: Me.settings.get_boolean('window-preview-fixed-x') + }; + aspectRatio.y = { + size: Me.settings.get_int('window-preview-aspect-ratio-y'), + fixed: Me.settings.get_boolean('window-preview-fixed-y') + }; + + alphaBg = Me.settings.get_boolean('preview-use-custom-opacity') ? + Me.settings.get_int('preview-custom-opacity') * .01 : + this.panel.dynamicTransparency.alpha; + }, + + _updateClip: function() { + let x, y, w; + let geom = this.panel.getGeometry(); + let panelBoxTheme = this.panel.panelBox.get_theme_node(); + let previewSize = (Me.settings.get_int('window-preview-size') + + Me.settings.get_int('window-preview-padding') * 2) * scaleFactor; + + if (this.isVertical) { + w = previewSize; + this.clipHeight = this.panel.monitor.height; + y = this.panel.monitor.y; + } else { + w = this.panel.monitor.width; + this.clipHeight = (previewSize + headerHeight); + x = this.panel.monitor.x; + } + + if (geom.position == St.Side.LEFT) { + x = this.panel.monitor.x + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.LEFT); + } else if (geom.position == St.Side.RIGHT) { + x = this.panel.monitor.x + this.panel.monitor.width - (this.panel.dtpSize + previewSize) - panelBoxTheme.get_padding(St.Side.RIGHT); + } else if (geom.position == St.Side.TOP) { + y = this.panel.monitor.y + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.TOP); + } else { //St.Side.BOTTOM + y = this.panel.monitor.y + this.panel.monitor.height - (this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.BOTTOM) + previewSize + headerHeight); + } + + Utils.setClip(this, x, y, w, this.clipHeight); + }, + + _updatePosition: function() { + let sourceNode = this.currentAppIcon.actor.get_theme_node(); + let sourceContentBox = sourceNode.get_content_box(this.currentAppIcon.actor.get_allocation_box()); + let sourceAllocation = Utils.getTransformedAllocation(this.currentAppIcon.actor); + let [previewsWidth, previewsHeight] = this._getPreviewsSize(); + let appIconMargin = Me.settings.get_int('appicon-margin') / scaleFactor; + let x = 0, y = 0; + + previewsWidth = Math.min(previewsWidth, this.panel.monitor.width); + previewsHeight = Math.min(previewsHeight, this.panel.monitor.height); + this._updateScrollFade(previewsWidth < this.panel.monitor.width && previewsHeight < this.panel.monitor.height); + + if (this.isVertical) { + y = sourceAllocation.y1 + appIconMargin - this.panel.monitor.y + (sourceContentBox.y2 - sourceContentBox.y1 - previewsHeight) * .5; + y = Math.max(y, 0); + y = Math.min(y, this.panel.monitor.height - previewsHeight); + } else { + x = sourceAllocation.x1 + appIconMargin - this.panel.monitor.x + (sourceContentBox.x2 - sourceContentBox.x1 - previewsWidth) * .5; + x = Math.max(x, 0); + x = Math.min(x, this.panel.monitor.width - previewsWidth); + } + + if (!this.opened) { + this.menu.set_position(x, y); + this.menu.set_size(previewsWidth, previewsHeight); + } else { + Utils.animate(this.menu, getTweenOpts({ x: x, y: y, width: previewsWidth, height: previewsHeight })); + } + }, + + _updateScrollFade: function(remove) { + let [value, upper, pageSize] = this._getScrollAdjustmentValues(); + let needsFade = Math.round(upper) > Math.round(pageSize); + let fadeWidgets = this.menu.get_children().filter(c => c != this._scrollView); + + if (!remove && needsFade) { + if (!fadeWidgets.length) { + fadeWidgets.push(this._getFadeWidget()); + fadeWidgets.push(this._getFadeWidget(true)); + + this.menu.add_child(fadeWidgets[0]); + this.menu.add_child(fadeWidgets[1]); + } + + fadeWidgets[0].visible = value > 0; + fadeWidgets[1].visible = value + pageSize < upper; + } else if (remove || (!needsFade && fadeWidgets.length)) { + fadeWidgets.forEach(fw => fw.destroy()); + } + }, + + _getScrollAdjustmentValues: function() { + let [value , , upper, , , pageSize] = this._scrollView[(this.isVertical ? 'v' : 'h') + 'scroll'].adjustment.get_values(); + + return [value, upper, pageSize]; + }, + + _getFadeWidget: function(end) { + let x = 0, y = 0; + let startBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, Math.min(alphaBg + .1, 1)); + let endBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, 0) + let fadeStyle = 'background-gradient-start:' + startBg + + 'background-gradient-end:' + endBg + + 'background-gradient-direction:' + this.panel.getOrientation(); + + if (this.isVertical) { + y = end ? this.panel.monitor.height - FADE_SIZE : 0; + } else { + x = end ? this.panel.monitor.width - FADE_SIZE : 0; + } + + let fadeWidget = new St.Widget({ + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: end ? 180 : 0, + style: fadeStyle, + x: x, y: y, + width: this.isVertical ? this.width : FADE_SIZE, + height: this.isVertical ? FADE_SIZE : this.height + }); + + return fadeWidget; + }, + + _getPreviewsSize: function() { + let previewsWidth = 0; + let previewsHeight = 0; + + this._box.get_children().forEach(c => { + if (!c.animatingOut) { + let [width, height] = c.getSize(); + + if (this.isVertical) { + previewsWidth = Math.max(width, previewsWidth); + previewsHeight += height; + } else { + previewsWidth += width; + previewsHeight = Math.max(height, previewsHeight); + } + } + }); + + return [previewsWidth, previewsHeight]; + }, + + _animateOpenOrClose: function(show, onComplete) { + let isTranslationAnimation = this.menu[this._translationProp] != 0; + let tweenOpts = { + opacity: show ? 255 : 0, + transition: show ? 'easeInOutQuad' : 'easeInCubic', + onComplete: () => { + if (isTranslationAnimation) { + Main.layoutManager._queueUpdateRegions(); + } + + (onComplete || (() => {}))(); + } + }; + + tweenOpts[this._translationProp] = show ? this._translationDirection : this._translationOffset; + + Utils.animate(this.menu, getTweenOpts(tweenOpts)); + }, + + _peek: function(window) { + let currentWorkspace = Utils.getCurrentWorkspace(); + let windowWorkspace = window.get_workspace(); + let focusWindow = () => this._focusMetaWindow(Me.settings.get_int('peek-mode-opacity'), window); + + this._restorePeekedWindowStack(); + this._peekedWindow = window; + + if (currentWorkspace != windowWorkspace) { + this._switchToWorkspaceImmediate(windowWorkspace.index()); + this._timeoutsHandler.add([T3, 100, focusWindow]); + } else { + focusWindow(); + } + + if (this.peekInitialWorkspaceIndex < 0) { + this.peekInitialWorkspaceIndex = currentWorkspace.index(); + } + }, + + _endPeek: function(stayHere) { + this._timeoutsHandler.remove(T3); + + if (this._peekedWindow) { + let immediate = !stayHere && this.peekInitialWorkspaceIndex != Utils.getCurrentWorkspace().index(); + + this._restorePeekedWindowStack(); + this._focusMetaWindow(255, this._peekedWindow, immediate, true); + this._peekedWindow = null; + + if (!stayHere) { + this._switchToWorkspaceImmediate(this.peekInitialWorkspaceIndex); + } + + this.peekInitialWorkspaceIndex = -1; + } + }, + + _switchToWorkspaceImmediate: function(workspaceIndex) { + let workspace = Utils.getWorkspaceByIndex(workspaceIndex); + let shouldAnimate = Main.wm._shouldAnimate; + + if (!workspace || (!workspace.list_windows().length && + workspaceIndex < Utils.getWorkspaceCount() - 1)) { + workspace = Utils.getCurrentWorkspace(); + } + + Main.wm._shouldAnimate = () => false; + workspace.activate(global.display.get_current_time_roundtrip()); + Main.wm._shouldAnimate = shouldAnimate; + }, + + _focusMetaWindow: function(dimOpacity, window, immediate, ignoreFocus) { + window.get_workspace().list_windows().forEach(mw => { + let wa = mw.get_compositor_private(); + let isFocused = !ignoreFocus && mw == window; + + if (wa) { + if (isFocused) { + mw[PEEK_INDEX_PROP] = wa.get_parent().get_children().indexOf(wa); + wa.get_parent().set_child_above_sibling(wa, null); + } + + if (isFocused && mw.minimized) { + wa.show(); + } + + if (!mw.minimized) { + let tweenOpts = getTweenOpts({ opacity: isFocused ? 255 : dimOpacity }); + + if (immediate && !mw.is_on_all_workspaces()) { + tweenOpts.time = 0; + } + + Utils.animateWindowOpacity(wa, tweenOpts); + } + } + }); + }, + + _restorePeekedWindowStack: function() { + let windowActor = this._peekedWindow ? this._peekedWindow.get_compositor_private() : null; + + if (windowActor) { + if (this._peekedWindow.hasOwnProperty(PEEK_INDEX_PROP)) { + windowActor.get_parent().set_child_at_index(windowActor, this._peekedWindow[PEEK_INDEX_PROP]); + delete this._peekedWindow[PEEK_INDEX_PROP]; + } + + if (this._peekedWindow.minimized) { + windowActor.hide(); + } + } + }, +}); + +var Preview = Utils.defineClass({ + Name: 'DashToPanel-Preview', + Extends: St.Widget, + + _init: function(previewMenu) { + this.callParent('_init', { + style_class: 'preview-container', + reactive: true, + track_hover: true, + layout_manager: new Clutter.BinLayout() + }); + + this.window = null; + this._waitWindowId = 0; + this._needsCloseButton = true; + this.cloneWidth = this.cloneHeight = 0; + this._previewMenu = previewMenu; + this._padding = Me.settings.get_int('window-preview-padding') * scaleFactor; + this._previewDimensions = this._getPreviewDimensions(); + this.animatingOut = false; + + let box = new St.Widget({ layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL }), y_expand: true }); + let [previewBinWidth, previewBinHeight] = this._getBinSize(); + let closeButton = new St.Button({ style_class: 'window-close', accessible_name: 'Close window' }); + + if (Config.PACKAGE_VERSION >= '3.31.9') { + closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); + } + + this._closeButtonBin = new St.Widget({ + style_class: 'preview-close-btn-container', + layout_manager: new Clutter.BinLayout(), + opacity: 0, + x_expand: true, y_expand: true, + x_align: Clutter.ActorAlign[isLeftButtons ? 'START' : 'END'], + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + + this._closeButtonBin.add_child(closeButton); + + this._previewBin = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + style: 'padding: ' + this._padding / scaleFactor + 'px;' + }); + + this._previewBin.set_size(previewBinWidth, previewBinHeight); + + box.add_child(this._previewBin); + + if (headerHeight) { + let headerBox = new St.Widget({ + style_class: 'preview-header-box', + layout_manager: new Clutter.BoxLayout(), + x_expand: true, + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + + setStyle(headerBox, this._getBackgroundColor(HEADER_COLOR_OFFSET, 1)); + this._workspaceIndicator = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); + this._windowTitle = new St.Label({ y_align: Clutter.ActorAlign.CENTER, x_expand: true }); + + this._iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._iconBin.set_size(headerHeight, headerHeight); + + headerBox.add_child(this._iconBin); + headerBox.insert_child_at_index(this._workspaceIndicator, isLeftButtons ? 0 : 1); + headerBox.insert_child_at_index(this._windowTitle, isLeftButtons ? 1 : 2); + + box.insert_child_at_index(headerBox, isTopHeader ? 0 : 1); + } + + this.add_child(box); + this.add_child(this._closeButtonBin); + + closeButton.connect('clicked', () => this._onCloseBtnClick()); + this.connect('notify::hover', () => this._onHoverChanged()); + this.connect('button-release-event', (actor, e) => this._onButtonReleaseEvent(e)); + this.connect('destroy', () => this._onDestroy()); + }, + + adjustOnStage: function() { + let closeButton = this._closeButtonBin.get_first_child(); + let closeButtonHeight = closeButton.height; + let maxCloseButtonSize = MAX_CLOSE_BUTTON_SIZE * scaleFactor; + let closeButtonBorderRadius = ''; + + if (closeButtonHeight > maxCloseButtonSize) { + closeButtonHeight = maxCloseButtonSize; + closeButton.set_size(closeButtonHeight, closeButtonHeight); + } + + if (!headerHeight) { + closeButtonBorderRadius = 'border-radius: '; + + if (isTopHeader) { + closeButtonBorderRadius += (isLeftButtons ? '0 0 4px 0;' : '0 0 0 4px;'); + } else { + closeButtonBorderRadius += (isLeftButtons ? '0 4px 0 0;' : '4px 0 0 0;'); + } + } + + setStyle( + this._closeButtonBin, + 'padding: ' + (headerHeight ? Math.round((headerHeight - closeButtonHeight) * .5 / scaleFactor) : 4) + 'px;' + + this._getBackgroundColor(HEADER_COLOR_OFFSET, headerHeight ? 1 : .6) + + closeButtonBorderRadius + ); + }, + + assignWindow: function(window, animateSize) { + if (this.window != window) { + let _assignWindowClone = () => { + if (window.get_compositor_private()) { + let cloneBin = this._getWindowCloneBin(window); + + this._resizeClone(cloneBin, window); + this._addClone(cloneBin, animateSize); + this._previewMenu.updatePosition(); + } else if (!this._waitWindowId) { + this._waitWindowId = Mainloop.idle_add(() => { + this._waitWindowId = 0; + + if (this._previewMenu.opened) { + _assignWindowClone(); + } + }); + } + }; + + _assignWindowClone(); + } + + this._cancelAnimateOut(); + this._removeWindowSignals(); + this.window = window; + this._needsCloseButton = window.can_close() && !Utils.checkIfWindowHasTransient(window); + this._updateHeader(); + }, + + animateOut: function() { + if (!this.animatingOut) { + let tweenOpts = getTweenOpts({ opacity: 0, width: 0, height: 0, onComplete: () => this.destroy() }); + + this.animatingOut = true; + + Utils.stopAnimations(this); + Utils.animate(this, tweenOpts); + } + }, + + getSize: function() { + let [binWidth, binHeight] = this._getBinSize(); + + binWidth = Math.max(binWidth, this.cloneWidth + this._padding * 2); + binHeight = Math.max(binHeight, this.cloneHeight + this._padding * 2) + headerHeight; + + return [binWidth, binHeight]; + }, + + setFocus: function(focused) { + this._hideOrShowCloseButton(!focused); + setStyle(this, this._getBackgroundColor(FOCUSED_COLOR_OFFSET, focused ? '-' : 0)); + + if (focused) { + this._previewMenu.ensureVisible(this); + this._previewMenu.requestPeek(this.window); + } + }, + + activate: function() { + this._previewMenu.endPeekHere(); + this._previewMenu.close(); + Main.activateWindow(this.window); + }, + + _onDestroy: function() { + if (this._waitWindowId) { + GLib.source_remove(this._waitWindowId); + this._waitWindowId = 0; + } + + this._removeWindowSignals(); + }, + + _onHoverChanged: function() { + this.setFocus(this.hover); + }, + + _onCloseBtnClick: function() { + this._hideOrShowCloseButton(true); + this.reactive = false; + + if (!Me.settings.get_boolean('group-apps')) { + this._previewMenu.close(); + } else { + this._previewMenu.endPeekHere(); + } + + this.window.delete(global.get_current_time()); + }, + + _onButtonReleaseEvent: function(e) { + switch (e.get_button()) { + case 1: // Left click + this.activate(); + break; + case 2: // Middle click + if (Me.settings.get_boolean('preview-middle-click-close')) { + this._onCloseBtnClick(); + } + break; + case 3: // Right click + this._showContextMenu(e); + break; + } + + return Clutter.EVENT_STOP; + }, + + _cancelAnimateOut: function() { + if (this.animatingOut) { + this.animatingOut = false; + + Utils.stopAnimations(this); + Utils.animate(this, getTweenOpts({ opacity: 255, width: this.cloneWidth, height: this.cloneHeight })); + } + }, + + _showContextMenu: function(e) { + let coords = e.get_coords(); + let currentWorkspace = this._previewMenu.peekInitialWorkspaceIndex < 0 ? + Utils.getCurrentWorkspace() : + Utils.getWorkspaceByIndex(this._previewMenu.peekInitialWorkspaceIndex); + + Main.wm._showWindowMenu(null, this.window, Meta.WindowMenuType.WM, { + x: coords[0], + y: coords[1], + width: 0, + height: 0 + }); + + let ctxMenuData = Main.wm._windowMenuManager._manager._menus[0]; + + ctxMenuData.menu.connect('open-state-changed', () => this._previewMenu.menu.sync_hover()); + + if (this.window.get_workspace() != currentWorkspace) { + let menuItem = new PopupMenu.PopupMenuItem(_('Move to current Workspace') + ' [' + (currentWorkspace.index() + 1) + ']'); + let menuItems = ctxMenuData.menu.box.get_children(); + let insertIndex = Utils.findIndex(menuItems, c => c._delegate instanceof PopupMenu.PopupSeparatorMenuItem); + + insertIndex = insertIndex >= 0 ? insertIndex : menuItems.length - 1; + ctxMenuData.menu.addMenuItem(menuItem, insertIndex); + menuItem.connect('activate', () => this.window.change_workspace(currentWorkspace)); + } + }, + + _removeWindowSignals: function() { + if (this._titleWindowChangeId) { + this.window.disconnect(this._titleWindowChangeId); + this._titleWindowChangeId = 0; + } + }, + + _updateHeader: function() { + if (headerHeight) { + let iconTextureSize = Me.settings.get_boolean('window-preview-use-custom-icon-size') ? + Me.settings.get_int('window-preview-custom-icon-size') : + headerHeight / scaleFactor * .6; + let icon = this._previewMenu.getCurrentAppIcon().app.create_icon_texture(iconTextureSize); + let workspaceIndex = ''; + let workspaceStyle = null; + let fontScale = Me.desktopSettings.get_double('text-scaling-factor'); + let commonTitleStyles = 'color: ' + Me.settings.get_string('window-preview-title-font-color') + ';' + + 'font-size: ' + Me.settings.get_int('window-preview-title-font-size') * fontScale + 'px;' + + 'font-weight: ' + Me.settings.get_string('window-preview-title-font-weight') + ';'; + + this._iconBin.destroy_all_children(); + this._iconBin.add_child(icon); + + if (!Me.settings.get_boolean('isolate-workspaces')) { + workspaceIndex = (this.window.get_workspace().index() + 1).toString(); + workspaceStyle = 'margin: 0 4px 0 ' + (isLeftButtons ? Math.round((headerHeight - icon.width) * .5) + 'px' : '0') + '; padding: 0 4px;' + + 'border: 2px solid ' + this._getRgbaColor(FOCUSED_COLOR_OFFSET, .8) + 'border-radius: 2px;' + commonTitleStyles; + } + + this._workspaceIndicator.text = workspaceIndex; + setStyle(this._workspaceIndicator, workspaceStyle); + + this._titleWindowChangeId = this.window.connect('notify::title', () => this._updateWindowTitle()); + setStyle(this._windowTitle, 'max-width: 0px; padding-right: 4px;' + commonTitleStyles); + this._updateWindowTitle(); + } + }, + + _updateWindowTitle: function() { + this._windowTitle.text = this.window.title; + }, + + _hideOrShowCloseButton: function(hide) { + if (this._needsCloseButton) { + Utils.animate(this._closeButtonBin, getTweenOpts({ opacity: hide ? 0 : 255 })); + } + }, + + _getBackgroundColor: function(offset, alpha) { + return 'background-color: ' + this._getRgbaColor(offset, alpha) + + 'transition-duration:' + this._previewMenu.panel.dynamicTransparency.animationDuration; + }, + + _getRgbaColor: function(offset, alpha) { + alpha = Math.abs(alpha); + + if (isNaN(alpha)) { + alpha = alphaBg; + } + + return Utils.getrgbaColor(this._previewMenu.panel.dynamicTransparency.backgroundColorRgb, alpha, offset); + }, + + _addClone: function(newCloneBin, animateSize) { + let currentClones = this._previewBin.get_children(); + let newCloneOpts = getTweenOpts({ opacity: 255 }); + + this._previewBin.add_child(newCloneBin); + + if (currentClones.length) { + let currentCloneBin = currentClones.pop(); + let currentCloneOpts = getTweenOpts({ opacity: 0, onComplete: () => currentCloneBin.destroy() }); + + if (newCloneBin.width > currentCloneBin.width) { + newCloneOpts.width = newCloneBin.width; + newCloneBin.width = currentCloneBin.width; + } else { + currentCloneOpts.width = newCloneBin.width; + } + + if (newCloneBin.height > currentCloneBin.height) { + newCloneOpts.height = newCloneBin.height; + newCloneBin.height = currentCloneBin.height; + } else { + currentCloneOpts.height = newCloneBin.height; + } + + currentClones.forEach(c => c.destroy()); + Utils.animate(currentCloneBin, currentCloneOpts); + } else if (animateSize) { + newCloneBin.width = 0; + newCloneBin.height = 0; + newCloneOpts.width = this.cloneWidth; + newCloneOpts.height = this.cloneHeight; + } + + Utils.animate(newCloneBin, newCloneOpts); + }, + + _getWindowCloneBin: function(window) { + let frameRect = window.get_frame_rect(); + let bufferRect = window.get_buffer_rect(); + let clone = new Clutter.Clone({ source: window.get_compositor_private() }); + let cloneBin = new St.Widget({ + opacity: 0, + layout_manager: frameRect.width != bufferRect.width || + frameRect.height != bufferRect.height ? + new WindowCloneLayout(frameRect, bufferRect) : + new Clutter.BinLayout() + }); + + cloneBin.add_child(clone); + + return cloneBin; + }, + + _getBinSize: function() { + let [fixedWidth, fixedHeight] = this._previewDimensions; + + return [ + aspectRatio.x.fixed ? fixedWidth + this._padding * 2 : -1, + aspectRatio.y.fixed ? fixedHeight + this._padding * 2 : -1 + ]; + }, + + _resizeClone: function(cloneBin, window) { + let frameRect = cloneBin.layout_manager.frameRect || window.get_frame_rect(); + let [fixedWidth, fixedHeight] = this._previewDimensions; + let ratio = Math.min(fixedWidth / frameRect.width, fixedHeight / frameRect.height, 1); + let cloneWidth = frameRect.width * ratio; + let cloneHeight = frameRect.height * ratio; + + let clonePaddingTB = cloneHeight < MIN_DIMENSION ? MIN_DIMENSION - cloneHeight : 0; + let clonePaddingLR = cloneWidth < MIN_DIMENSION ? MIN_DIMENSION - cloneWidth : 0; + let clonePaddingTop = clonePaddingTB * .5; + let clonePaddingLeft = clonePaddingLR * .5; + + this.cloneWidth = cloneWidth + clonePaddingLR * scaleFactor; + this.cloneHeight = cloneHeight + clonePaddingTB * scaleFactor; + + cloneBin.set_style('padding: ' + clonePaddingTop + 'px ' + clonePaddingLeft + 'px;'); + cloneBin.layout_manager.ratio = ratio; + cloneBin.layout_manager.padding = [clonePaddingLeft * scaleFactor, clonePaddingTop * scaleFactor]; + + cloneBin.get_first_child().set_size(cloneWidth, cloneHeight); + }, + + _getPreviewDimensions: function() { + let size = Me.settings.get_int('window-preview-size') * scaleFactor; + let w, h; + + if (this._previewMenu.isVertical) { + w = size; + h = w * aspectRatio.y.size / aspectRatio.x.size; + } else { + h = size; + w = h * aspectRatio.x.size / aspectRatio.y.size; + } + + return [w, h]; + } +}); + +var WindowCloneLayout = Utils.defineClass({ + Name: 'DashToPanel-WindowCloneLayout', + Extends: Clutter.BinLayout, + + _init: function(frameRect, bufferRect) { + this.callParent('_init'); + + //the buffer_rect contains the transparent padding that must be removed + this.frameRect = frameRect; + this.bufferRect = bufferRect; + }, + + vfunc_allocate: function(actor, box, flags) { + let [width, height] = box.get_size(); + + box.set_origin( + (this.bufferRect.x - this.frameRect.x) * this.ratio + this.padding[0], + (this.bufferRect.y - this.frameRect.y) * this.ratio + this.padding[1] + ); + + box.set_size( + width + (this.bufferRect.width - this.frameRect.width) * this.ratio, + height + (this.bufferRect.height - this.frameRect.height) * this.ratio + ); + + Utils.allocate(actor.get_first_child(), box, flags); + } +}); + +function setStyle(actor, style) { + if (!isManualStyling) { + actor.set_style(style); + } +} + +function getTweenOpts(opts) { + let defaults = { + time: animationTime, + transition: 'easeInOutQuad' + }; + + return Utils.mergeObjects(opts || {}, defaults); +} diff --git a/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js new file mode 100644 index 0000000..904c7de --- /dev/null +++ b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js @@ -0,0 +1,52 @@ +/* exported init */ + +const Self = imports.misc.extensionUtils.getCurrentExtension() +const extensionUtils = imports.misc.extensionUtils + +class Extension { + constructor() { + this.available_mods = Self.imports.src.modsList.get() + } + + _refresh_mod(name) { + if (!this.available_mods[name]) return + + if (this.settings.get_boolean(name)) { // enable + if (this.mods[name]) return + + const mod = new this.available_mods[name]() + mod.enable() + this.mods[name] = mod + } else if (this.mods[name]) { //disable + this.mods[name].disable() + delete this.mods[name] + } + } + + enable() { + this.mods = {} + + this.settings = extensionUtils.getSettings() + + Object.keys(this.available_mods).forEach(name => { + this.settings.connect('changed::' + name, () => { + this._refresh_mod(name) + }); + this._refresh_mod(name) + }) + } + + disable() { + for (const key in this.mods) { + if (!this.mods.hasOwnProperty(key)) continue; + this.mods[key].disable() + } + + delete this.mods + delete this.settings + } +} + +function init() { + return new Extension(); +} diff --git a/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..a042c9cd295117a7e68c37bb593807fd28372dae GIT binary patch literal 873 zcmZ`$O=}ZD7#_7+SUnXH5ry&QWnzn$lHy6*60jH~iWd))-AOWcI-hE~l(|YiQXPP6c zV9$ioG77WQ%RgpML_<1{J>*6p^oVQ23W|ri%F!W-gylLf3sw+(`;4EZTzOl$t@TsE zmCUmDAPS8Lp|M+oo)J6dZmr5?xJLa7SD5Vn)4~Q@J*{)SN7S)`hJCtjlyoI*;5O{olXM+8xYCQ;c95!1 ms6B!Vh8&}=g?Z<%@K<9Vm_G}yLgxdNCMb89Kb)It1o1!3ZEUOn literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..5791425ab7644103241c6b4235ed81d625a36eae GIT binary patch literal 519 zcmZvYK}rKL6o#W#H|~m97Yf0J1u=&xxUk@&*b}5Pug;@sGUTP5R=kEQFW@cQ3f{q$ zd)My#ryXep17E&`N%HYn*A$$0^Y$9_ylL*8?-@ZN2wls z3D@@>d=4+*EBG0{fZyN_`~}yeu3L{iu)kU1v_hP0Y z7vorx8ltqWLYzoxGm@^}#LzS+ud4!6Dkzd>(ZRbVCfZz4HwdeT>#+SMtj1gh5MCgFbaW8{3L0@r~QxCFcfqI?9d0H1(( z{{^@Pd<8B8KY#@wIm6gIcoDn+bbuGoU!9%VKY#`F&)~=4pWwUT-Z{puf)BxXGOYu| z=70ezK4MDemZYOU?82!x#7slB zQM4yYWvMj#Vywo@lJmy?<($d<_0XE23+BjsrH4+`rf{NC&a;6vJCu9TE5viMP8r?i z$>6Ejrbb0gJd~br^+Y-^QY*EqBr>%5ebPI!R+{%Wwz^v>UoEJ)SCf|7i|oYKD(yO6 z>S2&W5-G`g8fm7td1;e=ufK7cc)7KdJTTf5Vx$LSx}xTwBz9oiE?$BrnAy(qw0C z4Ga~^^E<7j)^fs96Lw6nj?1!C`G_p9$ni!EH71Eu0b~LHC+y$k_2jrFz8j=2xT?7R ze)#@?OI+X(GO^m$)m?30%UjYRLsQH~-1 Vr-VKRkNHTCg>igroKpzy*e}k37>@t| literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..0c2d2593dd146241df5a7d9cdba5902a61550203 GIT binary patch literal 918 zcma))QA<=o6vwBsg4>%|^iXggdzsCp7u(ecN<&auWQ$(Mz2okzcW0KFS#^7xdn1Ar zC5=cjOg9vzRdIuiK13fNdKtF0haP+H+`Ed21ReO@|2b#o%sB_{_s))&2<$v?1;_#y zfN3DIPrxN$4~X(#fy=-*pbPj7Tm_s{2z7#91MLFRz!1cl(+FJzT>`xcx(n)o{sQd< z9XW&0InY^9D2e9)K^;Jpj|`4tgOb?JMqlDjlB&Y0ASSUcR7#_qFkhhp^C(u7$Xo$2 zo|BX)`qw#D>@h`Rg31X-C-E4QbWBX)GAkoVl@{{Y#zLg>ARh zSa5qqm6V7_iWPoaRJ1R|c%oRo1!X*6A$f|kl$7FU+HuM)5@&dDxc{hYGSTha5nNLa zjjCm6s_B%zUiJy&X*X9O62|X)kR8B1NB5$E#;C;oJSRL@E#>x%GVNsiiX=WB5VE9F zE-%NS>Px2Gw%ga8b{^q-lvCN>CL^fFw0k4bok%*!hFdoLVuLLk?AdTJ_V=urPFhp5 z=9M+it=X{VNprc;oO@=?nhgRQe6-=R4QFgnv*D%`byInf~z9S`QUH zSfnR+L7~(t6^2@|1^X9x@edIHfSKvhyKi=dS|5Don>YC;FE9BuJhVzMP9hhO2675{ ziIlN}oJDq#^8XLy9P$%6gZxG=BF+&)hEXq}o=2*sVm@`0kkhD-QOo=(YU%6!%~RBJ zpYN!+q<;<+GK8Ec2N=f&LeSEWq}vwYq#(^j+0wv)IixrhvDivXAbuKhL<($~NZ z{4>vtcmhPtfSwUB%UVK1OU<#4=nxIYDt*Y@y==z3t-d>V9vN zUJp3LNp$VX%`nDZD!z(upkIaw4}mp+$Nlw#+@;gXnXFHaAJiVLj5xQHv>>sgj zmYx^s9xawPvfTx8*tEEr?WD9=?`7!%nHW3|_39qY(r&i>pF2;}Y-^9^pT87uUXkM2 T8r~$$KW^l&yC@&>cRlh4E6w&^ literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..f6570305c7504e2462b202bfd727cd44f7cfac07 GIT binary patch literal 827 zcmY+By>1gh5XTn?Aeo8?AtXTBKtU)r5JC~z81a!9ED>RW2?&W|d^h$jzS}+R?Ab}4 zftHFVNI?&EDmoqj@fNg*|Ji|r(f#hfAG13%J3ki}J}TH*a0T?iIq(70_61x7UqQY8 z9b5uGzypHV3iZHFcx++`Qn4t!HL~B4gscRX`=)k9G78BSJYGwB(#*QS`z7!M@Ye!xP$ydh2;S zp|M7@1{_B0)HXYb9FARwJv0aljf~IL?ccMAsvhDu fyTPS@vzo2wqY&y5OOn~~fC6hGSCRYCbQ;>%Nwf%^flffLq1J3&Yh9oxIT58U!qddM@%8dWZ^yVM z=NH{Dx4FJt@O0i#PG^;Clow=jqzjoqc}D&4yGHLS^0!p5rB%^g(Scg=x7`iBL4h)% zAN&el_A+a$fxlVEl2Ku(3#-Om_p`>$YZDS*NQvwGz>gd`{K_%6IO2v>xW=o z%RXXS+?F#rvDf%(!-eaJs~qF9DMyZ!;EA~nYQ(qPl6|Rs=ZFzfLJs((EN4kD-lLwB ziSJMjIT2%1*|JIQ20z>4fA?_ye-AfFL)9eLQ#wz&u5shc&(1rx0e-Qw*X+5<4UB_n wiGRLrq)jCem?Vk*V=r9)zo$zSz@ns##lB$Abq7Pn*nd+FxoOug$IvEy0VugsQvd(} literal 0 HcmV?d00001 diff --git a/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/UIDev/ansibleshed/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..74449f3cd24bb26e692580033a32f720c358e6d9 GIT binary patch literal 867 zcmZ{i&2AGh6om~Gkiv?pLP&t*?%IV5Et@K75QzRziHZn?iVcf9GoFbXj~)3s(}q1e zw(tZIj}VphyZ{e?Snv+)Ig?UK7hLI^W8blJjwk-HxbR7!Zi4%u4{m{vps7=E2Ydxh z{~NdqzJn$33p@a=D?%(nSD?$F172YM?y3;Cp>saKU0S~u<@=fTfJB6wXRGvQ`;0ZS}%#C>IZUc31Qmu zz=wjIeCDEe%-+eZa^6{^^Ul+v#KG56Up~QhSB$C9s;{ZU&mHU^>|7YGuRUr#_bzG& zkI4vrQJ=(zBTL40WICXLLw4Wvch%;_x+Y7mgW7Sa&+q}-ax*dUuTxuc)q1P;wA0}% zanI|_MEMwI;?OWj3W<(9!Eqe1ER8c1Cm}I5(?QnLN;~Q5X^@$YGNC{+H_ov{`+O&f z?RsX9B-gWHUQcb*QPiJ@BzZ{IA(W&F<6x@9hm0>

      + + + + +----- + +### Bugs + +Bugs should be reported [here](https://gitlab.com/arcmenu/ArcMenu/issues) on the GitLab issues page. + +When reporting a bug, please provide as much information as you can about the issue and make sure to include your Linux distribution, GNOME Shell version, and ArcMenu version. + +----- + +### Credits: + +**@[AndrewZaech](https://gitlab.com/AndrewZaech) - Current Project Maintainer and Developer** + +**@[AndyC](https://gitlab.com/LinxGem33) - Founder of ArcMenu and former project maintainer** + +**@[lexruee](https://github.com/lexruee) - Former UI/UX Designer | @[Thomas Ingvarsson](https://gitlab.com/tingvarsson) - Former Developer** + +Additional credits: +* The 'ArcMenu' layout design is insipired by the Zorin OS menu extension. +* ArcMenu utilizes various code from GNOME Shell and the GNOME Shell extensions package. +* Borrowed code from Dash-to-Dock's extension 'location.js' file to implement a trash shortcut in ArcMenu. + +----- + +### Contributors: + +#### Thanks to the following people for contributing via pull requests: + +**@[fishears](https://github.com/fishears/Arc-Menu)** | **@[JasonLG1979](https://github.com/JasonLG1979)** | **@[itmitica](https://github.com/itmitica)** | **@[vikaig](https://gitlab.com/vikaig)** | **@[MagneFire](https://gitlab.com/MagneFire)** + +**@[tognee](https://gitlab.com/tognee)** | **@[hlechner](https://gitlab.com/hlechner)** | **@[vanillajonathan](https://gitlab.com/vanillajonathan)** | **@[epskampie](https://gitlab.com/epskampie)** | **@[GnomeBook](https://gitlab.com/GnomeBook)** + +**@[charlesg99](https://github.com/charlesg99)** | **@[harshadgavali](https://gitlab.com/harshadgavali)** | **@[O. Giesmann ](https://gitlab.com/Etamuk)** | **@[aleayr ](https://gitlab.com/aleayr)** + + +#### Bug Fixes: + +**@[JasonLG1979](https://github.com/JasonLG1979)** | **@[lexruee](https://github.com/lexruee/Arc-Menu)** | **@[aleayr ](https://gitlab.com/aleayr)** + + +#### Translators: + +**@[Nilvus](https://gitlab.com/Nilvus) - French** | **@[Etamuk](https://gitlab.com/Etamuk) - German** | **@[alex4401](https://gitlab.com/alex4401) - Polish** | **@[frnogueira](https://gitlab.com/frnogueira), @[Z Bed](https://gitlab.com/zbed) - Brazilian Portuguese** | **@[sigbjokj](https://gitlab.com/sigbjokj), @[sssandum](https://gitlab.com/sssandum) - Norwegian** + + **@[Ivan](https://gitlab.com/vantu5z), @[Ser82-png](https://gitlab.com/Ser82-png) - Russian** | **@[gkkulik](https://gitlab.com/gkkulik) - Silesian** | **@[vikaig](https://gitlab.com/vikaig) - Ukrainian** | **@[jordim](https://gitlab.com/jordim) - Catalan** | **@[aylinux](https://gitlab.com/aylinux) - Turkish** + + +**@[MorganAntonsson](https://gitlab.com/MorganAntonsson) - Swedish** | **@[jiri.doubravsky](https://gitlab.com/jiri.doubravsky), @[panmourovaty ](https://gitlab.com/panmourovaty) - Czech** | **@[juanlucer](https://gitlab.com/juanlucer) - Spanish** | **@[plesry](https://gitlab.com/plesry) - Chinese (Taiwan)** | **@[Vombato](https://gitlab.com/Vombato), @[matguidi](https://gitlab.com/matguidi) - Italian** + +**@[skygmin](https://gitlab.com/skygmin) - Simplified Chinese** | **@[Vistaus](https://gitlab.com/Vistaus), @[vinno97](https://gitlab.com/vinno97) - Dutch** | **@[artnay](https://gitlab.com/artnay) - Finnish** | **@[rimasx](https://gitlab.com/rimasx) - Estonian** | **@[stevendobay](https://gitlab.com/stevendobay) - Hungarian** + +**@[omeritzics](https://gitlab.com/omeritzics) - Hebrew** | **@[prescott66](https://gitlab.com/prescott66) - Slovak** | **@[Mejans](https://gitlab.com/Mejans) - Occitan** | **@[KuroeHanako](https://gitlab.com/KuroeHanako) - Korean** | **@[sayuri](https://gitlab.com/sayuri-) - Sinhalese** + +**@[Latgardi](https://gitlab.com/Latgardi) - Belarusian** + +----- + +### License & Terms + +ArcMenu is available under the terms of the GPL-2.0 license See [`COPYING`](https://gitlab.com/arcmenu/ArcMenu/blob/master/COPYING) for details. + +Most of ArcMenu's image assets including, but not limited to, custom menu button icons, wire frame svgs, and custom settings icons, are created by [LinxGem33](https://gitlab.com/LinxGem33) and licensed under; [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) + +**Legal disclaimer for brand icons and trademarks:** + +*" All brand icons are trademarks of their respective owners. The use of these trademarks does not indicate endorsement of the trademark holder by ArcMenu project, nor vice versa. Please do not use brand logos for any purpose except to represent the company, product, or service to which they refer. "* + +

      +Read More... + +

      + +* **UBUNTU ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Ubuntu name and Ubuntu logo is a trademark of Canonical ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Ltd. + +* **FEDORA ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Fedora and the Infinity design logo are trademarks of Red Hat, Inc. + +* **DEBIAN ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - is a registered trademark owned by Software in the Public Interest, Inc. Debian trademark is a registered United States trademark of Software in the Public Interest, Inc., managed by the Debian project. + +* **MANJARO ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - (logo) and name is a trademark of Manjaro GmbH & Co. KG + +* **POP_OS! ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - Name and (logo) is a trademark of system 76 ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Inc. + +* **ARCH LINUX ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** - The stylized Arch Linux logo are recognised trademarks of Arch Linux, copyright 2002-2017 Judd Vinet and Aaron Griffin + +* **SOLUS** - name and logo is Copyright ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) 2014-2018 by Solus Project + +* **KALI LINUX** - logo and name is part of ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) OffSec Services Limited 2020 + +* **PUREOS** - name and logo is developed by members of the Purism community + +* **RASPBERRY PI** ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) - Logo and name is part of Raspberry Pi Foundation +UK Registered Charity 1129409 + +* **Gentoo Authors![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** 2001–2020 +Gentoo is a trademark of the Gentoo Foundation, Inc. + +* **Voyager ![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg) Linux** +(name) and (logo) + +* **MXLinux![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** 2020 - +Linux - is the registered trademark of Linus Torvalds in the U.S. and other countries. + +* **Red Hat, Inc.![](https://gitlab.com/arcmenu/arcmenu-assets/raw/master/images/copyright2.svg)** Copyright 2020 +(name) and (logo) + +* **ZORIN OS** - The "Z" logomark is a registered trademark of Zorin Technology Group Ltd. Copyright © 2019 - 2021 Zorin Technology Group Ltd + +

      +
      + +----- diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/constants.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/constants.js new file mode 100644 index 0000000..082cb4b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/constants.js @@ -0,0 +1,460 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +var SearchbarLocation = { + BOTTOM: 0, + TOP: 1 +} + +var MenuItemLocation = { + BOTTOM: 0, + TOP: 1 +} + +var DisplayType = { + LIST: 0, + GRID: 1, + BUTTON: 2, + SIMPLE_CATEGORY: 3, + SUBMENU_CATEGORY: 4, +} + +var CategoryType = { + FAVORITES: 0, + FREQUENT_APPS: 1, + ALL_PROGRAMS: 2, + PINNED_APPS: 3, + RECENT_FILES: 4, + HOME_SCREEN: 5, + SEARCH_RESULTS: 6, + CATEGORIES_LIST: 7, +}; + +var DefaultMenuView = { + PINNED_APPS: 0, + CATEGORIES_LIST: 1, + FREQUENT_APPS: 2, + ALL_PROGRAMS: 3 +} + +var PrefsVisiblePage = { + MAIN: 0, + MENU_LAYOUT: 1, + BUTTON_APPEARANCE: 2, + LAYOUT_TWEAKS: 3, + ABOUT: 4, + CUSTOMIZE_MENU: 5, + RUNNER_TWEAKS: 6 +} + +var DefaultMenuViewTognee = { + CATEGORIES_LIST: 0, + ALL_PROGRAMS: 1 +} + +var SoftwareManagerIDs = ['org.manjaro.pamac.manager.desktop', 'pamac-manager.desktop', 'io.elementary.appcenter.desktop', + 'snap-store_ubuntu-software.desktop', 'snap-store_snap-store.desktop', 'org.gnome.Software.desktop']; + +var Categories = [ + {CATEGORY: CategoryType.FAVORITES, NAME: _("Favorites"), ICON: 'emblem-favorite-symbolic', FULL_COLOR_ICON: 'emblem-favorite'}, + {CATEGORY: CategoryType.FREQUENT_APPS, NAME: _("Frequent Apps"), ICON: 'user-bookmarks-symbolic', FULL_COLOR_ICON: 'user-bookmarks'}, + {CATEGORY: CategoryType.ALL_PROGRAMS, NAME: _("All Apps"), ICON: 'view-grid-symbolic', FULL_COLOR_ICON: 'view-grid-symbolic'}, + {CATEGORY: CategoryType.PINNED_APPS, NAME: _("Pinned Apps"), ICON: 'view-pin-symbolic', FULL_COLOR_ICON: 'view-pin-symbolic'}, + {CATEGORY: CategoryType.RECENT_FILES, NAME: _("Recent Files"), ICON: 'document-open-recent-symbolic', FULL_COLOR_ICON: 'document-open-recent'} +] + +var ArcMenuPlacement = { + PANEL: 0, + DTP: 1, + DASH: 2 +}; + +var TooltipLocation = { + TOP_CENTERED: 0, + BOTTOM_CENTERED: 1, + BOTTOM: 2, +}; + +var SeparatorAlignment = { + VERTICAL: 0, + HORIZONTAL: 1 +}; + +var SeparatorStyle = { + SHORT: 0, + MEDIUM: 1, + LONG: 2, + MAX: 3, + HEADER_LABEL: 4, + NORMAL: 5, + ALWAYS_SHOW: 6, +}; + +var CaretPosition = { + END: -1, + START: 0, + MIDDLE: 2, +}; + +var CategoryIconType = { + FULL_COLOR: 0, + SYMBOLIC: 1, +} + +var ForcedMenuLocation = { + OFF: 0, + TOP_CENTERED: 1, + BOTTOM_CENTERED: 2, +} + +var IconSize = { + DEFAULT: 0, + EXTRA_SMALL: 1, + SMALL: 2, + MEDIUM: 3, + LARGE: 4, + EXTRA_LARGE: 5, +} + +var GridIconSize = { + DEFAULT: 0, + SMALL: 1, + MEDIUM: 2, + LARGE: 3, + SMALL_RECT: 4, + MEDIUM_RECT: 5, + LARGE_RECT: 6, +}; + +var GridIconInfo = [ + { NAME: 'SmallIconGrid', SIZE: 90, ICON_SIZE: 36, ENUM: GridIconSize.SMALL }, + { NAME: 'MediumIconGrid', SIZE: 97, ICON_SIZE: 42, ENUM: GridIconSize.MEDIUM }, + { NAME: "LargeIconGrid", SIZE: 105, ICON_SIZE: 52, ENUM: GridIconSize.LARGE }, + { NAME: 'SmallRectIconGrid', SIZE: 95, ICON_SIZE: 28, ENUM: GridIconSize.SMALL_RECT }, + { NAME: 'MediumRectIconGrid', SIZE: 102, ICON_SIZE: 34, ENUM: GridIconSize.MEDIUM_RECT }, + { NAME: 'LargeRectIconGrid', SIZE: 105, ICON_SIZE: 42, ENUM: GridIconSize.LARGE_RECT }, +] + +var EXTRA_SMALL_ICON_SIZE = 16; +var SMALL_ICON_SIZE = 20; +var MEDIUM_ICON_SIZE = 25; +var LARGE_ICON_SIZE = 30; +var EXTRA_LARGE_ICON_SIZE = 35; +var MISC_ICON_SIZE = 24; + +var SUPER_L = 'Super_L'; +var SUPER_R = 'Super_R'; +var EMPTY_STRING = ''; + +var HotKey = { + UNDEFINED: 0, + SUPER_L: 1, + CUSTOM: 2, + // Inverse mapping + 0: EMPTY_STRING, + 1: SUPER_L, +}; + +var RunnerHotKey = { + SUPER_L: 0, + CUSTOM: 1, + 0: SUPER_L, +}; + +var HotCornerAction = { + DEFAULT: 0, + DISABLED: 1, + TOGGLE_ARCMENU: 2, + CUSTOM: 3 +} + +var SECTIONS = [ + 'devices', + 'network', + 'bookmarks', +]; + +var MenuPosition = { + LEFT: 0, + CENTER: 1, + RIGHT: 2 +}; + +var RavenPosition = { + LEFT: 0, + RIGHT: 1 +}; + +var DiaglogType = { + DEFAULT: 0, + OTHER: 1, + APPLICATIONS: 2, + DIRECTORIES: 3 +}; + +var MenuButtonAppearance = { + ICON: 0, + TEXT: 1, + ICON_TEXT: 2, + TEXT_ICON: 3, + NONE: 4 +}; + +var MenuIcon = { + ARC_MENU: 0, + DISTRO_ICON: 1, + CUSTOM: 2 +}; + +var PowerType = { + LOGOUT: 0, + LOCK: 1, + RESTART: 2, + POWER_OFF: 3, + SUSPEND: 4, + HYBRID_SLEEP: 5, + HIBERNATE: 6, +}; + +var SleepIcon = { + PATH: '/media/icons/menu_icons/sleep-symbolic.svg' +}; + +var PowerOptions = [ + { TYPE: PowerType.LOGOUT, IMAGE: 'application-exit-symbolic', TITLE: _("Log Out") }, + { TYPE: PowerType.LOCK, IMAGE: 'changes-prevent-symbolic', TITLE: _("Lock") }, + { TYPE: PowerType.RESTART, IMAGE: 'system-reboot-symbolic', TITLE: _("Restart") }, + { TYPE: PowerType.POWER_OFF, IMAGE: 'system-shutdown-symbolic', TITLE: _("Power Off") }, + { TYPE: PowerType.SUSPEND, IMAGE: 'media-playback-pause-symbolic', TITLE: _("Suspend") }, + { TYPE: PowerType.HYBRID_SLEEP, IMAGE: Me.path + SleepIcon.PATH, TITLE: _("Hybrid Sleep") }, + { TYPE: PowerType.HIBERNATE, IMAGE: 'document-save-symbolic', TITLE: _("Hibernate") }, +]; + +var MenuIcons = [ + { PATH: '/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/curved-a-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/focus-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/whirl-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/sums-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/arrow-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/lins-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/search-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/transform-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/3d-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/alien-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/cloud-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dragon-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/fly-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pacman-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/peaks-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pie-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pointer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/toxic-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/tree-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/zegon-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/apps-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/bug-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/cita-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/eclipse-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/football-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/heddy-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/helmet-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/palette-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/peeks-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/record-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/saucer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/step-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/vancer-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/vibe-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/start-box-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dolphin-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dota-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/football2-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/loveheart-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/rewind-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/snap-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/time-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/3D-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/a-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/bat-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/dra-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/equal-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/gnacs-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/groove-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/kaaet-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/launcher-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/pac-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/robots-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/sheild-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/somnia-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/utool-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/swirl-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/icons/round-symbolic.svg'}, +] + +var DistroIcons = [ + { PATH: 'start-here-symbolic'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg'}, + { PATH: '/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg'}, +] + +var MenuLayout = { + ARCMENU: 0, + BRISK: 1, + WHISKER: 2, + GNOME_MENU: 3, + MINT: 4, + ELEMENTARY: 5, + GNOME_OVERVIEW: 6, + SIMPLE: 7, + SIMPLE_2: 8, + REDMOND: 9, + UNITY: 10, + BUDGIE: 11, + INSIDER: 12, + RUNNER: 13, + CHROMEBOOK: 14, + RAVEN: 15, + TOGNEE: 16, + PLASMA: 17, + WINDOWS: 18, + LAUNCHER: 19, + ELEVEN: 20, + AZ: 21, +}; + +var TraditionalMenus = [ + { IMAGE: 'arcmenu-layout-symbolic', TITLE: _('ArcMenu'), LAYOUT: MenuLayout.ARCMENU}, + { IMAGE: 'brisk-layout-symbolic', TITLE: _('Brisk'), LAYOUT: MenuLayout.BRISK}, + { IMAGE: 'whisker-layout-symbolic', TITLE: _('Whisker'), LAYOUT: MenuLayout.WHISKER}, + { IMAGE: 'gnomemenu-layout-symbolic', TITLE: _('GNOME Menu'), LAYOUT: MenuLayout.GNOME_MENU}, + { IMAGE: 'mint-layout-symbolic', TITLE: _('Mint'), LAYOUT: MenuLayout.MINT}, + { IMAGE: 'budgie-layout-symbolic', TITLE: _('Budgie'), LAYOUT: MenuLayout.BUDGIE}]; + +var ModernMenus = [ + { IMAGE: 'unity-layout-symbolic', TITLE: _('Unity'), LAYOUT: MenuLayout.UNITY}, + { IMAGE: 'plasma-layout-symbolic', TITLE: _('Plasma'), LAYOUT: MenuLayout.PLASMA}, + { IMAGE: 'tognee-layout-symbolic', TITLE: _('tognee'), LAYOUT: MenuLayout.TOGNEE}, + { IMAGE: 'insider-layout-symbolic', TITLE: _('Insider'), LAYOUT: MenuLayout.INSIDER}, + { IMAGE: 'redmond-layout-symbolic', TITLE: _('Redmond'), LAYOUT: MenuLayout.REDMOND}, + { IMAGE: 'windows-layout-symbolic', TITLE: _('Windows'), LAYOUT: MenuLayout.WINDOWS}, + { IMAGE: 'eleven-layout-symbolic', TITLE: _('11'), LAYOUT: MenuLayout.ELEVEN}, + { IMAGE: 'az-layout-symbolic', TITLE: _('a.z.'), LAYOUT: MenuLayout.AZ}]; + +var TouchMenus = [ + { IMAGE: 'elementary-layout-symbolic', TITLE: _('Elementary'), LAYOUT: MenuLayout.ELEMENTARY}, + { IMAGE: 'chromebook-layout-symbolic', TITLE: _('Chromebook'), LAYOUT: MenuLayout.CHROMEBOOK}]; + +var LauncherMenus = [ + { IMAGE: 'launcher-layout-symbolic', TITLE: _('Launcher'), LAYOUT: MenuLayout.LAUNCHER}, + { IMAGE: 'runner-layout-symbolic', TITLE: _('Runner'), LAYOUT: MenuLayout.RUNNER}, + { IMAGE: 'gnomeoverview-layout-symbolic', TITLE: _('GNOME Overview'), LAYOUT: MenuLayout.GNOME_OVERVIEW}]; + +var SimpleMenus = [ + { IMAGE: 'simple-layout-symbolic', TITLE: _('Simple'), LAYOUT: MenuLayout.SIMPLE}, + { IMAGE: 'simple2-layout-symbolic', TITLE: _('Simple 2'), LAYOUT: MenuLayout.SIMPLE_2}]; + +var AlternativeMenus = [ + { IMAGE: 'raven-layout-symbolic', TITLE: _('Raven'), LAYOUT: MenuLayout.RAVEN}]; + +var MenuStyles = { + STYLES: [ + { IMAGE: 'traditional-category-symbolic', TITLE: _("Traditional"), MENU_TYPE: TraditionalMenus }, + { IMAGE: 'modern-category-symbolic', TITLE: _("Modern"), MENU_TYPE: ModernMenus }, + { IMAGE: 'touch-category-symbolic', TITLE: _("Touch"), MENU_TYPE: TouchMenus }, + { IMAGE: 'simple-category-symbolic', TITLE: _("Simple"), MENU_TYPE: SimpleMenus }, + { IMAGE: 'launcher-category-symbolic', TITLE: _("Launcher"), MENU_TYPE: LauncherMenus }, + { IMAGE: 'alternative-category-symbolic', TITLE: _("Alternative"), MENU_TYPE: AlternativeMenus } + ] +}; + +var ArcMenuSettingsCommand = 'gnome-extensions prefs arcmenu@arcmenu.com'; + +var HamburgerIcon = { + PATH: '/media/icons/menu_icons/hamburger-symbolic.svg' +}; + +var DistroIconsDisclaimer = '"All brand icons are trademarks of their respective owners. The use of these trademarks does not indicate endorsement of the trademark holder by ArcMenu project, nor vice versa. Please do not use brand logos for any purpose except to represent the company, product, or service to which they refer."'+ + '\n\n• Ubuntu® - Ubuntu name and Ubuntu logo are trademarks of Canonical© Ltd.'+ + '\n\n• Fedora® - Fedora and the Infinity design logo are trademarks of Red Hat, Inc.'+ + '\n\n• Debian® - is a registered trademark owned by Software in the Public Interest, Inc. Debian trademark is a registered United States trademark of Software in the Public Interest, Inc., managed by the Debian project.'+ + '\n\n• Manjaro® - logo and name are trademarks of Manjaro GmbH & Co. KG'+ + '\n\n• Pop_OS!® - logo and name are trademarks of system 76© Inc.'+ + '\n\n• Arch Linux™ - The stylized Arch Linux logo is a recognized trademark of Arch Linux, copyright 2002–2017 Judd Vinet and Aaron Griffin.'+ + '\n\n• openSUSE® - logo and name 2001–2020 SUSE LLC, © 2005–2020 openSUSE Contributors & others.'+ + '\n\n• Raspberry Pi® - logo and name are part of Raspberry Pi Foundation UK Registered Charity 1129409'+ + '\n\n• Kali Linux™ - logo and name are part of © OffSec Services Limited 2020'+ + '\n\n• PureOS - logo and name are developed by members of the Purism community'+ + '\n\n• Solus - logo and name are copyright © 2014–2018 by Solus Project'+ + '\n\n• Gentoo Authors© - 2001–2020 Gentoo is a trademark of the Gentoo Foundation, Inc.'+ + '\n\n• Voyager© Linux - name and logo'+ + '\n\n• MX Linux© - 2020 - Linux - is the registered trademark of Linus Torvalds in the U.S. and other countries.'+ + '\n\n• Red Hat, Inc.© - Copyright 2020 name and logo' + + '\n\n• ZORIN OS - The "Z" logomark is a registered trademark of Zorin Technology Group Ltd. Copyright © 2019 - 2021 Zorin Technology Group Ltd'; + +var DEVELOPERS = 'Andrew Zaech @AndrewZaech\nLead Project Developer and Maintainer\t' + + '\n\nLinxGem33 aka Andy C @LinxGem33 - (Inactive)\nArcMenu Founder - Former Maintainer - Former Digital Art Designer'; +var TRANSLATORS = 'Thank you to all translators!\n\n' + + 'For a list of all translators please visit ArcMenu on GitLab'; +var CONTRIBUTORS = 'Thank you to all who contributed to, and/or helped, the developement of ArcMenu!' + +'\n\nFor a list of all contributors please visit ArcMenu on GitLab'; +var ARTWORK = 'LinxGem33 aka Andy C\nWiki Screens, Icons, Wire-Frames, ArcMenu Assets' + + '\n\nAndrew Zaech\nIcons, Wire-Frames'; + +var GNU_SOFTWARE = '' + + 'This program comes with absolutely no warranty.\n' + + 'See the ' + + 'GNU General Public License, version 2 or later for details.' + + ''; diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/controller.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/controller.js new file mode 100644 index 0000000..7c35a80 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/controller.js @@ -0,0 +1,749 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Gio, GLib, Gtk, St} = imports.gi; +const Constants = Me.imports.constants; +const Helper = Me.imports.helper; +const Main = imports.ui.main; +const MenuButton = Me.imports.menuButton; +const {StandaloneRunner} = Me.imports.standaloneRunner; +const Utils = Me.imports.utils; + +var MenuSettingsController = class { + constructor(settings, settingsControllers, panel, panelIndex, arcMenuPlacement) { + this._settings = settings; + if(this._settings.get_boolean('reload-theme')) + this._settings.reset('reload-theme'); + this.panel = panel; + this.arcMenuPlacement = arcMenuPlacement; + + global.toggleArcMenu = () => this.toggleMenus(); + + this.currentMonitorIndex = 0; + this._activitiesButton = Main.panel.statusArea.activities; + this.isPrimary = panelIndex === 0 ? true : false; + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL) { + this._menuButton = new MenuButton.MenuButton(settings, this.arcMenuPlacement, panel); + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) { + this._menuButton = new MenuButton.MenuButton(settings, this.arcMenuPlacement, panel, panelIndex); + this.menuButtonAdjustedActor = this._menuButton.container; + } + + this._settingsControllers = settingsControllers + + if(this.isPrimary){ + this._menuHotKeybinder = new Helper.MenuHotKeybinder(); + this._keybindingManager = new Helper.KeybindingManager(this._settings); + this._hotCornerManager = new Helper.HotCornerManager(this._settings,() => this.toggleMenus()); + } + this._applySettings(); + } + + // Load and apply the settings from the arc-menu settings + _applySettings() { + if(this.isPrimary){ + this._updateHotCornerManager(); + this._updateHotKeyBinder(); + } + + this._setButtonAppearance(); + this._setButtonText(); + this._setButtonIcon(); + this._setButtonIconSize(); + this._setButtonIconPadding(); + this._configureActivitiesButton(); + } + // Bind the callbacks for handling the settings changes to the event signals + bindSettingsChanges() { + this.settingsChangeIds = [ + this._settings.connect('changed::hot-corners', this._updateHotCornerManager.bind(this)), + this._settings.connect('changed::menu-hotkey', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::runner-menu-hotkey', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::enable-standlone-runner-menu', this._updateHotKeyBinder.bind(this)), + this._settings.connect('changed::position-in-panel', this._setButtonPosition.bind(this)), + this._settings.connect('changed::menu-button-position-offset', this._setButtonPosition.bind(this)), + this._settings.connect('changed::menu-position-alignment', this._setMenuPositionAlignment.bind(this)), + this._settings.connect('changed::menu-button-appearance', this._setButtonAppearance.bind(this)), + this._settings.connect('changed::custom-menu-button-text', this._setButtonText.bind(this)), + this._settings.connect('changed::menu-button-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::distro-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::arc-menu-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::custom-menu-button-icon', this._setButtonIcon.bind(this)), + this._settings.connect('changed::custom-menu-button-icon-size', this._setButtonIconSize.bind(this)), + this._settings.connect('changed::button-padding', this._setButtonIconPadding.bind(this)), + this._settings.connect('changed::enable-menu-button-arrow', this._setMenuButtonArrow.bind(this)), + this._settings.connect('changed::enable-custom-arc-menu', this._updateStyle.bind(this)), + this._settings.connect('changed::remove-menu-arrow', this._updateStyle.bind(this)), + this._settings.connect('changed::disable-searchbox-border', this._updateStyle.bind(this)), + this._settings.connect('changed::indicator-color', this._updateStyle.bind(this)), + this._settings.connect('changed::indicator-text-color', this._updateStyle.bind(this)), + this._settings.connect('changed::directory-shortcuts-list', this._reload.bind(this)), + this._settings.connect('changed::application-shortcuts-list', this._reload.bind(this)), + this._settings.connect('changed::disable-recently-installed-apps', this._initiateRecentlyInstalledApps.bind(this)), + this._settings.connect('changed::extra-categories', this._reload.bind(this)), + this._settings.connect('changed::power-options', this._reload.bind(this)), + this._settings.connect('changed::show-external-devices', this._reload.bind(this)), + this._settings.connect('changed::show-bookmarks', this._reload.bind(this)), + this._settings.connect('changed::disable-user-avatar', this._reload.bind(this)), + this._settings.connect('changed::enable-activities-shortcut', this._reload.bind(this)), + this._settings.connect('changed::enable-horizontal-flip', this._reload.bind(this)), + this._settings.connect('changed::searchbar-default-bottom-location', this._reload.bind(this)), + this._settings.connect('changed::searchbar-default-top-location', this._plasmaMenuReloadTheme.bind(this)), + this._settings.connect('changed::searchbar-default-top-location', this._reload.bind(this)), + this._settings.connect('changed::multi-lined-labels', this._reload.bind(this)), + this._settings.connect('changed::apps-show-extra-details', this._reload.bind(this)), + this._settings.connect('changed::show-search-result-details', this._reload.bind(this)), + this._settings.connect('changed::search-provider-open-windows', this._reload.bind(this)), + this._settings.connect('changed::search-provider-recent-files', this._reload.bind(this)), + this._settings.connect('changed::disable-scrollview-fade-effect', this._reload.bind(this)), + this._settings.connect('changed::menu-height', this._updateMenuHeight.bind(this)), + this._settings.connect('changed::menu-width-adjustment', this._updateMenuHeight.bind(this)), + this._settings.connect('changed::reload-theme', this._reloadTheme.bind(this)), + this._settings.connect('changed::pinned-app-list',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-weather-widget-unity',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-clock-widget-unity',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-weather-widget-raven',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::enable-clock-widget-raven',this._updatePinnedApps.bind(this)), + this._settings.connect('changed::brisk-shortcuts-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::mint-pinned-app-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::mint-separator-index',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::unity-pinned-app-list',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::unity-separator-index',this._updateExtraPinnedApps.bind(this)), + this._settings.connect('changed::windows-disable-frequent-apps', this._reload.bind(this)), + this._settings.connect('changed::windows-disable-pinned-apps', this._reload.bind(this)), + this._settings.connect('changed::default-menu-view', this._reload.bind(this)), + this._settings.connect('changed::default-menu-view-tognee',this._reload.bind(this)), + this._settings.connect('changed::alphabetize-all-programs',this._reload.bind(this)), + this._settings.connect('changed::enable-unity-homescreen',this._setDefaultMenuView.bind(this)), + this._settings.connect('changed::menu-layout', this._updateMenuLayout.bind(this)), + this._settings.connect('changed::menu-item-grid-icon-size', this._reload.bind(this)), + this._settings.connect('changed::menu-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::button-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::quicklinks-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::misc-item-icon-size', this._reload.bind(this)), + this._settings.connect('changed::runner-position', this.updateLocation.bind(this)), + this._settings.connect('changed::runner-show-frequent-apps', this._reload.bind(this)), + this._settings.connect('changed::enable-sub-menus', this._reload.bind(this)), + this._settings.connect('changed::show-activities-button', this._configureActivitiesButton.bind(this)), + this._settings.connect('changed::force-menu-location', this._forceMenuLocation.bind(this)), + this._settings.connect('changed::category-icon-type', this._reload.bind(this)), + this._settings.connect('changed::shortcut-icon-type', this._reload.bind(this)), + this._settings.connect('changed::arcmenu-extra-categories-links', this._reload.bind(this)), + this._settings.connect('changed::arcmenu-extra-categories-links-location', this._reload.bind(this)), + ]; + } + + _reload(){ + this._menuButton.reload(); + if(this.runnerMenu) + this.runnerMenu.reload(); + } + + _forceMenuLocation(){ + this._menuButton.forceMenuLocation(); + } + + _initiateRecentlyInstalledApps(){ + this._menuButton.initiateRecentlyInstalledApps(); + this._menuButton.reload(); + if(this.runnerMenu){ + this.runnerMenu.initiateRecentlyInstalledApps(); + this.runnerMenu.reload(); + } + } + + _plasmaMenuReloadTheme(){ + if(this._settings.get_enum('menu-layout') === Constants.MenuLayout.PLASMA){ + if(this._settings.get_boolean('reload-theme')) + this._settings.reset('reload-theme'); + this._settings.set_boolean('reload-theme', true); + } + } + + updateLocation(){ + this._menuButton.updateLocation(); + if(this.runnerMenu) + this.runnerMenu.updateLocation(); + } + + _updateMenuLayout(){ + this._menuButton.updateMenuLayout(); + } + + _setDefaultMenuView(){ + this._menuButton.setDefaultMenuView(); + } + + toggleStandaloneRunner(){ + this._closeAllArcMenus(); + if(this.runnerMenu) + this.runnerMenu.toggleMenu(); + } + + toggleMenus(){ + if(this.runnerMenu && this.runnerMenu.arcMenu.isOpen) + this.runnerMenu.toggleMenu(); + if(global.dashToPanel || this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + const MultipleArcMenus = this._settingsControllers.length > 1; + const ShowArcMenuOnPrimaryMonitor = this._settings.get_boolean('hotkey-open-primary-monitor'); + if(MultipleArcMenus && ShowArcMenuOnPrimaryMonitor) + this._toggleMenuOnMonitor(Main.layoutManager.primaryMonitor); + else if(MultipleArcMenus && !ShowArcMenuOnPrimaryMonitor) + this._toggleMenuOnMonitor(Main.layoutManager.currentMonitor); + else + this._menuButton.toggleMenu(); + } + else + this._menuButton.toggleMenu(); + } + + _toggleMenuOnMonitor(monitor){ + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + let monitorIndex = this._settingsControllers[i].monitorIndex; + if(monitor.index === monitorIndex) + this.currentMonitorIndex = i; + else{ + if(menuButton.arcMenu.isOpen) + menuButton.toggleMenu(); + if(menuButton.arcMenuContextMenu.isOpen) + menuButton.toggleArcMenuContextMenu(); + } + } + //open the current monitors menu + this._settingsControllers[this.currentMonitorIndex]._menuButton.toggleMenu(); + } + + _closeAllArcMenus(){ + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + if(menuButton.arcMenu.isOpen) + menuButton.toggleMenu(); + if(menuButton.arcMenuContextMenu.isOpen) + menuButton.toggleArcMenuContextMenu(); + } + } + + _reloadTheme(){ + if(this.isPrimary && this._settings.get_boolean('reload-theme')) { + this._settings.reset('reload-theme'); + + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + Utils.createStylesheet(this._settings); + let stylesheet = Utils.getStylesheet(); + if(Me.stylesheet) + theme.unload_stylesheet(Me.stylesheet); + Me.stylesheet = stylesheet; + theme.load_stylesheet(Me.stylesheet); + + for (let i = 0; i < this._settingsControllers.length; i++) { + let menuButton = this._settingsControllers[i]._menuButton; + menuButton.updateStyle(); + } + if(this.runnerMenu) + this.runnerMenu.updateStyle(); + } + } + + _updateStyle() { + this._menuButton.updateStyle(); + if(this.runnerMenu) + this.runnerMenu.updateStyle(); + } + + _updateMenuHeight(){ + this._menuButton.updateHeight(); + } + + _updatePinnedApps(){ + if(this._menuButton.shouldLoadPinnedApps()) + this._menuButton.loadPinnedApps(); + + //If the active category is Pinned Apps, redisplay the new Pinned Apps + const activeCategory = this._menuButton.MenuLayout?.activeCategoryType; + if(!activeCategory) + return; + if(activeCategory === Constants.CategoryType.PINNED_APPS || activeCategory === Constants.CategoryType.HOME_SCREEN) + this._menuButton.displayPinnedApps(); + } + + _updateExtraPinnedApps(){ + let layout = this._settings.get_enum('menu-layout'); + if(layout == Constants.MenuLayout.UNITY || layout == Constants.MenuLayout.MINT || layout == Constants.MenuLayout.BRISK){ + if(this._menuButton.shouldLoadPinnedApps()) + this._menuButton.loadExtraPinnedApps(); + } + } + + _updateHotCornerManager() { + if (this.isPrimary) { + let hotCornerAction = this._settings.get_enum('hot-corners'); + if (hotCornerAction === Constants.HotCornerAction.DEFAULT) { + this._hotCornerManager.restoreDefaultHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.DISABLED) { + this._hotCornerManager.disableHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.TOGGLE_ARCMENU) { + this._hotCornerManager.modifyHotCorners(); + } + else if(hotCornerAction === Constants.HotCornerAction.CUSTOM) { + this._hotCornerManager.modifyHotCorners(); + } + } + } + + _updateHotKeyBinder() { + if (this.isPrimary) { + const RunnerHotKey = this._settings.get_enum('runner-menu-hotkey'); + const HotKey = this._settings.get_enum('menu-hotkey'); + const EnableStandaloneRunnerMenu = this._settings.get_boolean('enable-standlone-runner-menu'); + + this._keybindingManager.unbind('ToggleArcMenu'); + this._keybindingManager.unbind('ToggleRunnerMenu'); + this._menuHotKeybinder.disableHotKey(); + this._menuKeyBindingKey = null; + this._runnerKeyBindingKey = null; + + if(EnableStandaloneRunnerMenu){ + if(!this.runnerMenu){ + this.runnerMenu = new StandaloneRunner(this._settings); + this.runnerMenu.initiate(); + } + + if(RunnerHotKey === Constants.RunnerHotKey.CUSTOM){ + this._keybindingManager.bind('ToggleRunnerMenu', 'toggle-runner-menu', () => this._onHotkey(() => this.toggleStandaloneRunner())); + this._runnerKeyBindingKey = this._settings.get_strv('toggle-runner-menu').toString(); + } + else if(RunnerHotKey === Constants.RunnerHotKey.SUPER_L){ + this._menuHotKeybinder.enableHotKey(() => this.toggleStandaloneRunner()); + } + } + else if(this.runnerMenu){ + this.runnerMenu.destroy(); + this.runnerMenu = null; + } + + if(HotKey === Constants.HotKey.CUSTOM){ + this._keybindingManager.bind('ToggleArcMenu', 'toggle-arcmenu', () => this._onHotkey(() => this.toggleMenus())); + this._menuKeyBindingKey = this._settings.get_strv('toggle-arcmenu').toString(); + } + else if(HotKey === Constants.HotKey.SUPER_L){ + this._menuHotKeybinder.disableHotKey(); + this._menuHotKeybinder.enableHotKey(() => this.toggleMenus()); + } + + if(this._menuKeyBindingKey){ + this._menuKeyBindingKey = Gtk.accelerator_parse(this._menuKeyBindingKey)[0]; + } + if(this._runnerKeyBindingKey){ + this._runnerKeyBindingKey = Gtk.accelerator_parse(this._runnerKeyBindingKey)[0]; + } + } + } + + _onHotkey(callback) { + if(this._settings.get_boolean('disable-hotkey-onkeyrelease')) + callback(); + else + this._onHotkeyRelease(callback); + } + + _onHotkeyRelease(callback) { + let activeMenu = this._settingsControllers[this.currentMonitorIndex]._menuButton.getActiveMenu() || ((this.runnerMenu && this.runnerMenu.arcMenu.isOpen) ? this.runnerMenu.arcMenu : null); + let focusPanel; + + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL) + focusPanel = this.panel; + else + focusPanel = this.panel._allDocks[0].dash; + + let focusTarget = activeMenu ? + (activeMenu.actor || activeMenu) : focusPanel; + + this.disconnectKeyRelease(); + + this.keyInfo = { + pressId: focusTarget.connect('key-press-event', () => this.disconnectKeyRelease()), + releaseId: focusTarget.connect('key-release-event', (actor, event) => { + this.disconnectKeyRelease(); + + if (this._menuKeyBindingKey === event.get_key_symbol()) { + callback(); + } + + if (this._runnerKeyBindingKey === event.get_key_symbol()) { + callback(); + } + }), + target: focusTarget + }; + + focusTarget.grab_key_focus(); + } + + disconnectKeyRelease() { + if (this.keyInfo && this.keyInfo.target) { + this.keyInfo.target.disconnect(this.keyInfo.pressId); + this.keyInfo.target.disconnect(this.keyInfo.releaseId); + this.keyInfo = 0; + } + } + + // Place the menu button to main panel as specified in the settings + _setButtonPosition() { + if (this._isButtonEnabled()) { + this._removeMenuButtonFromMainPanel(); + this._addMenuButtonToMainPanel(); + this._setMenuPositionAlignment(); + } + } + + _setMenuPositionAlignment(){ + this._menuButton.setMenuPositionAlignment(); + } + + // Change the menu button appearance as specified in the settings + _setButtonAppearance() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + this._menuButton.container.set_width(-1); + this._menuButton.container.set_height(-1); + menuButtonWidget.actor.show(); + switch (this._settings.get_enum('menu-button-appearance')) { + case Constants.MenuButtonAppearance.TEXT: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.showPanelText(); + break; + case Constants.MenuButtonAppearance.ICON_TEXT: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelIcon(); + menuButtonWidget.showPanelText(); + menuButtonWidget.setPanelTextStyle('padding-left: 5px;'); + break; + case Constants.MenuButtonAppearance.TEXT_ICON: + menuButtonWidget.hidePanelIcon(); + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelText(); + menuButtonWidget.setPanelTextStyle('padding-right: 5px;'); + menuButtonWidget.showPanelIcon(); + break; + case Constants.MenuButtonAppearance.NONE: + menuButtonWidget.actor.hide(); + this._menuButton.container.set_width(0); + this._menuButton.container.set_height(0); + break; + case Constants.MenuButtonAppearance.ICON: /* falls through */ + default: + menuButtonWidget.hidePanelText(); + menuButtonWidget.showPanelIcon(); + } + this._setMenuButtonArrow(); + } + } + _setMenuButtonArrow() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + if (this._settings.get_boolean('enable-menu-button-arrow')) { + menuButtonWidget.hideArrowIcon(); + menuButtonWidget.showArrowIcon(); + } else { + menuButtonWidget.hideArrowIcon(); + } + } + } + + // Update the text of the menu button as specified in the settings + _setButtonText() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + // Update the text of the menu button + let menuButtonWidget = this._menuButton.menuButtonWidget; + let label = menuButtonWidget.getPanelLabel(); + + let customTextLabel = this._settings.get_string('custom-menu-button-text'); + label.set_text(customTextLabel); + } + } + + // Update the icon of the menu button as specified in the settings + _setButtonIcon() { + let path = this._settings.get_string('custom-menu-button-icon'); + let menuButtonWidget = this._menuButton.menuButtonWidget; + let stIcon = menuButtonWidget.getPanelIcon(); + + let iconString = Utils.getMenuButtonIcon(this._settings, path); + stIcon.set_gicon(Gio.icon_new_for_string(iconString)); + } + + // Update the icon of the menu button as specified in the settings + _setButtonIconSize() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let menuButtonWidget = this._menuButton.menuButtonWidget; + let stIcon = menuButtonWidget.getPanelIcon(); + let iconSize = this._settings.get_double('custom-menu-button-icon-size'); + let size = iconSize; + stIcon.icon_size = size; + } + } + + _setButtonIconPadding() { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + let padding = this._settings.get_int('button-padding'); + if(padding > -1) + this._menuButton.style = "-natural-hpadding: " + (padding * 2 ) + "px; -minimum-hpadding: " + padding + "px;"; + else + this._menuButton.style = null; + + let parent = this._menuButton.get_parent(); + if(!parent) + return; + let children = parent.get_children(); + let actorIndex = 0; + + if (children.length > 1) { + actorIndex = children.indexOf(this._menuButton); + } + + parent.remove_child(this._menuButton); + parent.insert_child_at_index(this._menuButton, actorIndex); + } + } + + // Get the current position of the menu button and its associated position order + _getMenuPosition() { + let offset = this._settings.get_int('menu-button-position-offset'); + switch (this._settings.get_enum('position-in-panel')) { + case Constants.MenuPosition.CENTER: + return [offset, 'center']; + case Constants.MenuPosition.RIGHT: + // get number of childrens in rightBox (without arcmenu) + let n_children = Main.panel._rightBox.get_n_children(); + n_children -= Main.panel.statusArea.ArcMenu !== undefined; + // position where icon should go, + // offset = 0, icon should be last + // offset = 1, icon should be second last + const order = Math.clamp(n_children - offset, 0, n_children); + return [order, 'right']; + case Constants.MenuPosition.LEFT: + default: + return [offset, 'left']; + } + } + + _configureActivitiesButton(){ + let isActivitiesButtonPresent = Main.panel.statusArea.activities && Main.panel.statusArea.activities.container && Main.panel._leftBox.contains(Main.panel.statusArea.activities.container); + let showActivities = this._settings.get_boolean('show-activities-button'); + + let container = Main.panel.statusArea.activities.container; + let parent = container.get_parent(); + let index = 0; + if(this._settings.get_enum('position-in-panel') === Constants.MenuPosition.LEFT && + this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL && + this._settings.get_int('menu-button-position-offset') == 0) + index = 1; + + if(showActivities && !isActivitiesButtonPresent){ + parent ? parent.remove_child(container) : null; + Main.panel._leftBox.insert_child_at_index(this._activitiesButton.container, index); + } + else if(!showActivities && isActivitiesButtonPresent) + Main.panel._leftBox.remove_child(Main.panel.statusArea.activities.container); + } + + // Check if the activities button is present on the main panel + _isActivitiesButtonPresent() { + return (this._activitiesButton && + this._activitiesButton.container && + Main.panel._leftBox.contains(this._activitiesButton.container)); + } + + // Add or restore the activities button on the main panel + _addActivitiesButtonToMainPanel() { + if (!this._isActivitiesButtonPresent()) { + // Retsore the activities button at the default position + let parent = this._activitiesButton.container.get_parent(); + if(!parent) + Main.panel._leftBox.insert_child_at_index(this._activitiesButton.container, 0); + } + } + + // Add the menu button to the main panel + _addMenuButtonToMainPanel() { + let [position, box] = this._getMenuPosition(); + this.panel.addToStatusArea('ArcMenu', this._menuButton, position, box); + } + + // Remove the menu button from the main panel + _removeMenuButtonFromMainPanel() { + this.panel.menuManager.removeMenu(this._menuButton.arcMenu); + this.panel.menuManager.removeMenu(this._menuButton.arcMenuContextMenu); + this.panel.statusArea['ArcMenu'] = null; + } + + // Enable the menu button + enableButton(index) { + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.DASH){ + this.dashIndex = index; + this.reEstablishDash(); + } + if(this.arcMenuPlacement == Constants.ArcMenuPlacement.PANEL){ + this._addMenuButtonToMainPanel(); + } + + this._menuButton.initiate(); + } + + reEstablishDash(){ + const DashToDock = this.panel._allDocks[this.dashIndex].dash; + if(!DashToDock){ + global.log("ArcMenu Error - Failed to place ArcMenu in Dash-to-Dock"); + return; + } + + const DashContainer = DashToDock._dashContainer; + + DashToDock.arcMenuEnabled = true; + this.oldShowAppsIcon = DashToDock._showAppsIcon; + + DashContainer.remove_child(DashToDock._showAppsIcon); + DashToDock._showAppsIcon = this.menuButtonAdjustedActor; + DashContainer.add_child(DashToDock._showAppsIcon); + + this._setButtonIcon(); + const IconSize = DashToDock.iconSize; + this._menuButton.menuButtonWidget.icon.setIconSize(IconSize); + + DashToDock.updateShowAppsButton(); + + this.hoverID = this.menuButtonAdjustedActor.child.connect('notify::hover', () => { + DashToDock._syncLabel(this.menuButtonAdjustedActor, null); + }); + + this.hidingID = Main.overview.connect('hiding', () => { + DashToDock._labelShowing = false; + this.menuButtonAdjustedActor.hideLabel(); + }); + + if(this.isPrimary){ + this.oldDashOnDestroy = this.panel._deleteDocks; + this.panel._deleteDocks = () => { + if(this.hoverID){ + this.menuButtonAdjustedActor.child.disconnect(this.hoverID); + this.hoverID = null; + } + + if(this.hidingID){ + Main.overview.disconnect(this.hidingID); + this.hidingID = null; + } + + const AllDocks = this.panel._allDocks; + + if(!AllDocks.length) + return; + + AllDocks.forEach(dock => { + let dash = dock.dash; + if(dash._dashContainer.contains(dash._showAppsIcon)) + dash._dashContainer.remove_child(dash._showAppsIcon); + dash._showAppsIcon = this.oldShowAppsIcon; + dash._dashContainer.add_child(dash._showAppsIcon); + dash.arcMenuEnabled = false; + }); + + this.oldDashOnDestroy.call(this.panel, ...arguments); + this.panel._deleteDocks = this.oldDashOnDestroy; + }; + } + } + + _disableButton() { + this._removeMenuButtonFromMainPanel(); + this._addActivitiesButtonToMainPanel(); + this._menuButton.destroy(); + } + + _isButtonEnabled() { + return this.panel.statusArea['ArcMenu'] !== null; + } + + destroy() { + if(this.runnerMenu){ + this.runnerMenu.destroy(); + } + this.settingsChangeIds.forEach(id => this._settings.disconnect(id)); + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(this.panel === null || this.panel._allDocks.length === 0){ + this._menuButton.destroy(); + } + else{ + const DashToDock = this.panel._allDocks[this.dashIndex].dash; + const DashContainer = DashToDock._dashContainer; + if(this.panel._allDocks[this.dashIndex] && DashToDock && DashToDock.arcMenuEnabled){ + if(this.hoverID){ + this.menuButtonAdjustedActor.child.disconnect(this.hoverID); + this.hoverID = null; + } + + if(this.hidingID){ + Main.overview.disconnect(this.hidingID); + this.hidingID = null; + } + + if(this.panel._allDocks[this.dashIndex]){ + DashToDock.arcMenuEnabled = false; + if(DashContainer.contains(DashToDock._showAppsIcon)) + DashContainer.remove_child(DashToDock._showAppsIcon); + DashToDock._showAppsIcon = this.oldShowAppsIcon; + DashContainer.add_child(DashToDock._showAppsIcon); + this.panel._deleteDocks = this.oldDashOnDestroy; + DashToDock.updateShowAppsButton(); + } + } + this._addActivitiesButtonToMainPanel(); + this._menuButton.destroy(); + } + } + else if(this.panel == undefined) + this._menuButton.destroy(); + else if (this._isButtonEnabled()) { + this._disableButton(); + } + + if(this.isPrimary){ + this.disconnectKeyRelease(); + this._menuHotKeybinder.destroy(); + this._keybindingManager.destroy(); + this._hotCornerManager.destroy(); + } + this._settings = null; + this._activitiesButton = null; + this._menuButton = null; + delete global.toggleArcMenu; + } +}; diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/extension.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/extension.js new file mode 100644 index 0000000..d101a31 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/extension.js @@ -0,0 +1,307 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {GLib, Gio, St} = imports.gi; +const Constants = Me.imports.constants; +const Controller = Me.imports.controller; +const Config = imports.misc.config; +const ShellVersion = parseFloat(Config.PACKAGE_VERSION); + +const Main = imports.ui.main; +const Util = imports.misc.util; +const Utils = Me.imports.utils; + +// Initialize panel button variables +let settings; +let settingsControllers; +let extensionChangedId; +let dockToggleID; +let dockExtension; +let enableTimeoutID; + +// Initialize menu language translations +function init() { + ExtensionUtils.initTranslations(Me.metadata['gettext-domain']); +} + +// Enable the extension +function enable() { + if (ShellVersion < 3.39 && ShellVersion >= 3.36) + throw new Error(`ArcMenu v${Me.metadata.version} does not work on GNOME Shell version ${ShellVersion}. Please visit https://extensions.gnome.org/extension/3628/arcmenu/ and download ArcMenu v17`); + else if (ShellVersion < 3.36) + throw new Error(`GNOME Shell version ${ShellVersion} is not supported. Please visit https://extensions.gnome.org/extension/1228/arc-menu/ which supports GNOME Shell versions 3.14 - 3.34`); + + enableTimeoutID = GLib.timeout_add(0, 300, () => { + if(imports.gi.Meta.is_wayland_compositor()) + Me.metadata.isWayland = true; + else + Me.metadata.isWayland = false; + + settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + settings.connect('changed::multi-monitor', () => _multiMonitorChanged()); + settings.connect('changed::arc-menu-placement', () => _placementChanged()); + settingsControllers = []; + + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + Utils.createStylesheet(settings); + let stylesheet = Utils.getStylesheet(); + if(Me.stylesheet) + theme.unload_stylesheet(Me.stylesheet); + Me.stylesheet = stylesheet; + theme.load_stylesheet(Me.stylesheet); + + let avaliablePlacementArray = settings.get_default_value('available-placement').deep_unpack(); + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); + + _enableButtons(); + + // dash to panel might get enabled after Arc-Menu + extensionChangedId = Main.extensionManager.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === 'dash-to-panel@jderose9.github.com') { + _disconnectDtpSignals(); + + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + let isEnabled = extension.state === 1 ? true : false; + + setAvaliablePlacement(Constants.ArcMenuPlacement.DTP, isEnabled); + + if(isEnabled && (arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || arcMenuPlacement === Constants.ArcMenuPlacement.DTP)){ + _connectDtpSignals(); + _enableButtons(); + } + } + + if ((extension.uuid === "dash-to-dock@micxgx.gmail.com" || extension.uuid === "ubuntu-dock@ubuntu.com")) { + _disconnectDtdSignals(); + + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + let isEnabled = extension.state === 1 ? true : false; + + if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!_getDockExtensions() || !isEnabled) + setAvaliablePlacement(Constants.ArcMenuPlacement.DASH, false); + else{ + _connectDtdSignals(); + setAvaliablePlacement(Constants.ArcMenuPlacement.DASH, true); + } + _disableButtons(); + _enableButtons(); + } + } + }); + + // listen to dash to panel / dash to dock if they are compatible and already enabled + _connectDtdSignals(); + _connectDtpSignals(); + enableTimeoutID = null; + return GLib.SOURCE_REMOVE; + }); +} + +function disable() { + if(enableTimeoutID){ + GLib.source_remove(enableTimeoutID); + enableTimeoutID = null; + } + if(extensionChangedId){ + Main.extensionManager.disconnect(extensionChangedId); + extensionChangedId = null; + } + + _disconnectDtpSignals(); + _disconnectDtdSignals(); + + _disableButtons(); + settingsControllers = null; + + settings.run_dispose(); + settings = null; +} + +function setAvaliablePlacement(placement, state){ + let avaliablePlacementArray = settings.get_value('available-placement').deep_unpack(); + if(avaliablePlacementArray[placement] !== state){ + avaliablePlacementArray[placement] = state; + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); + } +} + +function _connectDtpSignals() { + if(global.dashToPanel) + global.dashToPanel._amPanelsCreatedId = global.dashToPanel.connect('panels-created', () => _enableButtons()); +} + +function _disconnectDtpSignals() { + if(global.dashToPanel?._amPanelsCreatedId){ + global.dashToPanel.disconnect(global.dashToPanel._amPanelsCreatedId); + delete global.dashToPanel._amPanelsCreatedId; + } +} + +function _connectDtdSignals(){ + dockExtension = _getDockExtensions(); + if(dockExtension){ + let dock = dockExtension.stateObj.dockManager; + dockToggleID = dock.connect("toggled",() => { + _disableButtons(); + _enableButtons(); + }); + } +} + +function _disconnectDtdSignals() { + if(dockExtension){ + let dock = dockExtension.stateObj.dockManager; + if(dock && dockToggleID){ + dock.disconnect(dockToggleID); + dockToggleID = null; + } + } +} + +function _placementChanged() { + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + + _disconnectDtdSignals(); + _disconnectDtpSignals(); + + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + _connectDtpSignals(); + else if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + _connectDtdSignals(); + + _disableButtons(); + _enableButtons(); +} + +function _multiMonitorChanged() { + _disableButtons(); + _enableButtons(); +} + +function _getDockExtensions(){ + let dashToDock = Main.extensionManager.lookup("dash-to-dock@micxgx.gmail.com"); + let ubuntuDash = Main.extensionManager.lookup("ubuntu-dock@ubuntu.com"); + let dock; + if(dashToDock?.stateObj?.dockManager) + dock = dashToDock; + if(ubuntuDash?.stateObj?.dockManager) + dock = ubuntuDash; + return dock; +} + +function _enableButtons() { + let avaliablePlacementArray = settings.get_value('available-placement').deep_unpack(); + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = false; + + let multiMonitor = settings.get_boolean('multi-monitor'); + let arcMenuPlacement = settings.get_enum('arc-menu-placement'); + + dockExtension = _getDockExtensions(); + + if(arcMenuPlacement == Constants.ArcMenuPlacement.DASH && dockExtension){ + avaliablePlacementArray[Constants.ArcMenuPlacement.DASH] = true; + + let dock = dockExtension.stateObj.dockManager; + if(dock?._allDocks.length){ + let docksLength = multiMonitor ? dock._allDocks.length : 1; + for(var index = 0; index < docksLength; index++){ + if(!dock._allDocks[index].dash.arcMenuEnabled){ + let settingsController = new Controller.MenuSettingsController(settings, settingsControllers, dock, + index, Constants.ArcMenuPlacement.DASH); + settingsController.monitorIndex = dock._allDocks[index].dash._monitorIndex; + settingsController.enableButton(index); + settingsController.bindSettingsChanges(); + settingsControllers.push(settingsController); + } + } + } + } + else{ + let isDtPLoaded = false; + let panelArray = [Main.panel]; + if(global.dashToPanel && global.dashToPanel.panels){ + panelArray = global.dashToPanel.panels.map(pw => pw); + isDtPLoaded = true; + } + + let panelLength = multiMonitor ? panelArray.length : 1; + for(var index = 0; index < panelLength; index++){ + let panel = isDtPLoaded ? panelArray[index].panel : panelArray[index]; + let panelParent = panelArray[index]; + + let isPrimaryStandAlone = isDtPLoaded ? ('isPrimary' in panelParent && panelParent.isPrimary) && panelParent.isStandalone : false; + + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL && isPrimaryStandAlone){ + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = true; + panel = Main.panel; + } + + if(isDtPLoaded) + avaliablePlacementArray[Constants.ArcMenuPlacement.DTP] = true; + else + avaliablePlacementArray[Constants.ArcMenuPlacement.PANEL] = true; + + if (panel.statusArea['ArcMenu']) + continue; + else if (settingsControllers[index]) + _disableButton(settingsControllers[index], 1); + + let settingsController = new Controller.MenuSettingsController(settings, settingsControllers, panel, + index, Constants.ArcMenuPlacement.PANEL); + + settingsController.monitorIndex = panelParent.monitor?.index; + + if(isDtPLoaded) + panel._amDestroyId = panel.connect('destroy', () => extensionChangedId ? _disableButton(settingsController, 1) : null); + + settingsController.enableButton(); + settingsController.bindSettingsChanges(); + settingsControllers.push(settingsController); + } + } + + if(!Utils.getArraysEqual(settings.get_value('available-placement').deep_unpack(), avaliablePlacementArray)) + settings.set_value('available-placement', new GLib.Variant('ab', avaliablePlacementArray)); +} + +function _disableButtons(){ + for (let i = settingsControllers.length - 1; i >= 0; --i) { + let sc = settingsControllers[i]; + _disableButton(sc, 1); + } +} + +function _disableButton(controller, remove) { + if(controller.panel._amDestroyId){ + controller.panel.disconnect(controller.panel._amDestroyId); + delete controller.panel._amDestroyId; + } + + controller.destroy(); + + if(remove) + settingsControllers.splice(settingsControllers.indexOf(controller), 1); +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/helper.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/helper.js new file mode 100644 index 0000000..9dbc4d2 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/helper.js @@ -0,0 +1,227 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Gio, GObject, Gtk, Meta, Shell} = imports.gi; +const Constants = Me.imports.constants; +const Main = imports.ui.main; +const Util = imports.misc.util; + +const MUTTER_SCHEMA = 'org.gnome.mutter'; + +var MenuHotKeybinder = class { + constructor() { + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + + this.hotKeyEnabled = false; + this._ignoreHotKeyChangedEvent = false; + + this._mutterSettings = new Gio.Settings({ 'schema': MUTTER_SCHEMA }); + + this._oldOverlayKey = this._mutterSettings.get_value('overlay-key'); + + this._overlayKeyChangedID = this._mutterSettings.connect('changed::overlay-key', () => { + if(!this._ignoreHotKeyChangedEvent) + this._oldOverlayKey = this._mutterSettings.get_value('overlay-key'); + }); + + this._mainStartUpComplete = Main.layoutManager.connect('startup-complete', () => this._setHotKey()); + } + + enableHotKey(menuToggler){ + this._menuToggler = menuToggler; + + this._ignoreHotKeyChangedEvent = true; + + this._mutterSettings.set_string('overlay-key', Constants.SUPER_L); + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP); + + this.hotKeyEnabled = true; + if(!Main.layoutManager._startingUp) + this._setHotKey(); + this._ignoreHotKeyChangedEvent = false; + } + + disableHotKey(){ + this._ignoreHotKeyChangedEvent = true; + this._mutterSettings.set_value('overlay-key', this._oldOverlayKey); + if(this.overlayKeyID){ + global.display.disconnect(this.overlayKeyID); + this.overlayKeyID = null; + } + if(this.defaultOverlayKeyID){ + GObject.signal_handler_unblock(global.display, this.defaultOverlayKeyID); + this.defaultOverlayKeyID = null; + } + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW); + + this.hotKeyEnabled = false; + this._ignoreHotKeyChangedEvent = false; + } + + _setHotKey(){ + if(this.hotKeyEnabled){ + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | + Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP); + + //Find signal ID in Main.js that connects 'overlay-key' to global.display and toggles Main.overview + let [bool,signal_id, detail] = GObject.signal_parse_name('overlay-key', global.display, true); + this.defaultOverlayKeyID = GObject.signal_handler_find(global.display, GObject.SignalMatchType.ID, signal_id, detail, null, null, null); + + //If signal ID found, block it and connect new 'overlay-key' to toggle ArcMenu. + if(this.defaultOverlayKeyID){ + GObject.signal_handler_block(global.display, this.defaultOverlayKeyID); + this.overlayKeyID = global.display.connect('overlay-key', () => { + this._menuToggler(); + }); + } + else + global.log("ArcMenu Error - Failed to set Super_L hotkey"); + } + } + + destroy() { + if(this._overlayKeyChangedID){ + this._mutterSettings.disconnect(this._overlayKeyChangedID); + this._overlayKeyChangedID = null; + } + this.disableHotKey(); + if (this._mainStartUpComplete) { + Main.layoutManager.disconnect(this._mainStartUpComplete); + this._mainStartUpComplete = null; + } + } +}; + +var KeybindingManager = class { + constructor(settings) { + this._settings = settings; + this._keybindings = new Map(); + } + + bind(keybindingNameKey, keybindingValueKey, keybindingHandler) { + if (!this._keybindings.has(keybindingNameKey)) { + this._keybindings.set(keybindingNameKey, keybindingValueKey); + + Main.wm.addKeybinding(keybindingValueKey, ExtensionUtils.getSettings(), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW | Shell.ActionMode.POPUP, + keybindingHandler); + } + } + + unbind(keybindingNameKey) { + if (this._keybindings.has(keybindingNameKey)) { + let keybindingValueKey = this._keybindings.get(keybindingNameKey); + Main.wm.removeKeybinding(keybindingValueKey); + this._keybindings.delete(keybindingNameKey); + } + } + + unbindAll() { + this._keybindings.forEach((value, key) => { + Main.wm.removeKeybinding(value); + this._keybindings.delete(key); + }); + } + + destroy() { + this.unbindAll(); + } +}; + +var HotCornerManager = class { + constructor(settings, menuToggler) { + this._settings = settings; + this._menuToggler = menuToggler; + this._hotCornersChangedId = Main.layoutManager.connect('hot-corners-changed', () => this._setCustomHotCorners()); + } + + _setCustomHotCorners() { + let hotCornerAction = this._settings.get_enum('hot-corners'); + + if(hotCornerAction === Constants.HotCornerAction.DISABLED) + this.disableHotCorners(); + else if(hotCornerAction === Constants.HotCornerAction.TOGGLE_ARCMENU || hotCornerAction === Constants.HotCornerAction.CUSTOM) + this.modifyHotCorners(); + } + + _getHotCorners() { + return Main.layoutManager.hotCorners; + } + + restoreDefaultHotCorners() { + Main.layoutManager._updateHotCorners(); + } + + disableHotCorners() { + let hotCorners = this._getHotCorners(); + hotCorners.forEach((corner) => { + if(corner){ + corner._toggleOverview = () => { }; + corner._pressureBarrier._trigger = () => { }; + } + }); + } + + modifyHotCorners() { + let hotCorners = this._getHotCorners(); + let hotCornerAction = this._settings.get_enum('hot-corners'); + + hotCorners.forEach((corner) => { + if (corner) { + corner._toggleOverview = () => { }; + corner._pressureBarrier._trigger = () => { + corner._pressureBarrier._isTriggered = true; + if(corner._ripples) + corner._ripples.playAnimation(corner._x, corner._y); + else + corner._rippleAnimation(); + if(hotCornerAction == Constants.HotCornerAction.TOGGLE_ARCMENU) + this._menuToggler(); + else if(hotCornerAction == Constants.HotCornerAction.CUSTOM){ + let cmd = this._settings.get_string('custom-hot-corner-cmd'); + if(cmd == "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else if(cmd == "ArcMenu_RunCommand") + Main.openRunDialog(); + else + Util.spawnCommandLine(this._settings.get_string('custom-hot-corner-cmd')); + } + corner._pressureBarrier._reset(); + }; + } + }); + } + + destroy() { + if (this._hotCornersChangedId>0) { + Main.layoutManager.disconnect(this._hotCornersChangedId); + this._hotCornersChangedId = 0; + } + + this.restoreDefaultHotCorners(); + } +}; diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ar/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..f06173f8a34144617298f671be8f917e5feaaca6 GIT binary patch literal 3183 zcmai!TWl0n7{`x_s09)5#zp0L2ihqrQOQyZ+Y3->Y13_un3y=bdv-grJG0E3Z7GQ{ zy;3(ZQ6fI*g8@={u?4oJEk)leBb~3 zW`Ewi<{U%YgZ>oy7xyq$53aut540_77`q?b3O)+%04u<~;CiqYd>A|mJ_sHM@ndm3 z9s<+gCh#P<790TAfrXG?f*j)u;M3p_A%6j@F#a1PJ5_K3uk4MG`$4+*AV}-S!ufZ> z4H&;4jx*o`7@q{60DHmh;AbG6n*#A;^LRW0eh=;de*&Ke{|M(d!g-31huj5{-PgdE z!3aok#Y5U4`Fk29KR*VyfS-b--zAXlFNWjq!tsybHss(Ih#&hMmyo}Ifu#2aI6?7k z2Ok4>gXGr%Jjm`5koLtu%I60l+4%^392^8GA76nK-xT-)cndrV-UbhVQ8>2|>;uW( z*>L;~NOrG+Pl7i=9AUqO<3B<2V=W#uzX{w0ZUgs%4d7PrRJeW?Bs*V&RD-i1>G>;I z39f^vo543hOtH5?^1l-_z%)qq&Vf`vS3uf#6C^(s_&RtSr2JMQ81idBNc$T=iZ6}_ zWY;+bmKx=(IvkOHtJ{m1Apa>Bt;#MOcU`B4TkxI7g=ZxNr`hm2 z?a3jt+i@)^Ja)v%3Z}!P2RH2`?;v0G$b+w}S)`uuUR#={BD^NnWu;_o z6|bq6ZiX1m=%Eh07W+IY!n}s>T1_n&J+ypUOg*}jR~Y6XyXdya zg3(|~5#h%hqwPjZtI-hUM_MB-O_lGp9&4;;Objg_XiO37%s%oX*EUn(bZ-97^I!05Lsyj!(#ZyL3tsqZ{W?~0J=)R(w!WHL9(B)*RIhZPjvaN7QjZ#oJ z*%#QFL4Nv15qsgl=VDAm2&nmR8G3 zVfi(vl5&$;SuKRV^(yj-Jci#?P^)*;aS|n4@CUe}7yOZot1DE*L88h^Z-tAc%Vtp) G6YL+~Zh#>G literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/be/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..11c483bc8d12d3edd1091dc897c3e76735401a3c GIT binary patch literal 33098 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 bg38J<;1*dio7I~*U4ZTQ-yMhl355Rv7oLyQ literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/bg/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9cb7eafac41391303fb34b969920f40ec8d065ff GIT binary patch literal 3558 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 PchBtbRycn~jcfiFBWlMC literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/cs/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..178df95ec02b68b8df26bfe0f766e7b3ba728a46 GIT binary patch literal 22694 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 J8M2@0{6B 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/et/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..b9d0c76a4f6ff2a639308eb182b50a59081f93fe GIT binary patch literal 9736 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 tb76(A9cA^w?pF# zM^r|1SRH0m)L|K;JL2NtxH5{5L0esMM_gZwj5E%NvLic-;)7LZ)tT?_JnGi%?tI98 z_I^11t#j%;|L1@H=YLLx@1Azd9|!!_EeL}1;N2$%!Mk`q>2#$ALG$b&I0fDeSHai8 zW8wX9F?Rt@Jv{PDt|j%4c`gR zg`a~<;di0xc@C=FX}mlMUIf+Ndbkk2$faKc)!$uk4crY+fUj}y-vrfn+ddjd)>PeZly8+aT%^?W;?GojiG;c|Edl>A-}x4}E$3iwsn3!iiE zFTNlM_%9gZkK|H^n&&Af`Q8iF?t}0m_<5*&KXmCofs)s;7uxwd9bQFz4g3!zf{#H|FZc$0 zA$$f(&SxyM^(})ce>qh7mqE>M0z-HkycpgGRql&W{rd(~`%gmY>C;f{E7AW}-Ldi3N>*2eh^yqIK zABSfU|0gJYc@CO+VK9h1I322<%U}=O4y6ZesQw;;lJ{pIDjs|jGPS|8P~$!YUL|@qHVr{->eJ9nGYu-z(vK`k^M4UMhIk)T`D>uo z_kc^k32Hs=gVKvS)HrU1>gVln2Yfr!xV{6AgWrQ%hd+dfGB}M%mK-mK>dyd_+c`cN*Fov?UZ{Q~Q1vw6iSSiWa(E-eWCd?^@9&4b z#6J#I-#`0j2*>!S!&#T67d%3NM2dD7}BD<5!^c|EM0T=NqBy$!@6j6R7$# zsD8g5s+~Kb?&V$m+wQw=K8fx5wQ1aOA(r<#2 zdkvlhGxz>BsCl>(YQOk%D7nlyeg{fkKZ9!Tgmrd)&w`4tfh^_V3dj-)BB=h{0Yi8X zyb^vAO1{5@8s7qhxfmYrxD-l0E1=4+gX(8LM5MtGlzd(ZC5N{`stP^pI!_iEZ+B*SC-ix8+z0`3zRQXC>+op!YN&c%2i5Ld zA*MRG8!mx=1+}gpg=+sFp!)TFsQk}B_2=hM4&$;w5xCg4-E1~B5ZYceFFI2zp zhtkJ~q1t&AYW+L~HDAv{jpG+^2|RkEo!=Kg&FgBY{FlL1@M3#H#RcsjfpN^Wm}8sB>yKMd90BT({s5~`gaLrg;Oukb9mn$D`+ zCU_nkgX+i4Q2xeUQ04yuY8;<}8vi$;^i)ow>RAj`ZY9*Z*a}r|3u=CDhnkN+g3{-E zpyc%lsCoUYi+>qPU%w79nZYlh`my3_e1EtVhVboB^Yl^3)CP}3rY2a7kT$^WQ1YLK zlGB^vZuqBg8~h2BJT_iy=VLPri4Qt9p!D=EDES|Pny;_I9q=i*6ZZDo^jjSN5S~x^ zA-D{F4r*Qf0IK{CVF-T<)$a>8*>!b2l)T;sC9n5Evp(U4#J>R5kEfvIb?Ro@@3W!i z;UcJYvjIxqFNdmUvwOeW@%NzQ(SR4g--pU~AJjZQ==f=<_4Q?_dHOr3{yhm*|IeZ9 zQLx3X`%9qoatl;FJK;HSFVwu>3{~GPQ1#pa)$Tn|^YlSD2_J@P@1m_%ZfjsK@pW(o zd^waHZ-=Vy9;or(4=eEF@K$&}lPvkY6Dt3QpyumxE#h%{ksFMh4(?#^O)m5LdpMGsDAzio&Xo2tjEGL;BoLAsBtZW%HQMS zeNg@122X^)%R%t!8@Sp`?yR03{-uOL+R_2Q2Kh*b=Ge7z{`m5fg9i-IDQhU zzGtBH<@^CVzKu}hekoLcZiI_q9co^u9p3^a-+LWD0@o0qfve$KTT5zYj_ut5D;-6>9$94j00Axc7es&m;a3sQx|%&xTJ!l{+lJ<7XA{Bz!gJQ{!>tLz749sZ-kP^yWmOi0T+K5O1~e2s{i}Y$aC2G z0UKc-=?%CDeh^9zJ_e;fpMo0iSD@PaI#j-IL+RTOpxXTn)VwUAlZ)Zm@D#WTs=kfz zRCo=P9*jWM(}a@atDwrg39f{H0yQ6>fs(_wpvLucsCilNQd{prsD3ShYv7qKeKV9? zu7j%gCb$6JLeTGZg!>7pBJTH(aEUUx-|bLiKZUf@OX)X~_HDv92>+Gv2;tudXOrg* zaE;6R49~A8sNrdm-x7=9DHsvHM0h*lVM6)$zlpq$(Btaz?^^ER$Bw^-$GJQ&=J_I? zmlJy3`!~Y>MEEK}cYs4szY}=g3;%&2`=OuoKsxMypX1?V^2v@#hY`J*OAxdP-z6N) z`wIv&JpUQN|9+Q;y9wX%3Gh@xFL^H^yohI(b}&IWgZNjVe$vscgclP23*lVCI|;WE z{(#_rFL4iFgG{aY{Uv`{Ccz&QswM^ffvc(iB*HG9|BCS6+&kfIrRVd=v)09LhD(XB zD82t4&)W(62u~7@BIx%5^69t5A{c<5B%JBem3%JG+u$n*uTla(*`f7>YY1;5==Tdk zOqe9>Civfllz*DY1B43+A8;?U7Op3J(Zv^%?^vE2gvSVLT_4`XGcJ?)JjEW%>? z@VD?}!VQFB!Yc_m;ZB18y^M#m$om}J?-FlKqQNn8p7ZLUl#tHh}MfexO3fj`| zqZYx39fiLj{1IURdAWG;e|Cv?z_Z=+@s!`}o;`lZ!>0&S zKEd(*@GYgZbv(b9a0TIULg@PY8=lYS`D5_!3HrU2u-H7Yzr!BFIpkRbSGsiJUkOb@ zM)*GA41#_q5-uZLO8Ae2kZ=^`PbBQ%`JV~Pcs`Aw-?4BhtPp;W@O8pTgq807y*$5z z@YjU$?+Zl!)Fmt;@8@}5ML61}9e|%89K*X0!Q%-B38xYMgzzK6sl3|+FChGca0=ni z3Htp$;aBF#{<+xo=MtAT3LhkV%f+vTe@FN~im#}I^|Tci><`CUQ6Pb6QJVHihcqEZmXi zB(@rHD^$L;QGPi*6}P66_+ZdqsVIb-+gYC0!_mpKm5-|>(ze9=qjoJ1_hi(uC27Uu zdD^0C^Ky`3sKYiE&09g9hTEbk%H*yP3Dar26^KbW>^m2kY4j#slMZ~K56 zSR3w+>*-XyHbe%4X(ib|T?{r881{xq?q?JyzqPij!Z#Lto6*b0VJ^K0L9g%7KHyodg8WYSx)To46 zoQIA0U^vNqjNAE$+IkOglcV$?uMZqb(yoXpD#eEpQi67Na?Gs;{o9`8yP|z$YNcqE{)YSFEUBO*zGmCisVI+H zR%b^iqh=gzipHzKrZlbAqgFNJsZ~MWtUkNQXmTt0s56Vrnux-2tFMVhzp0()X(J0Z zM|nJ9HMH{>?n<)Uze0tyWXuZdq>Z-sne{{saU+jg4sj*eY~~TU)zEzuwxhTHl@xDW zOD|0KhY`Ax#Z9z>g+gtUX-bEqupZ}=X~pzh`OyTXFq9VfuGpOWTP(pStkGjt*KEa7 zp7FF^N0Blugf{h=6_g%qgmks8nejP%gRYvXh{c*ut0trVH8ZhAx6~7>h{~aukJAbsG}BE9Ba+kjIs0W z1V#tKvB|g|heJ_4?n)Rj(qTA8`ZkkG3wy$?w=}V2>vq-!^3N|85O1Gj(i@_KMC_*ijU!;#3Y*+K0xN4W>JP-l_$g+pQK0AS_9=NONY#XK_Zt zN3TyB6&7b-k==F8HmlSrnR_0z%Q(!hZzh#RZL?|@leu#-V?pdQ7NHn!+2YN8yD~G@ z#?_&6S{Z3O3t85va?Z-yU(^+BiLyz}<`y=iu1Lpxma~Ky&$y9k%Wh!dTkS>z6T7S^ zIid}zJ2tl>lL?z<ReM^}T-{e08zvhR&sIlgg?#p5H{Tr9wC|(tflY8G%EhdqVmr-!!gR*M!sjFx$m$-u?LQTg6Hn5%Qm)RYI z9VzaJ{)EoZ+KsC0)S1mne_RpsID)Uh>IzK6h|D}muZ$aRV&m4KY-*pzL?q}Dy_`07 zkZ3+>REPbmp}K6!@}6wEzAxoG(wj|9EH@4G1%L)IIk}}WtQ7`n{m|ls6^=#w7Gl12Ty1roB~06{PRYPG zV>_Us;4V#vt=KuCyLN?IUgkJvmSFF~G3_!*W4zX`=%|K}ZH}froMImMXA=Xv+0ZdA zBWY$%>A?V=yVhf7o_4dnMp+!}G8P4;_vb<5a%7~N)#eO5YHA0%y%jYllkqIv9JMOJ zE)K5dPdM6c(iTmaXpc3G7+DUpyAll4F04AE)e(7@+>>4DL^#Z0Z7@PeCO419NpvQ| zM~%3$ptE(_2s21~FQdD z`rR1k%YtF`q})*D)f|(b=nYQBuy5+OsENImTW4^pO-$@sdK$ zZNe>cseNc}2#%nY`N|w=L%U_Z|6g0`E_Ar2kk(=3!<#N497Gj{_wNtv!t_UWX3p9{ zL#$A!(~iCQa<;VCdw1(LfOj0Bu$gWX&58td(Q8lH5P8pT{+!;+pDrC%&CmlYfR05n z@h+2uX=Hht%Zc9J-e45_YW`Ty$v#Gzv6ggvltcgcqyuZl6tOzlU#pRB)N}rxyO;BI z*1a0DhhWx#bK>TtyRFcrbIan^rHpCeQ#uRSiI4g#vr$aG4tf5vi5HzkgY&|?X$2ak z?g;HLxn|2&*_@m1ESyq`+X7d;T$EykcV(D;6I62a=(4$JGS^P1ow24Awikh;lL>o| zR}pi`($|TO;8=H}nO+=}XXiILm$D_!aW7qD>n(XJ3hjOdJuycO&7cIQv`=Lc~$0(ZC_I}(qixP`X2STJVYe&6sC7W;7;o&eMiLZ0sDJR(F299n>lxI*yxcw`nV3g zC0~cTmo%=>1$--u^Q-oZZR^?C$;Y*Qwm)w5Y;BD5MWHd#7jE2_pN$>vT>SCaMxb+M5X^0EpnL{&&%8w&) zOZO6-R2pH1+frj~OhvV%T1~_44bCAoreuu!-t<7^DOKw+nbIteg8pirB*>i_s_m($ zTIGHyoSHe*N>Igwn`G{(+OBcoh$YdhJPmHF#YxtfIaHml(=~3@O&1-* zdb`Ss#jLc$W>Q6QI8@Q5f1Pp*)y|?8RWmJNb>`4?p3fXQKy`>L;q2E>y1DvRwSI`z zEa}woJWXV6TyzGN;E)yVRuhKBJx!iZE4@^2DN{W{%^7PIAtFBGUEATU4Y>|Nb|D6i zA*R)86qTgP4OcN%$$eCPuh9LeD2uf(nj5efQSfnUDmFtdXJYy=&sChvm`@m`@@Z0y z=Px}FF~+1b4mMVolujOq83mH$Bh{W-HI1@%Fltq$ig20aoMzAtOUBdAQ@sffL?In! zm~GtO@bD^7=uy#ETDe#9SqIrtVI-zbv71NBaCAs7)V+NqDDP#Rk_^Q9k&}A znqRS&(h)`vP$|{&7e1u}%+qVfVMK!aI ztE|oeK8LV6=(nEif(rIB>y?PfuO+N|n(QpL&JtD|E+gYYcd0mTrT8CpJsSH%wR=?w zhqSUzu;rEdl}An0WV7*Q(KUO3OjYb3CQ6UBwwY5IJhNzPZEkq#QHYMs96|?d&Y~X9 zg=T$YUClT!r(P?JbbNb9Vjz9q^30d)o-DWeOcTXw@I~szI28rasw_E>O3YEz2yU!5 zr_o2YeU^BG!d=Q$mRMu0HLYYZn}T0{ngbd7JdS0R8pysY!HKiMr=i28^G%H}e(Ul! z8meuEQN$dVtx4=Qg9F+*(D4fQB8Xovtu}`F^vpxenTMvak=n2HwxhEpV~Q@BZJ|`J zHS32jfHpJ1>?vpz+eWy2z-!|)XTOdaT;AhVByIGX9$@_@aV3rVrS$~8K}wkOl9YXC zjV6_?*7RfrJ;CnInv~9R()wuOr39PxiEU`QI&JoFqxWVyI%!=q*-7>aX;Wmc(IK3( zoGS`n-7G0~tm;^lOu2ozpXu_Obm=iX65Z~U>{_8*oD@|$i{nzt(&Gb%HQCX;FFTgX zt5dNM*d(+v+1ObOQQ(i-b3e`XbZm1uQ`m!9)SA)9KI*~Mmg|8_AR9dE^IB28y>^?Y zO8Y`vw)~fwhvuo|`C1${j!;P-1DjHqgc0L#aL;1wQfa~1{n82xD?FLx(;ODK%V}Us zaRRIx<;r#Dv}vrr9k;s73h|ZuQIOPeROXbNFE>_|4Wz+#$EM<%^m2F7>j=Ko%-Zk( zmY)?ib4V+O)z)CI!|SkaX42~`E0wWE6QQfQ#AlFT*uvUV2{zGtl!qUl-Fl4uDVORf znzku7kaF7%Eimo6&T@JKu90J0Gt`oudcK0{Y|(WqFaB9p-e$kSQ&5RQi!>!eMx#oW zolSk7H0&a$2JTQp6hBldx%00oC;GgqYpUbb_ zjxA!_E&St1i{I`RhxHSDhOScmxYF!d{$o^_@R=4JLUovdn0=ia0M<%7=?ey&5RD^m z))=mRFpR=^@!C6Qfe-bNr4fb2TeIwVOExokW;c{6onv<7`DFeGB zHdLFk9Ju*1vjWlX3T{`*Mak@Pon=-mB;O6Tu~{Yc?u};=ETMHQn(M`|%U^PRGomqvo`Za2!hlwda){9O!m%qj6sl7GFc~OA%5Q zMHOzLm>yS`yHXfPTTCv)ULn9#Xdt9}JjNiACxD!6ch_ z(|sT9q*y7Naz+{LIj-~G^g?!7-mBe5I9g$P5l188&dc=J%%(jnaAv`PYPp-2a)#aU zAfKKNXMabvJ?27Bj_<6M;x>i(bXoh!?Cgb)QfR!-HLD_5)~_g^t0=FUD{TgA995Y? zdmJ(nNHuyh7u@xr523pY=#dx2-m`G|Fup^#e`eZWZtjYVd69t3jST-@OY&=Lr!EPS z9!XO$!x)9MrK4;((7$tFV5c`0XbM-K{yg5hP<|qItJXFLKxasbjiB2_FTT1;p_2nl zBpSxfWiAS&Q1WT$BFm?oI>iC8t#vkvEyN(rvV|-LtyQyGAQk*d84?7gZM4DdiP~W} zO3+q{8KeK);z$;HY=q{TxQ8O{%ED!sea*vnTJy1%m8A2Vxldx;9B=KJzFleK5pxwg zB16^Wdni{#@(Om)mN|y_`82nAMXH@{b;e#C8UM?fA)m%(%;eaW>C>8ACvl%t@05%y zb932iC@zd$?V3DuJ7N;J1el(dg_+`YuIq`>7*7iC4Y`&c?G~Q!FJAq2?|JxhM#nSg zIsq{W&tDehv=@|Y^g9y%jXH}yYGzguTtYQ9W=@(x4o=d#+2};3Yxs?{lqK5Tf+6fd zpRUa@h`}CRh}q+o_L-b%)173mBK5>C9(W4pH%)9+&`s7V%+oKFe}fccUQN=Hc_ru5v13VKt3CU=!CB$6@MrYeQQ1{3T|$VlGi- zbB?f$+4)DE>6s-FE!5(bkw9q$k4E*n?pU|F`zef|xpLxa-KWV&n>#twrO3s<)?#|h?3;Vd=Sk_@uzTZIxYD-OQhlAgv+i1yb66M9GJNJ?j^Q(@bIl&^ z6L(D763l&^3?I&y@g0i?>xXut-qbY^f0keZt8M<6i!YTg^w+qaMReZbb@J*g+%^Te5Q!>uS<3x5K^en3Gf&Uvul~x=Zc2-Ru{| z_1hc^=4==LpObYgj5^!T&m;bjsFRJ{u|EF&iu;D7q-M&Md{I{VK^v2qxbjN;3 zNa^DgUnJcZK30HRLZe2%W**{D6c!gSQ*N74Hn}Bj`+-FFf?VIS29SQ1XqEcg7`r=8 zXPq9H&!FbOh9*!utK57Y_aDdcWYo0%YrJo!CSk4fzvFOqctB@tdW6Q{`$ki`hhekj XpC-z&6T)eGRd2rV43elV<;C$Y@pPc^I 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/he/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..ee7d15e3041bba86b6eb203edad2c7e72837a1ef GIT binary patch literal 26175 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 BwM75` literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/hi_IN/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..7b2cd8b55f581a4e7994ab40447eae9277aef14e GIT binary patch literal 3965 zcmbW3TWl0n7{`xytrxuD{dVw*!j=V$LPcU*A)wSY-Ngq@NT$1IyCd6~&CF~oMoqye z3K|};m>|U4ED|+Wq&;@jH}_Z^-(q@G|T4cz;J5Hr_&vNG{*m=-f|vc}GcJc>w-4S8ABD27Ama;A z;@t)%&K>YNxEG3kN1*8P6_hx>%ld!F+CNE~T>K6tu0L@m`d>;ASHgMl7I+`L9~R*C za2u4o#PDkP36y<&17-csa6bGCYB(R~Pr$WM^nVAghsR(Q&Lvo}^E{+W?abPHq2%XN zcn?gV*zZCFY2N~6{u(I#!%*s~lJP?*`S>LpKaZeg-Suz-?1!W9Jy?KUh$#APfReun zcpKaam%}4)5&RX39ZeC4ZjZu+@JU#NTcND`9xjD{LD6w3lSS8Icr7##`E8Ct>yj82 zWi8R=WVSZs{c?G5-OIgzTWW_8Y_6of@V<~x_ z$4%%~3(*;w)Y;rQZrSf0+&6HO=GG;8&s6Vq@k&NsYi`MjT;B^-Z&1<$#%t)cCEt@)PFkwZ zDQ#4Jrs|Blej`wQjVSUx?VK>uZ@kC^s=pCN{#d#=dymXBQP%H1YxI~HANj}nN8HdE zsTu8@h_&iRy5t8QW>^9}09j~m5602>6#H!YrN@O3p(5Rb0KV~+mbv{b0^GEd{%37uB zeu%hOa6MgjJX2FcHRFUvho)vq5r(xp=8PH}mKyRWuryeys9|@s8l}%!_6zAEyM>A$ z*!X8@rV0jCQXOPJ`c!l58YDy~SrZ{ts0w~1ns5T63XQOCys|26@*?M%9=)Pabt}=z zg?dGQ6x4*hHQTfsU&*{MGFe`;cdMoqOdeJ~E2eFAimEtaoQ=BZ`!!YER3|e&3OPZk zdVF%9TJM!j#q~^CL8noRv>PglHAL7Rt%d^sX|&9(E$5z?>6|Imu3=O6gD5u;j=JSs zUt=`P75yIFH8hwTHsh{X$UWjjrbjQyFMc4GUzS^(*Grc6EM2l7za*dUTIYmOuE<#k zYfj_`J-Xny+*D813G{$dE;}_>uNZUO+QVVi-R*iSS?G;6NNlcXoG~2Ew0Rv^JFx0R zq>H=rUHv`>#KRF=@6jUOqI%77y$5v(H=&6hT3=k9TXtfe1XM9WZk1Q^rObQuvJp4x zQc3(_5+6$9FOzt85+Ce%x|4XHov3FsYv_LqXDEPj$ zBobsBJ!3fddCAVkDB|Hd6*6W32k3{fE$Z|ivyS1n2~HfOO-v>6yEb56-oyvn#VuL* z3?uD6lUUM140LzU!cJ~(2eUWX+?sa0$wqj~1m^9uj;Oy(ck7Xy9aBmCdD7gD3En!m z@7#-{H`0htPD=+9Oh#fUL@HI@Sc%zGt5?v9k)5;qsCVf*YD+-Q3=PyHb*QJh6et7sV1YZSX`T2dr&_X%{mk zKf7&+ls9#XbvZojk&vazXBC+}9m=cWU!SZbRsRNeA4N)Q^-3@7?hJ|vwBq7vS-ytw$1Qi zTOTA=3Ng(Xu33Sco$Y28-?j^hmTEbA=3igy7=vl(IL^-gslUpc&r{5Ala#Pe+eWVJ zfVS0Z>*L=h{=cfBHg}lskWqHoL4D?;8rn`1G@o_8HGAx*SQ6fr_Z@Vk6~Hw4h<0~( qv&Me7MV0hd?t}CTk|v5_jw^{gVh>;TMN2<&spwO(F5b_-B7Xyk1AXEE literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/hu/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..04eb49ecf5d1297fcf49e31a5dcb3d4305638d79 GIT binary patch literal 27574 zcmbW937j2Oo$m`F0h(20->k5OK)SO45}VCVx;tr-PGY)~5M-38is zTj$iNQ)l^~|M{Q)sqmc>4ts;guW*Rxoe6I^%JY8A^;=F>s^_gb+w+ct&xhS`2rhuT z;IrW^P|v*vJ_o)J9tuC{;-7Z+AA`q`{%`Okc<6II?|66`JOy3^_55nM1a5;@!du}P z@Z(TbdK~I~zlM7L7~k`bhG#>)_hP7Wmci|C4eWw%hKu04pz?nPsvTd07sGGDBjDj= z(*5J1>UkDC5nck-59^@XaUDDrjziV!Z{P{=E~tLl>-aIK=f42;z9-=6@F(v6q33ws zVZ={@N5a#g-hUosD7+PLA-oEzz5P(-Z-s+!0IBY=O zzXhs2uY~HayP?|iKB#safO_v^Q2p{!HT)d+-X_ zb-u0VAml&qPX6@3eNg$HfQW>5^aZwk7el@8N_Zh0aOoAOdj1Wh3f}9W@_odme-dh3 zz6vEzPr$3-pBz^$Muv$`!OP$W;4=6lco;mHm#O?S;IVL-bLJfs^a|#YCIOvc$L=!^?X0n^93k*nu0#O6VjF5eNfLm z0#(27LB0Q1Q0@JLOF#A^`~I__-n#^9eAYna8;5H5Uqg-aeUL}JhoHv)XHe}uj7g#X zI0^c238d=YwT>}Vz25?lfS-iQ|5@n6Z^I+uUmTBEYUjZTP;$2zs=b#(rm{Bx)gK{L zIWL9X@HJ5K@^Ps4{2VIZLT*YgoCzgAtDy32hib>|Q2p~ZsPf(gRo@5TrSLoOGWZ-G zQhkQtv2X`e`wLL-n}&Msbx`g32wVUka`A_u=Hr)L`uAP>PvJ47{|>6WL+Etz1gP|L zU3`V(YA8K10*{3SsC>KNQSdgGz8fA+{OvCNJrGsmeF&<(k3z}Mx1r?v_fXIO5vraG zmfQ4GU>ET-;n8q0RQoQ4dhgY69ozub-Zwy%|7Iw8`9~N4AlK^LDlCMF8)Wyu9fz^XF%0s2~@sIpyc)%sP}D$D(7Wz3f>9T&ciOT{dOeO z{ZpaRmq4|%$Hkuy)qhvJ^g*cpej$|H+z5|@(@=8uD)?;pHW$Ais$LH}J_6N$--UYa z=TPr`3aZ>g5Vq^#@lfq5LiJ+HPlSI5)z9yMz3^iYRp9*rYJM+zo^9Vn zQ04YQ&A&mo9F9ST(t91G>D~cIRlPqt_FQh~TMlYo-2+dC`=ILcFHrsWRjBs-0O~zI zhZ@g+hbO=zSJ`nn6RQ0yp~_nYrRTOlfg^mz4zPjRQL-QUr1-4 zPyA$f0lX5bUODK)29zCi7t}aB0@aRhLDlaG$KOEpqZVB~-vw3AGvQLW1fB%9LG?!o zE`zU!(!ZaED(?sIIq-K-!QM z>iLgCjn6|+<$ne0`5!>dgP%h6)00s0d^n4^(vO1M;b~Cyy9sWFw?Vz|URo=^?+Ve`Neta!dzK=uoZxc!`z68~- z@4NKhL;n!w|21}e&v}8B|8-F1{WVnmZig4byP@RfA*gyj4%LnyLPXy?qR-Bk7eJ+N zho{3CsCoJZcpCg9^x-!ks?qy1)cu~-)*jgbFDAYVs^0H_8u$HB{e1wc9-oEN@L!?o z^P)9&9h`s~k5@yb-vc+mcS7~sZ{7W;pijK3-`4wLsQRsjdfyFD^)JFR;q6fR;2lu? z_yE*A`5ZhC{s5}qj~uY_dK^^$ErS}TKB#)FgBq7@E}nx6h~ES?-n-!0@YQe&d@p=4 z{13+)25tL42G1b<5vcn93ND0yfhvE&T05UkfU5U}Q2DQcde4iX^h4Eg1}-9g8`Qje zH{1rl4!dE`I%E;v05x9s!JY7NxE1yf+5UVJWNLaJgQza=NvLv{Uu(y63+y5uLW=e# zq5AWq@GSUQ_>?(Kx+zgL^yWr9AR!9@QJE7#@QK)hK9b5tzY_#=W2G1ux4E0~hpFwI1Eog-sQOPq)$bEf^6*0_IeQ9T49{S2m%+7Ar9 z{zZ_k@>aqH@D8Z=-3eK$y*I(-@M}>0yKskXS2t9D_QMhk;BNRucpAL%dRxv6RD14# zs^^=a+WkJL`acLyhF^iFz@I|N+aWKq{dEz%gZMS@Q1~!B9exh#`5!@z*HcjQWZ?}q zejGfO_-Rn-7s4~)3U~(G2vx70Q03hMRlmDk{Jl{9bHJrP3N_w8fqL#KxDX!qSGJxf z!&ef&7^?q1G3r|CttNc-@dWKN%uS1o8J5>4iK#j}Wq1yQ_sDAi> zi+>2JKmQpj-xs0e=BqCKdvGi9Uqh8Y_!7HLT?bJ)-Ysw${5;hAo`Pq>LvOV5=tJK_ z7sE^8^-%d=122c4fGgpXa232Luy%D0s+>1Mjqit``sH&_^6?l{fBqJ#{}+zg_#&ur zy$tI4^-%p(fRevyD0zH4JP&>u>b-w}i{P@HmHQV$jq^6B_t&7xeHGOFc^g!}zZ+^? z_Cv|ZSE1&~x1sv+XHfNg5=ze>m3R6Ls=OVJRjB^G4Ql+}2vz_0y7Y(PYT}Q>HSo;P zuAeu;D~P`u4#9_^>hU|s3IJ_CEoDajD@C#7=u&Q9$2lf7Iq29X#E`T{Gxr?CscN(hSUJI4)tx)~( z9;p6!03Hs%05zUpgKE!@;6nH(sCpa{;X8w;!BgQqkSci}gnG~ER8sX`0o8Bop`N<~ zs=T*BjoUt`e)$Ac{%^SW@1fdrT+z1gY^ZuIhI(!plzd&`(n~JA4%KhBLbc~ED0$us z4}qT`^b(d4iQytBx!eX{2LpnBM-b-`V^b+ULj0S$;CCb8BEshh|AR0@=;QvAa5q7} z+X){esBQYaknk$P4dfdns1JTZIG^ww;)@ASaQ#NYR|zz~?e}jkhFUVev&p}Z@OxtY zgy(TR0#^_;p6?~-cL72D_AH;;qYSazsJQ_as9XM`dY59<@yYWICx#K0hhzAgbLSxBItJl@$(7m2rF%p+2{Nn z*RLdeke^`TsA9)5?w z(&jC2_trR)WPWes@0SSEgdds|`{xxvdO<(wm1B7B{U*ly;1uEOgmo_Mzd3#zt|46R z;yzr#v%~O2!X83EJWtrmb&jClIm9m`yqW7?64rA4VfZhEEnMrjgD^wrQH0;KU3$Oc z)$lCBUG}#5`~UQpw0{5xOp5(ubQPCNUD~;>jMeb32pb3k+`F0(a(yg35$g9+!aE38 z5Pvy*if}mB55U(Fjwa}LBWYiTm%<}V3idnK?{?S1b?*A_;m-(<5SA0ZKzJ_U{}Phl zb9q+3%i*u!g>Vr5FG8O1214>1c6k;57U7=>A0b>q_z>ZK!i!y=i@DbC3=40Oqp;6i zKLp=J*iLv>rtFPepXKuW0e+mYp0vYU+QaY~!o7qGNWaph9}hPXe?I&QA#~|iz{?0f zBCIEDCeOL>6qx*;$Hmqp;&>GI-^%rUgs-`@-#LzP?|WRILpYY}U&HfUc`xBwzk3K{ z<_aGrJks4)(g4?Yz#8E}!WKgI_ZlLX68;Zi8DS;)3xqn?`hC>G{5_k$n_c|3u$%Bd z2`?aQB7BZ;Dk1q@L^%tIoZ=Eb0}F&RNk7J=Ep`;HB>mIyX2Jy5$H7+$4AFtN@wHr4L z4|siJ)kfXx%hjW)&>zZGEB=~lsamrsJR8RTx@w)oS|zOc%2%yqZ*H0jYg19U%j?VM z75p`gxLz&$BZX?Mo>S4J^@rm@qg3~|#+1q)3lOJ^9upv8dUs7g?diW4kHbIT%Rt5e!URX{mEK&D$0|IJkd>!&~Ipz!kZ^U zhNzMYdpv3q2DN}|T_%tIISGih{&}4>*oqVWdd;uDtSK+>wYEN z|6v^E*9M3S}{kxNq7Ms=#-Zw@A?VUmd07DHa1#3kJAF+ba| zY&L%+tks_on)r!>PCJd3Vqi<4f>7gwI-;C6ILa)F8vL3QF05N zAsuO^V=JvS1+4J9ho}9K#+Vrgie}D*HHR?IMXer06{}s6Sz4_yP1cwRg6x&hk0`ZP zmnFBPEXELtiCVS6EXqk!YYdgX7_G{yO4EK+iR+9iC1l2RG0DkvEor)D%S;QBFvQ^` zlbvZz-EECje46E;-i2CFf2uC-rIb~zB8mYGuNSI$vjnLuQ~=Y|*Yr<%*XA6rv5d3? zY|_ZE9feuzQm$GqqgPa8^Om`vO>$`=K*`w^q`Ir(GeBj{WLjy;=_qC@Koi!d)ze0U zyHQJWsTEdxC1YVkrL&UR?1`A0;vJ zM73O_6d+|K6m?6h*uGtA8f%t&-@Vu~;_8nU!gARfBrTN|dz|E5^?aPMB z0(r`l4I|*y%6K%Q+>yUt zW2QE0HCZ5;K}*xzDwkxjra*dkJM)hfpf^o$RkN>E>XfV}E@ZSh%rnO%)U2R3tBgXe zt}bSlFMG{$lr}fJz|Ovl@zn90CR()-`)EL!T(Ra;+I9UwT#!igW7~PzNNcrjOJ%JN zE3taCf|XHgR4T0Ki_#}I%S3CB%`V7fV)-!rk7^Ao!5E6QqZEv#xnJcLGXyvG63b;I zR|~@m(Nb6s9cIso{wOF{5v`G%8UeO_MtHf7Rf+5NGgnia?#IF|_N4iTWh0w1(xffPIy987L+XH*xtQi0L0RPrW7V5| zYs;iJMyu6QJyNH+Y8f-C&zMJPn%1hi%cusn1jRk%hE1y@TF$82z!+bX)yS;LN$Ey` zn>z?gx^$Tb*l=KQXETmj8;qQKEKZt`>-)WJ3j%0(OaoRBAGJ%GjHAf2vwS zNR1dIl0}|mTdvY6Evkh6XrmH(gQaMaWug|%R4cMar@cXhoE$`bvuhcwh3q$p83kz# zlr=#~rVNw9vk685t(>|9t5x0Yj2PS7R=;9H)Lo8|>6l5(&fiQmmpJMyJ{NWJ=3)~e zGtXNaO!{_{u8HZb4RL_5i_7jc*H(QjcePlWa+ed@s6wo4cM9vGd>(DTjvYRZgo4ca zA=Sn#<=#5XIP=GMtAbrsv&OJlA@#>SVlFqcL1UJCCStnMTuHjj7S+U@#Xc#CkMTty zaoT1W1x~bHFha&+i;0fLFe&GB$J6DpDqH-Xc#1FDRZy?zOubIwZWlmjavQlj>cW4~ezc<88oqX8y2$#{J~e zKojk@3kpjU{&?NXaN>E2=NkL&_G9K|`$ z`DfES)?J$nfcC3_bK9u{w_b-QAZ8?xuv#@hZJQnr&_pO%O#y8ij1|tvl2qYf++zP&o4WCO4hI?;NNa*Mr&f4r9)TSQd;s1?hSnu2>bydL~oH zUTvN9h7r-6r@d&ew=t~C%!IoXFaxxW@itbOiZPC4rqsqNOU%Y9)+utmBdjm-HsMtE zhXcG}o5shP$yT_`%q?q?8JqT3Oy1muDLLLK`4OHke*zVc;#Q4HTr!iVqBz31_BKt1 z6@Rc=lDiE7v&wuv1(K$#SCXy$ScvPj8m0c3xqSj{kH!VfFbZ*tY-$@A_t54jCmTHW zu>Q1KCwCQ3ec+poHb9Zd)M4!XsI0ANB;RMEPtqr4HLJ?jMJ1~!G572YI*14KcxKMc ze!^*E&1~PeJP+b6b3JpgFWRD2_CNck_J`(s6}>f2|8S?R6Lujr2%%?nPvTW#=oXIv7|7UuxV*1vzJ>1gjCf=sjS@h62#{DKg^$6W!{#aYvUIwvq zWqWq(=rD%QE1jhF4qCyKV&_304q@w7m8qGokgZC(n{(CQ-5S-bj5Y7vPGDBLHC2-L z;J9>ZLu*vJ!EshxE1u4np-MiynT)Y%pe%aT<#yF8_C3>x*Q z#Cj=bsySn6^CXy>C?9XASf{*PJ)FChQfr5~-|8*ZyuyTJU1rUpT<$uDf{r^!tksh& z@h)m6`by`@&8FGO?@|&&K&Gx;+MOB3-i&3{8UtAqj5?cxhFCAx z^PHDygwv-wz8J)?f!D*x7k^{c!o26UQS>8s?3PL$@1;Ab768@mlV#=^v75w z_VMb(gq&IKP|X{yP7)f}Gf6MmSknBYRd&CxPEPGd)-sMW)jyqcoxo?!oiAj z?wY39R(hk;lg8I(y-QLcTgTXdH|+Xj#Ue?O^_#i&(@D3r!XCt~8ENlg{BQ?K=aMafLN_ppx<|vH zoQe1Pg+|x#(C|R(b>j%<%{rF_FU5Cg_X)Q8Wsz&xqob|*FQf$SJJ@5wBOHJLOCinV*3e5^WGdC z)!c&?$bJUWe9$*8lR|aI+tS=uYE+6|U$Nf2cgi0sqR>ZXn)h;I?vI93&Ar92G95Sf zPK3q{SZnTMpIhSq3LB){+*_Frnb+;vD$Tt!a&fP#&dfCT1o`G3WS>*$nFG5^p*{q_ zsBhj|rz9$nWWYcW$kZ>Id$hY3`>|eWhYhDhE_M4x&5_VEUArdnTIu zYRx^x_L{lbM|USJW_XGie=}jJxtG0r-%O(a$is?MmGg+vlleXo%vAF`wY<*w5u>s* zi1fBT6n@ElG7`@;_u_if=r9rt&{#-cmDIP?PCHMEWg8HXWzR&%-9CS3b!_Y)OQQbR zszIym9y?hju?5wqDf%i!!F+`xISNa-So0wj z=A&YB4-?H_)4aD_LGw4Nqk#QQrF`o%6eUk{dOwE857jk&;Qq`5n%EstG<2qW zjKZb}qXAZD1W7$%7wP0Kowa`|oJf)z{y;6vhxI5)Am6+N47N||^)!s3(9HHWPBZTI zuY|tirDe9rXa!G)LDB)Ho^(`^2^hySfw$h2!g!-+irzY#iz$LCa}ngD#>T0y6gT(r zorwEnhT4u;iQ|;y!0zlEVx;B3ZtgSFJ(2m$;QM2|l*z|yn9ruxEuo1dXGYO!=K7o~ zw5vQ#XE%+WrpS4e4^@+G*W9zSxo5u8nE-Z{&aX*3>Yq`vM%~O=>7-RSc2xYtbcE)~ z_Cts6)slii5Td8hdFf|3W|DhrIRHn()(3nyf)0&PqHPgh-{R0p#y80l_$*e@l$Hfn zmP|4gOQtm<%D89l^|7j;4k^63pTU}p5A4ofu8C31V>+>r1~OT*IxJ)kFc5ktI;qY_ zSMv;upToFn?%j!Q_ZOqtxSl{EmBL8`L5o^ur0thEP7md*9x9-f>WHb4TdOPD1RP8yimiU7Y}bLABHQ2Jp<(=>H590CI#Jo<8HU^2W_l~8 zPc<<@=2p?n6x$Ix_^ae%9Vpj;FWQ}1Tt$zIg+K3JVc^fKr>63KdXD6uEwc}H22VCHC)iC@U0Cs=YvUG z@gha-dJ-?IhSbnTq4vH_b$}%~L)Ntk*)M$xM*B?b5b9W_>3=4;Wh(shRPccd`3# zsroie?>%#&on<13!@=Zakd{;Ah3(~Z4pw`O=21r-s|0)BtR0S`!RBHi$##jUT1HEm z=B8_Lfw^joW87Tksn!%q^Vkk=Ss{#*K5}aA$wlaf0QuCnP3Z6j1INxXBS@Ll4n>o> zlbMj2)V?unfoicglZ3);Z8|#o&uiXUlN#@9>yoxeI)9y2pK2Vr1)gr=KhxN?zoo-6 z%NS*L`j6sPV)2{_#;i(jx5YZ|X0-~-PC4X|8Y`x~jKrHg`-`fq-4 z#!<+{V3IXWhKY8d?fc@{S&*a2fUnW`P#|Nf7(1AibTlg2jhrrGEmld_YB0KSw-%}_ zXW@+I;7qkN!E~z2?8SgNa6hYRekWF$c0t+)R%BiKI6ZBd8=Y;E?6K-*-p^yHphjAz zfnDa)g4WBjJFq)n9mB>QnZb(FXckdO*}fQvXSB@oZPz6C(w24X2JDAkt=oyQ(|R~< zK-qy&Bhec|1e4LD z5Q$$#wWVvDR`{Zuo}o9l*MhNZ&o-2-jP1#N>E}Q)&`_mFw^{!xa z>I<<+ZL2Ku@1C|xO5!%LSz8M%+q_AaaSL8R=@tHkz_d06F4-O#(J~j$Oe&WWTOU)Z zlX!Fs@9%J8HeW8UAex=?i#C_odbbYmllNI`h57Ke!oNV#a!E8hivx^OqyhJmQ?Sjw z+Ei`{cQWL4^e9?dcNlFAzP34N*Kme1G7ghgN@{3y*s$5nvS-Xb(SMMfM?IZTPpy`E692x(~j zQ^^;9PUN0xl2KOM6n3+d6NSwD%ueQ~d0<`z)Aj~CJH~i}Ka^1(NIz9}j_=Nw$TCO^ zVW&T*zThFYV98QVU-Rjpw!avT7^QUP(l&#`$8eF>y;sWsMx4HEHMy}~I~r^?mTGJr zfN53ClX&KAIR#EIhle)y4{VeMm)x}#RPX8POK(UPu!@r-iOdpP#hIhSI{ukgsIwF~ z!PPet)0`$ykMNV z!#9&EE5TU!c>ZRsZxU=2l6xQXG>=~&e;6~3LxpjjgfPGM)aujCJ#=1@aUb)r?Q|ij za5kOcZ0$fX+`ILU{8&U(I2MwO(dPalN5*n0>&Rfr>_F7DY?_R#+3sV_N`;eCn&`m& z>GDdZB6>VApXp{QNZ`vc`5f#g8m*4dE%((6vp6}m@dnU}d^RA1&Z!>ndKzpt5LWL{ zXU>bLmN$4{x7jSr<)v;NDOt^|(<8Y%B%FNh#@}lcNN#@%Wo8OWd3bs_KPj(-TNF%Jr&v0t`^v=|5N!U1k=MFOK4^6!jb{yIZ z9$;1HD_YbS9gGwpXi6A1TOp#u)tL#qQ{-Q*(=mH9Da38k^*T7i;A!ri>h;!XP1rYs z_on%#oeDnZ{~W$-jBw)Wl!W_1ozJ(zayg<)aC>t=T#ooWlYjKr-FyIDgx`Q=d_a2` zq^IR(m*3KKY^V=4yTek~x`2~E9Px~g*0aDj`HlCM#T)Z=TwVkIMIM(Lt$k)+uASTj zN99KDGfNQfLovAxV5)JAs(OY#HWHLQljhTduv9cJxBcE;+z3t4F}+OEwmWWh&Uk0& z+Y;6#wgQJ$E$?F6GGn}L^KIkwFbAD1=kz=$V7S?tIw(w}m0sgtF0k;mmT=D9THV~* zYdIf_=7&z-JIB_?x%52;|493*bhQ1SeOJdb z>7s}9wG}RBL-uA;SvhesJ`ba&84M{%vz(`=5#|mnPiiR0VX%?KQ>XoWGo(>$tzCTR znS3ak(UO^OMKh@^BF3>Lg_dk6%vfP#xMNa;#o0-7`==0aT#c<<^SH5QW#g4*b&@A0 z>zShiP_XuhHd|_2CN06)jc>A`&-Gx3pL~v@uVwH({h4nq*1b6vU#q^Z(j+t$?_6+tE)RY?;XHU^>F4Rx-T>5c| ztk~rAShjq}$&+(KK5ZV=SnmDyU2c-vW``Q<&uJ2zyE5Y1oFF6G^Ry?mrU0YG2du+< zMHG~=X6n8>)7_wzoU=cDvC=jaE#Yp{cAe)29HOR0Xmb7+%NWhN$~t#s*^NWTH$xo< z2CeC8t*VUrGHSZ*HQ19_7RY;YoH+aGma{Uus>@8v)(P|2enXo~3B2x8{6mQ}s>NH2 zV{k82?4V~bc$tx`lv&>+!&eVt{!xj~zn$U#-e4?qeN@?!NK}*E@8Hu* zj-j)+XO)QjGW_Y6wyYU^xBD?QF zE;;*e^@N`udNV=B0z^AC@H3`mCY5>L(zE```R-^{o3ki7mW5zX>lhO+4({KY`Pyu* zJxE#~Q+4Bc=-6)IeZOUmGBB^Ue71C!I%~#d1QV;Bo z{SIp%OV8Xwyc1hKGdfmMJGw_7GMn%7WZTQ$(I!oj$HCA2>23{=2(!k#ROXUB7Ggls zePJ;y_3+gYDnQ3S`XnUtVhr>7Zn5_+vrVKa>0Tt+A)2me`_2smF}bPl8?gs*+*PLe zA0$olIT^MzHaGvj4=lSH6_C{9c@Fsp4U-|8adUKHUAoogb|L literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/id/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..25f1be6aa1bfcd2dbb3eb60d344937e594af891b GIT binary patch literal 2833 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 BFFXJM literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ko/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9c359746c219c3776714487a2c1006c79b3a6fef GIT binary patch literal 19547 zcma)?34C2uz3;b-(judPOtM>sGNrU-4l;B|X`vHM%A|s)$!>D&$vNQ+4Z$n7Ls~-{ zXbVkAAuTC%>J^E-zNU46O`+DpCj{V7=y>ayIguHJe2f<@L1Rl zPl8XvBjMK}|9RhY3>}X+-Sha*JBL5V!zu7!c&kf)2C7{P{206+N|Z;T#(xHCoUcQ* ze*>!hJMg3MUHEbMXLtoX=95;Q>F`X_H$&CG2abgILZPdvy#Nn` z--a6hHK=+02&!Hl9tGcnpMZz^wjUp=-T6@CjE9=vWGH!NL9N>zQ0>z2IJgR`-6p7Y z+zOTdWq2xl37!q#gzE3$QMTSuQ1YJyCFdxpbr|EyuYi(wBGi7)g4(~&K+Qi3HIFtZ zxjNvjE z_CbyJ29zA{z$$n+n>!X>3bpv$&A z{3bX~hKG@^gR1{&sP;Lid2N7)!Y5pMCzO1+>V1dHxqv{{@%+8`OM{9An2n z399@YsCByB<|7piK)Vj37!{IWhepW$L%v%o+gM(0Ve$A!74G$sx8dUq&q4ekH zQ0MM?t~gQfLiwi)O;30wOb2ga5Fp{ z9(jT3{Crx8m21k^ZRfLe!6SN<^6I6W?Z3zU95 z4b|?Ojz5Hw?`>E92dH&8;(R*~-|-Tt_S2x`yuT?sHu2^1I-{ zzq4uR0s^5N>KL|CySKyKGJ5c36hFY(myYzoU zo!h@at>1}Nw%r)0eygCyy&6i+*--M`0ksYR)H;3MmFHY}JH(WFtDwgFGCUH#1XX_@ z)P4G6C_Vn8<56Sn`kezc-c?X?+yEv2?NI&9hmtD=wLVLr^kya0ynEqMaGT?^Q0w+G z)V}P4s{ae9`~J^R{hfS~Ex!Ot&PhJ6M z3nkb4Q1ke}$-Z!B7{kbdu1C;)L0M-8E&J2ug-+(e=3x`b&heU z`{iE8hv6}#`=R=I32MJzh3fB@j)z`i^Us3Pk4aGX*lkey`9-MqUGR9=1EmN3kpH|_ zT>hWoHKdQe)b7J9D8F(pRQqOl7R*AOyA4q5v)h&btK+wz_H`eWoNvNo;a{NUebi-k zo~J?8yA-OQDNy&@O;F=zpvHXwO8>i{*5fh9epmhy)V{q6CD%T9BK)=E2T=W;c)9Io zJXF6|LCG@-YWz7+>+@Ntaqfa@w-kOHZiJF!m*ZY|66seUTkQQ5O8#T7u=;;7)Ht7l z8fUUg-vrg)tx)|nyZlzD@$ZFN=LezA%kxn3?1dWdyDt3;sPpkhD1AQYN_!4RK-E77 zYTV0Rx&~^VH$#n64>9pxD^$HFpyYZ6UI<@-lK&4-_5TN|-ci*y|1`%l9nXiVHy%pP z8h8r)EcD^sF1-P2e+J-0`0r49{jsaK6X69=={k4gXg5!0Lv!L|rGf?`lz~#5P^m3?v*Squ+Q1u6(`g;*-yzfAb^8=Uu71X-D z110DCE`QW@w*I+L{agfP&##24e>IdG)1dmh4So_fL*;iut;@^3(`-)rzZ_*1BPd~~wSKN(7Y$3XRSE!227IWBPJUvT9Q zLG`y4s-N91{j%ftq5At7yb-=<)=XD?wXE8TvMUe_ZFym2T=2C zgIbSe@KCrJs@`^}ai4{n#|tk1by!9EZ74lF_IlgT1@LInmqN{_25Q{f;o)#0JPc-_ z`o9NC{tlP_7?d2_pxV6*Rqu7jx1mq^_fYa2hp`gRhpIoxvDUExYP=j&KmP<(f2GTR z9LnzQgqru);NkF_Q1X8lYMtM5>EA+~pF^fwo&mLv)$n{c3rdbQ$Cc3RE7ZLD;V8Hd z;#zvYgObm`!QP`|pw@33JOW+^CD#p5_2#(zTcFl02G4+ZL-p6~%3p<&>-$ji`K8N$ z2ddqBQ0s9the-N(I+WgA2sOWPQ1iYKYTR3)%T>ekVy_cYUICuc@r031mK)&3grAWY z{SG417A4?`l-~t^;_^-)?GwKQ>ZiMLoQdH(k~fw3BZT7!hmpRB@C{ck{0HGa!g)&Y zYav|V`Z5{(sdbTKpuVr)4nx8hT)wcAFom)sU0$Q(@#OWmxS+dr5_z8_==W*DEED70 zlJ^wxTU=WB8sS31L9YHy#IGYyNn-AMdXgpZSc59SFIiJuQ& zBItLdtIP2*@6S%CbFJSQt}JPj-m~!E2&WM`2wj9L34bEYA?P=iHh+Vo;aP-JiGN-N z{7xdsHemXSzwN|+LHMJ~X@Z9kCc5;E^r7GB@Sork!coMZhSw7G^GUx6*Agxu$bS46 zAx4-?7)_`qe1dQtb@jW5p!dfiE`0=X*@f2$`i&>Q4!&qod@q1igkxO&4DkmEy9oMS zMSd2Jfaeh2F}Zw)hto(0F8zJ@Wfvbs{`D>%;Una=lDMDnvdcW2ypb+`8S!rtU+mJm z9e)MaxcELepYR%Cz~!xSd>dX%ANu{6@Pdiq@4_DuZldfhcs=|MoJm+s(C-SuR|)e7 zXA>SH{4*i?eT&E(+MVDs{tA~8{+%$w<+Z~FgdK!WQTJHFnZ(DzX80SzOyYOLv4jhW z>!)u9M-XnaNpBncz{TH((F%qIN`Jd1EMVL4$1VG2RN|F$rH?{V>KXfuIu z3h681xn*@4h@VE@LoV+OxS4PTdB?(Kgzpg!B|U?XBR&frP0+88a3^7i@GfBk;bFoL z3F`@05iTeEk}!jy-(JEN6SIF#2bU2}rO$tXD+%8wRFnP^{59beH{K73A4mKT@P7ye z!Zn2N5}qVHLHJL?9zyi{B9T#10)B;XDWOVzp55R#r_w=*8GlBsEtSjqb*({cVa7W< zQXFN$RYKb7>Sr4|Kgn-lnxV)Y9f)2Upt!JnK;q>A|!iRsy( z`9o`(!l}qKyqkD79%L9VOW)~akoF};Drv_aRyeywg-9$}ZRuMuC7urIv#B%#o5Gn0=1**Cv8mVrJIJQ|sj)@0 z$+|{lu%u~!PCS_m8cNMuQ|Uy5U!O?TFU-8Pc$+sdkx+0I6iL^c#jg#r*?6*%LCZ2T zF4J#~lRH1~(*apNgJqinzroF7Q7n-Q#+rt6(y7LDtXaLZG{xoz+4wzyKSo_fC1d=_ zY-(dF-9{Z&Basc#$r#HQc+5G7rDMr@6HUbH$!7D7cr|xtgJed@1*x=u{jAwDYgE5j zDOz4eF6G(;1KBx7^sD@7@%d)hz^_TCQ|VFVMQ!ub@dm#(5dh)pnOK15HY0Q8aH-I-a4v{@R{POEW2*YRv?uZ~C!`Ic7_XNv&>C647cHEVfYip)H9Rya5O109d=3qWc z>`jiR>vM@1BPN)gujArmld19Rnu6xQpA~Bk$Zl@Q8QD_FY&t$a$2^eNT8+7}hIo!t zI*(R}~(6$vfLU|c;28{*hXha%W zEGX*aL<~i1sln8Aa92*-XJv5Rn9Vaaiyf3(}jbM9Rw1-ukBbsk?n^B8uYFrBaD(T+8M}Hg^!l2&)t2 zH7L@Oh;eG2Wt*KGmW2sGa<2Ad+-N>cvgwpFE@(`ynJF?%sx_HN#TqhRO+%bpb-&xt zWR{l5R*Ec^SMzx$g%0@*X)Xx=t;IcObBk^C7hpPrhH9@S!EsC?d7Gk(f}~f|+>&kc z>(XehSCcebJ6V?>Cb^+8$QJXg7-qZ7xrz!Z^jXF*+Z50E3pmC(Ze`AbZ1>pxYg?uL zht;_PvKYJsTHnG&$FfBo-NFD(SoKKCyIb%Uycz>%blkyrc}OirZ8?mcwe5 zX39;hOPu|%y_b60zcsb2OWCuu4b7dM@S}r8Mw&~*-s`#rOh(3=YPLzMmWbt& z^-aYMEGub7!L$CNR04f5raRhX>O>BXMy0oSGN`J{B?E72BHj}DkkfF2?!f}1i*4Ri zBKFpej;9wz>^U`#1Cl0Wwu)1o0XNq?@cgcvnKe-Mm^$5bgbFlqSJzS zV^h{EdNRZs8aM&dxXR2Q-x)-AEk?eoOUA5wt^3$`*TbD6N}-U*Kr@1%GI9LRfkH2c51wUE7+=+%P4A}P0I>IS-z>f0Il$wF;eLOTUC$G zJY$BRi7mofMis}7sMGO{C+icr2K;&%EL)?+`pGdakg*8J8}Gb2DIZ$_{nYySAPIc_DN4o$Mk+71qW zw#l1;p=6?R)Mx0pl6F)!wYYJ`!f}kR(JtqN3L0^Jb;=7~>I%{?1Ba6lbNlsyHOK1^geCvunNC3l?~@ zTkv$JrV@HEpitIu$fohaiJa&IXWPxNx~a1)7toJP$eb8AJqkZ3UaxCW5%wSzT|-J1 zAE9$}G^vq@WtwB&oKyy{6q^%8w0l;u=cHPZQc}B^ds|zb_Uo~W2trR*1q?aS$u=LS z-$m3LAUSmsKT}Tm(ZKBw&riy2{!49 zBRn^kG&USr^=2Z8ZTD(r0`$k)J{yf?oQiw3##?jnkxKi@GZkHGMYv3TI__4()|}7N zq`03pi>=pqwb-b7;}jI5Wp=8ho35VO=8X2v-tkeRQogg?u71p(I(AStD#}b6uaBhj zYFGe$m#M{YYOfvrx;9?3EOF!nx}y{=x{8dy;op?wwD5jRF63cT+Z4xgMv|Mimon|w z6m%!sR7z%4&{}?gt&wus@{~%e5mheb?6=gWt5WIk`WgRv4wCC!=G8{01X&y(SH05z zFyiSJ8ZL)&XT@^acp{ha^%gbHeVvc!nObbjZIfh|v3=aI`i_y{Ta0<*R8)^Qx8SYS z8u$~u+SGzmg+H z*<`F&bb+EsbS8==QARa6xC#2hVQ#RRWYo`(^ueo3H8yhBN9$0RY9T9E-{j%v<3FKe zI8Vfr8ROJt6vzK}pBJTe((sHqWYXJt^YJ-z_E}pNFAX@4H%*&2FNv36eT`^nJ(e=w z%~;P=#*19J$aydG&V0O%di%cTmB%VYAA7u8a7Y%i?)JiWABx-s=~CrIjAFjvnMX{< z%cdHWL4fT`>19+ky`jo^m(~7=xq;pTRWmb<@rJ5NxyDRYU5e~Ev#aK!96E_rQ)1bm z+Mh6P!uYCjS5%F^(jR|G_4x4@jJtB&xDhk>u#&@xsHzKM&9s|2eP&Im_wi%LjhKvg zjXP1L1+Dh8?AS#(Uh(8retlCcoe8p6&#RkSbw#P3c4R@2uBu7abHOGXtNknH$Fn2m zByxDWRrm_cnQA}TVv?Dw$6w{!=+)z{8gXltb&4_1)&886++_b^WS9}lAV6`eku#FJ z+FzI&p^wbrhCzK&4p(j|EL$9I-0O$!Tf*Kh<>hy-%ilLpD)PwB?;h~N?!J8Qmi&r` z!j0{IzN<5;SXkQ=uIlj$8+yX_XZlEShc^=PW}_YduQfz12JudEWK3SCd-pWNx^ zP0jr>!`^n9dxfrl@xvF^<=Z>_{OS$irnNqU5j#LZ*!^s{yj$H+?uXr5^1Ise&-Z)b zbL)os7klAXw`j`C7c<_v{N^6=h6ek6S4uR$d(aP;_Jxn^3^%Ru!=CnVPj^(Dzki*d z-~K?jaj{=m*RIyj59T-Rh>HJy-{H13L%Vi_{Vy^|_%K~tfrfVXYI)c6RCGy&u)Qa$ z6SfZy?QZv3WCPPsCp7=$j{Mp+1`qXCw2$(lFB5Ka)qt8d6>c2x?SzN=9}Ii;G9N!2 z=pd`GVO@UB&ity5{HiTuqpr$le4so(+%r&E-pPFO+xqfbQK+uYLT6`w*KR-T=!yDg zs=a;Yn|5L49waDq^+ak^R7Le3u3zhEbysw-6BSd7suwnNg`2i|AXch~)rO>%!6k61cDEYxoN&XP4P+44D#IAO#g)ek_(Fw6frXuBs{V({1C4G$K zMGa9whV#O%_QJ}+@X=0+J*#6r`j=n1^?<8TriBRi^kBFhrL`-Qe{c)C<>jASlHcB; z-dK1v0r86`t(f6tVetH>?uzf;PVVx9AQ|l({ruYQ{9}Ebd(A|vysa->zN#|2r17P8 zR>M7uvJc`cLSZFF!OoyuS-kQD6?Wz~Z)9%m`K{eL=NJ_fva*sjIniXJx@=<)mdThe zkChD{8OYz?UlxmYs%Z4`yBEv8*nBCi?YPj@Ypj>u0+U*`BYdu_uyhNDr?;>S`OGMl zO>}N{VmNIL7CyhZk2gm6=$b-zm$aHaLb-Z|p1~e%+?((3_N-y_wSU_?d}-k}6y>V} zg@<+&+7Vs0qEAgR2ijiRpa-hNwiT9ju|OJA2Bmx-Bgx``dY! zU)=1dA}U?2(`YV@;kJ0FA9FvbJt__n-6rAoC1LN{DCL&FRKNT?V)2u=c|cq1~{?J$UhP{ZhsUuwZthG~r{{#Ad-Psr0Kj_cd3X2L8%=~%cm zW%Y-(jjom*enkt{rIut*w=7RZ=j>#D-MVluKEVJQSUeC?J52gYBk$U+5~@rq%O#Q> zm+EhEZT-Rn#=K%!3yd7)#V(7D9j#f;qH7rJ&BL$tZ4 z(1r0X8AZ2>4hJ}xL%VmI<@~$5BpTQ4I@S17R0x+Ew%#{{K2M2k{^E)IKQJL`I$~s2%sk zike^A8?M9os+b{5#+Aiit%0+uMSJE~lu8rIoFOibV%ul>^GmxKv4a~BhcfbnBERV$ zR`qPn5AAV_*&*XSl+}^Mot?TEG~J>wvH}|h^UrbotZAV!KD$|vt=&btEG0UZr9990 zUU)X^@6*KBn>sDF)lkhJ&XHs#yb6uYs0m{lCK<9^j&$rQ}dG<#xiW&INazD>S=l^1E5 zc>7et`orjcP@gOSiJWDU^*g<#dv9O^-fuo{(diV`lx-yH0=>QL{idWSB z@30T?UrWARDQ0Xou65DA7567Hc(TvMl_}M$=903f!RYSrlT}e_v^ZLy@{;IW49_!0 z;DGI9cv#7Bv+;7m-o+dP*{|p{axRwkX-l@Rbq94sS@lgF`TM*51KZ^MYD^dgziUU? za|Z({EyWJskJHI3*PWpJN*;e@Z$=MiQ2LPXz)>9tS3M>D>)uk#Uca|2ZwVJ^`4wJV ze=q-7f4HmoqCjw-11K;6mHlXKKX)!{jwS*c)_6J%;Txj7D?7{%UZn= z!%e*$8})%zA*PWZU54Me1kLkp{G$IQ2W&^dnG#e)qEoG@g#~h?NM}{4R28KYO|UgHQisYKP+FL z07kn3Y@5+se)^6fx55g}oruLQySG`ce8+O+@$*mb#qM|(r4KEY`o*4M=8fNSzx*`M zc@V=L@W{1@9Q??yIIz|iz40<-F6QYAhkNoZ;Vtr1$rc$E;!@gXp0=_{>3z zfmaD;qFp96dgPi<75Ozg&@evTlnrPyaQ(cYUHzCG9%~i1)L2h<*2Yd_fVSfWn$#$d zODgPM67Cw1!|mM2!fGAW;-{L2&D9@mzVpKSIG{AJ8sj!OZ!_%?FmCDU<$N$QpO2z{ zyOAZ>&Ru3)I_^d-!hu)SIsD#@Q);59JDJ?%PPo#;E^>jnD0v-5qvoGnp6}fguIJW_ zj#=rzX(*3~}1mm@R=yEtgfRTPUXRxw>}w9KT3hMA z?q7qfrH`DrC>1SC@q?1C1GH$d41k4ib&7u(;)-BR-8;mU>b>DCi>r>M)VNwDz0ck2 zz1&=vYi?8_a?o^L+Q+;5FyQXCzWws;n69<4%+Zxw?6KtG+RvqY_tUpb3xw`9pApJV zk(7bf=EJQ+eorr}&u7Xdm|j;F{qs=qjFxv{<>KI$W#X}z&!^5hN6#bcFjrh;uBalf za@8w}BHL27xVmTL*x65S%#g3ga)6_riw|3uAy2Y>u&@bxVhvS=YZ*0jDqlXh@i6SC zYHJ8&s$IR}m$YJgV=9a>f0!@W{pP{s9t`EqcvL@J)mK=Dxia9Nk-`<7jBP9--!kzF zm-Y?yFVX&)|FOZ#cP^GK(b2;PUCx^_ikY(?eOh+@q!Il9&ivR9asB>I{i09I6WDsk ztbsE-90A3uIdjf6F2%wPSm;P&$#yDlRIm7qUeSx!FZ1W=fvpeck%R7InfL~)k3{y% zmp;gD=>==-O34GVC$#hc4L2bmpG&)ozSaK!Ql$sTbM1u=zIVx-+p}T+ zrE17naqekzd&sn#kNh5wW_|L&cXKa;;Xc2qTmGElYAW<}Gd-ROzEvkrE|{!K^b}CE ay@THQXDt1n&KaHL(uaKggPs1F>i+>insmDW literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/nb_NO/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..49572c078b46055af80d5dbb248530b96d660ba3 GIT binary patch literal 27590 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 Fe*n(>K*j(7 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/nl/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..95fa04fe50318ed33d006752d34b7ad83f00ed24 GIT binary patch literal 28553 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 UKm1$sNk>LmE0fc4fjcw$eHq)$ literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/oc/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..8a9f45d34e49088e7e7688b88a7689e67bfbd34d GIT binary patch literal 10147 zcmaKw4UipGmB%mN5=7)vzLXXS5p+T(2pfitIGLFw1DRx)HzD9ILeJ}-_d4m<{pjvD zlL67J2n(p-A|HZ$D#{1~OB7L1K}K0|*>%hPfOQMD%*t98E()bplm%7$``^C(W&%pr zocHT{`}V!(-h0lur|0^fHAvMJ{ax|4~OdKSg3J&AyYLgq52(k&(DBrzsWuK zq4a4&^`E=?OQGg*l`DT9s@=`5{wq-Z+z-|Nx1sd>zI*;tD1DxV?}9Ht>H9iVyIoma z>31NMzK6qiz~i9ie=^kjD_#8=Q0>o!>hA(5eYQfizZCLkKFyExz8&iQStvapa(oPG zU7vz_{~4%$cR=a!YsjDZ13%iIy$>qe9|hH}2Wp)@2sMvE$BnLj5~|%4JPcj}HU5oI z>vX3p-wmbbgHZZB0@dG-UHLzu^!pXmy1e3^?}Ad?nggKfmq5LLisK;EJjS5b<)iSu za1u(7E1>kd7HU6kf@*)8E8hb(zXzb&KL+i3LFxYt)cemtwfiNM-oJ-xzsDhEfBV5> zDIWnf&ksYrKMXbQ2B`UsyYl%^`Ub8(hSF==@lq%~u5r(Ah3aS4@jfWMwmW{u)jtlU z*N>q3|0%TdaD2|y{|}V^z6hn)Z=uHjBh)y1Vsx^nec-O}P^f)40&0HCpxU1brN@xt zI;in$Q2L(-rN$`Q-$Au|9ZIhQnT+~9-0>Kw`VT;ja}tyur@H!nsC8Wn_1-wte9wbg&j~2K z+EDxV38;Q9g?jHw$Ln4FolxW54W;k>?)l^H`O}U+gKGCIls^9rKLCH_$_E`@)*lHq z&tqW^=SnY>UgsZCu2TzYAEx2a@G7YO?t@3chag>=e}~$a-$D=W&S9nbEQVUY8`#8wa%LyC!pSMLCyPTa(eKIKfxd^J=r=Z5a21@TQK=pqYRR8xt zwf_OsI{zcoJfDTq=l`I_c?C+3Meiw}AL`fxHO?xi{zjnuD1aKb1NHvLq29j%s{LJ% zshbB}`Dw`3nrEQ&c?HVuUV~cCeb`LBcNEk*oB-8tFVyp4hzpqWpzL7^YWyo*{k2f- z?u8oXF(`e14%Oew5YsTPLcMp8SL*R@sQD~`>VE~)duKt7({#KTYJIPU+RvMz+TR1! zehz9rKZok?*HG*IN2vGq;ti;^&FGI~^ zyW^u!e(*ym{ho)?>m|oMa31;Jkx+UJLydbD)P9@;rSF6*r%?UOK<(?5Q1iMGO21jh zN1*2SG?YC(3)TN~Q2M<9)&EOS{`jhU{uAE@^afNJ+HsD6%s8t)h=yFD4I z-!q{0r{tJ^||eUdKLH zKLGcj{tPI)8+FgmhniQ@l`ny6cR5tM&p^e!FS_~%9Uq2Tm+wLO`BPBq{%=tB@e9Zj zm=~eiy>m&~?~zdDqoLMgDclpD0#Ao4UHv6c{ayxT7oUT>zzqmpTHF6T)b+O|y1(D! z?kQv(`8(uZpdmRUpsypu0c*iv^D{9Iil-)MC);a#?b?ZHQoS>zt%T;x;8FrrwmtAk9~J7ZF~1^FoQNmsWJ z-=W|kOOX#FMfxk&}C-V)Zvbo*Ik)Ybg} z#z+m351xcviJXU=h1`tjdK+@7y(@i5x3aM(UEN{uQRKU>+=5?6zUImo!71bzs zh^~(ySJ^vb{t6z5Jm|{8H{JbZa4qr~SMGt=AU{Ur`}-h&fviUMMszJh8i;&J{&*Df zW#nY!V&or?ZzH-MMy^BlLiRv(J%oG%IT1M+(N!;DZiPecet-BCWIeJNIRp73;v=^p ze~;*TKQf5ik6ehfkxj_q$j1;}BPDEHTEhJ$u6zPqf&3-1+|>zBARCe0kpj69(RFnR z(+7X(?*9h%BioPx

      BbaxJp(nxk;LDi#M`E6u_#`zO*)VfyPuH02kemnPoYbSlis zny84v+}l8TDhj7fe-KE#flgkeEw9#0v!brIsT-kFufN^SZK+7T)&5kPMMYRvOs82K zc=b4~Z^?IT`>N@WV~Kl%o6#(7WPXd*F&)N5m?b_sg@!&uKl78iy^W(f)o57_&I|2! zRa+KjOn+7%36oAmZ@8W&JS%IxT38fO(wMI}JIr$Wq(On6Tg)oI&QF?dY5CcfoVzRt zGjAY`)2u4gqKiWA3)aD`%A%b1SvsAEZm6=bbm>yFsuMJ#&G%+G8nW=Rrym@(W=q0dmOUCemnnV&b!P+|ufkTo*z zpb-{T-6mG5$@n|fp2+BEW`?%5v3LhBugqv@tF_jcS(Y=QBJ;iZedY~S%$uw&=VrAZ z#bMy#EV187>P>IQwp$kC9=GzOa-P*Rp(WetS({s(g%@_1nyGHe)nBuI!^jXr#xfK( z-INv8PL(CQdF5@_r^{lwX?Zg(+>5oDya-!(brQ|@HXdfJDDh+0rgEFI3%7FaStDdW z%$hI>Gqq0%EOC^C-ej72({7EUgi_18vsoKWSdS063j+3QEyizuJZDhyVWS^SxQYn2 zY}du!`AOi7hg%EVuFnj&?0%J)->>0h%8#REy%; zwl+}YVYk*~e!Cgfa~3-bTqE3fUFZ|6)`gRWS%*RLj>6nJER3Iqw}CJ@;zx-$>L+1r zv=iRiFlscZ*8MtvMse8QcjJ>SS?@L@5nDbI<#jWX5{wcdnw$Z|@)07oCs!!%Hnz8FgC zriK;On+_8M*6u9JCoG124ST2;HtN>OTi+vc*!9pJSCvT_D{En!;|fLHfluy>jYn|s0xw3Y?h84-{S>)FFjZdpyG7hM+!@;m1 z^0<2cO}$60Ho>lD;Vn0{bh4QCF|*o*9g7ZO+tfNa_7RveP&kz4&sTd^o(&NX#0Bx2_Ajk@@30=dzP)} zS$2xoyP|J-@B5c6U$$(~IzKOZ<|p0fouvq`V9~#3?ur`ElSapHggxV--=g2D+~=kB zMI*x_L-VTiE?u^0fWw0Kd$d}8UcvgG*p7)kr+M|JpW%ZmH;%9FSux*E%RL!pJwr*I zsFF1LycH8svFMzhGJa#recouQi0++4|D$n-px(2Z;GOq*N!u3lmCH}_%G;IiOS}(x zy~m%n$Yz;-RH5H%XLv`4%**DRndiq|-pQxtw#V!kUhV};!Xyt{$^(LsV=?!9HH`|N z$kE>>NMMMLY#L8fd^qxyNyv7hi+s|@vYprRBRcf0=hSTs>fcOqgQxp(?oF0wY`0qt zn1%7&_M#EyB*{q-(M(1*&asG~j8$ksf7H@8PIG2v^H-nl7ACOdpoD|DuO;=!XVz9( z=Cq)T{x{u|e7pR0xIVW%Vc4oXN@Qux%@#z`Zk@BjZkh9GGRiqT$3iwPsZt5DK;^IH zs(KTow0^)gnsGmFvg~2(P0VfQKqK*rT}C?^X7#ymkR4`r-chNHnXmp6`7QHTQmY>A zOFA=^_foGsm(8 zggy6K^z?|1wIG~~h&^nzVzjk1y@|Ty$>fW59Bg4lt%D!5A_dWQ7IE`NMTzHA%&zT6 z?6iiBa8Gg$!vpINtPJr=mfR^K89fc>A1ePT4ae?+7btn=V?dgbGFQp-xK1-aYmg-< zm+o$e7cX%Or{q}=7v#}rr%}ML@s4dbapO)J@wgnw^l?A#sJ-1;kL>pt-LPAgM! z_LtOzcu(BxEzZ3s9-a4?)e)hEfjD@amw4?oj^^(6&Bk)s1FUG$W#o1l zcd~)*6Devl^B|4*5U>d|+1XUokmbr()+EYzM`Tg%aX%JR5BY*~gp7Bt*S85eXY#e-G-Efos;$f#@9A5MR#nLmdz_+nqi&|j6L^A z63OhFz8Rh(FJ%M!TYf`9xZatYjrrIrwZ&e1S5q42g1~5l1r5pwQ!VxqS1g-*9Q<>$ zHnq2&S!MSOxG*XPOGsNdi>(({0T=yk#&6E*u%mw9>(J4WPnX;4z8UnRJh$7&aWP-r zZ_R@FIUgfkjeU1PDkfy%>llCTS`9H%fD zAn)QpWYKlKz;^-5<+bMSXoMNIp)Yq@P-CMEU!WLlq#dZ@&b({5nsK}PWqbR*Fc?i) z>&3I>F8Wa5qXB(0eTy({Rz>#&PC?%cKA!=tKAj!h@OJE*Zou>sS2OC9I{9sF8}W%x z2)|fr$X#tM@8Y*o9E(m0V(WX!C7o&Ni=V`~Llm0GhVd|5;fO)R|}b9pdApf2NHYWI#M+Xluy7&1fZC ztEc)t@pYCCC8(-c&2S6uwMy2r(V=dg(u`KNz!qSWe7q5sEC``+goZ;ehc}cq`ecoS07rqK`J#elrD~Iza;$S$Hmwb&a1dVM58>esPgZ zCiim=a%;dCjkT&j^F7r~Fzi+irNB11d4zPXjMuA5(rR02+@bA z_Km2%HTdjpoH!1RDfI*JFnkky z5Pm;=2)+|ufIOnseR~6bAMGLhA^5ZK?eKH(ZSV_F#@~Sa)E9mKpF^4dZ=pQ@HTVwr z@9=i`9r(TQ9dA`?AAApd3%nD`yoVt_b(E7lcN&V`tMJV*gg**9@ZIp|pv?E2=jWl! z_uEk3|A$cC^CFb>z650*UxzZ^e?flg8=m`6Lgs%v)NmaBFkJNg8*qa5lThCCJDz_8 z@1*@_@DBK|@ILrPln^~9puBe$%Kc05$6yX+p3gvj>N!s0vfqND*9%bIzYS#_U-A4p zbpu9x<^KK~byNi>In}qL$C!oyxsP7M;=;NTg z=c?x?AV2j(xDE9w*$WMKXlf?BHiqpy+?i^VgxwcO8n|Za~rRFQEA6ub}w)j#V&L3r{AE|MJW2eL=wsU|M8SbWPNXiqUU?z55l{ky!WVYFG7AQ z_SE1PD8&KB04<%4p z-3~>+yP@cP1ZwyYl=XZZ$~vEfGVd=y8TV<(Pd&#;?D>08)^h{O{C@*Q?^k^L-#otw zrT*PU5Zw*$hVtC3Z?D5y+D}7y?@LhT`3gJ)UxAXJZzJi(;Xx?RUxX6R36y!Cf(`h2 z$dc9HL0qf;1Im2gfnu*W^U!{H2NZiAhvKI>DC_u;=f~g#?Jkt(KL^Er&qK+R7oa@< z*HGg0704^pe?qbEZ77NA>RnLuXh6~HB$WHhP@Y?d;x`9Hk1Z&6cpS?7Px<@LK$-tp z-@Xnpt@?c^^ZuphD^T?OU&v3r1>?!O_d}Wg15o^W%=gbgdH))ec=;&&aoC0$J_AMn z--YtNKY``<3?8KYO(^l9-&4(hFBH8ep}hBD-(G<-ZXJpqU4K7=Vvnahe+i0y&-?pd zfHMA%q4?)dp{(o6Q1pEjioL!K#SU-6IWqnZNSC@3ivCR~^UguiSDislB68f1d=K&= zY53!Vo*#!@#3GL&GswfpLr8rDT>KRB0Yq|Gj&VfG1;-R}4P}*AT>U>*b z_)!Ek)p_67@%*soUPvr&Aah7>?+va$ipZK*krhOa2P>4ZCzph4>8FoDgM0+Jgw)4< zT!@_)5V5Zu6Nto^9FltyKWCBCi1;{0?nS1NCFCcNP2>V1hvd__@`~>byog*z#J?>> zz8muGBec{cBJpt-BJm#~M-YiIiNk%!BZwUDLsCTIQjSvRTTb~nMV#GM-e$@kp~cozXXwEt%CYV&nA?(lbCG#zAex9dkPNJ*9St~b*WV~ zPp!KmSLIosN&~%MlR}*e@@Ol{Bb({PEt_sdwy#cwp@^O?vfOp`O3S5rAdk|wz>NA- zua}iAbIUQg(`U_=OQYN}EROY3>NZo;l?Jo)de)>S39MYkQDE}OCETMiP_<%uHgL(P zwPN!;N;Vng71u7&=c0VxtV>s;T+3+_bku3*I$e`?GOp6lrh3}NF0C6Y(a@^XMV|Ax z87VSta=VGbSYbZOay4y}+@@-}e6@=lT&bQ+;>KrjkyEH+mWfMk4rl#{WR?|hA@;-guXan|O3rOr-tN_Y9aZSxe)wC6m}#@7j4L%FKFfwHd`n%jG&K z)mPl@#bzK*F!;CYk|=j+ru!|M=pw^Y`lfl+j0=h`i_Ey{C$TeOrp~l2lQT3-qb;jn ze&X2!*~?G-vfeOJY{RBHlav}fV$+-;5#4&k4ezP%pv zi)3~g8>dQBmMf@Yg>>3XSud5K%%QyzwB$0X21-Ur6*|=%RbT{Gd|maNrC_{%mh)Ct zuNGVwZA3QB)B;Ni)CHUOUD|)Y#xsg%{ zM^$avW;R#L=y3a;9;8!%dCHom8X7Y}laQRGsxyW6QS37qGFAZAM|^bg`K=R$Wt%EiE>dsT?x6F+&`lIc|+Z9>RvpyFuQPOq}=5A#Mm?yhdgVDL7G}DeLqz>N{;EEWl{q4 z#KqOKjR!{KM28KVHqImgiI;3P^#kisKK9{8RijGfmK;?j*HhzDi6e4(NV+GEPfqE_A20hS zPEH;<%p;RLGIjXam}=W>81VUO+t4PvtpnlS%h`m0=$fES{*N;IOotWeo(nhQ?W~>a6=aS4@@+bk<3~bUm*-qwUWIwyk^BhU81v`}K`mjSihI;$j{D4uY0i%Z7w^ zC$ja^Y*yILtPRSSO9aUtXP_?OZkH8pHQRBC87X@)%S}JBNwlZ04l&KZ*Y0N4$faPY zE>;>?H77M#^NLQSmff%$vFWHwy8>~}s zhdOlK!Opc93-zPWbw+yD13K9-H#=8y9kGsqE_QAV@(v&GsAJS(C*8ifxpQTJR(^{! z=eIa4{E~6y{g}mCja|gfUM6h@;$M}pli4@k4;;=*Z0xEuEFnyOwhVd6E5N4=DiScp5+pr@(L_V1a`{3(SR?| zIswhP2U*cKV!UvGJN5np*?yf7yIT5st{=H@=ZY&0RVvyeMqQs^ufGsttn!XHkLR*H z9pcPRq}@8sE=^dB3{nrje|PCs+7QjQ&+|N;SY4z;(rhRptS+VnMTQ_0jlPS11Om3m zU9}XxUHJfCf7j7#k&QcU=i2tuIv575h(MnnZhw|^Dx;5S$bNz;hAVk0*|nQDQJo-E z1MiqJZDox%>_#q^Ae>{X9<%2m_%T+5 zt7KT3V_gz|BMOG}s7pGwecNWgg*&S4*P#VIo`==S(5B9>ug6ki?9WcK9DRwME>Y0d zRw^3)M@d@Z^4(k?xlr~5z8vIaN)^pZj^uAw4KYj4NFk6&N~GxFr9F?;_O1FDR4Z1F zVOKWTAkFz64A__r2W0$8WVfGY1J*Bd)Tz^{>FEA|oWQQ*YUdA3h*vI{uqTQAnsi(w ztcQd*^{JOcZOlJP)v^-}Nq%3I2fH;&(qUNDANqVmcj}6>7DPMOs_FVp3Yjk}BzCd$ zq#o`q-qn8X60b1goh9%Z_gpffIbJF{64SD6t1Drx7wJqC@%L}g;?IR)nLfQ}`znU1 zhf36twK4Xui}7B&@8%~7B%g!Vex<6;*OkX=ikqJ(Q}|YI8kIG+ZnB@dV1|9;zk@}S zBGWNDH+1>UC7Gm%FZvZ$nX2acCX_$4$dEFE`Sei$23;!MuJOx~tgB5Pk5Rz$r_AlMojva8wyQr=g~0$!eVRJzwxeYaZ9jN|2|Ek3E7)0Q3IVra`qa_sBte`WA@ gjdg0Z&rYs(&EBYD=eMgPfy>`7iv51pHf;a?AJql}RR910 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/pt_BR/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..eb02f6ca29afac1317edbeb293aeff3eb02e11bc GIT binary patch literal 31167 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 R2e;AZuJh!?z|_`x|39h5K7#-N literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/ru/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..8b0241e11fa7877867eb26eb8b5e4a4177be3074 GIT binary patch literal 31187 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/si/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..22605ab84eb7d130864f90ef5bb71b614190e5b2 GIT binary patch literal 18243 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 X%{tQlJSOOy_L`pB&4(85_0InX=8t~Q literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sr/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9f4b0607d6d58cea00339b4b0820f1abf36c0798 GIT binary patch literal 3628 zcmai#U2Ggz6~`}7D40T_l+W;S18GQT#@ThNDs1df+jZKs3ASPvAyFZXcdzXs>zUQe ztX)SDaxgLl9zZFGe9$i{^#vXl$EGHU9r04}fY2TFfrmmL5JDjFK#_Pug5S9_yWUOO zFxor6d*{wQ_niMZclPzWZu_y~D$zbk`{~=18kPP#xN+^fO{sUn{qRHZAnb#q@DBK8 z_&)eG_-+_Lek$hn9=HfU2+zWI!KdMS;l+Y4LCts#ehR)?@C|r?@ttfgb_OAj)X{>E zLD_ernE!h5d=9>!=kvw*47{E3S@;q7UAPNA55?{^$WOh(?N0bR_!;;|_&NBW;QBVMfX3z55T{`Ps4vh@&9g&iTyoL<_|)N_dzJ@o`Aby042`v!!h`Cco@C` zhoOg&aTr0-^E#CEzlZ$PYuqHBze2J9Ux*887b0l52a4Wf1)qQi87I(#FG8`GL9zEb z{4D%CtiU^%d=x$m?}O*y-S8DCalHmbmw&)A6p^KV1`19LFW=%5{FzL&e3zfhtWrA;;ZCWd}?2kCry)meD0%(pK|rn3wwoq#i1wt+Y58{O(GJk|&^|$voU|{AvwcbK<-FfT zqr~0$M|zh7O3rB|^(NPTxeZT8%~TCn(_kS;1C!|S1rsj>W>F0{8peOw%aT{*IAR6Q(9sqs=6Z=JUlx zKQ&LL#q;2_(eq+_`lj^{1&KdhH`?FvbuLPEHHt&bj)iWrnp<}!PMM|YAgl%9Yn!1{(8$U5RF?CZ-F|31mf7Up+)I_w1 zrSX{=buyTpOY?h|{mFch3t=XTo&Q~$sY!z>xegMKeyexf8YDy~S(74Eq9&u6bkUEE znrtQw6V}w^QkeQrR`lTHTriU!IiLqe)3`1iuDhWN{0Q$QsVVYW^qrbcFu6JToS1I( zW?oG#8vm4@ilVxjT56D)2!;H(I``-0m(=57&CCR$sVV3;>!}VBMX@FbThVGFj=q7G z-m#kZmG;ASsrH>TjVMmN6Ul5)^G2Gpi8mEhbl=3dchW2bV!?aJPfbM+l*)&^(ttN` zzb-#eDV6Unl}n|*<9?EQQ=EmQ?x#^)(e?#<)o$Bg($;OuZfW~7yOAy1m+fYDN$bI+ z9!*CzKkTRCPY2ZpPe*f6ziA%9QaIZr)83Tv=kcIDuIME0J8|s9*pBn%{!-s)#F+`% z8#O9g^gP(8`$2eESLggVG3n6bQ%Ai+JMW2)GbZ-N!fGUyU(tuAgS79f-ou7dk~=>U znOczQf&Nne1AP-O}!%a#?># zmo%?4J~A}Wo*EpwU%GBZX|P<_6P6?6cZlN3U&rnS0A#%T|HSdiIGdj*qQwx#V4v*m16+iTd` zA}Qx>OWp8H*=N|}W!gHX@^#r$wv}D98$BCoyPmDEE4FZ=rLt8qD&1^ZxiB{Ixy2jX z**Ui#`*&P<(>FA$H;9j@@-VtBvDw1+z{Ne#JPcwBFIX1$!==9h6Z`p z`QNhJZ=vc%JYPm7Cvu*dZigh=mHhEW_8s0^m0^#xFA~fJHebvm({DX%5Gr9 zZ6yibk>IA#s1M9B}q+}w4E-Sb{SMw@*sQSPhJo0H(4+BwPvxJ zcih63i=89P(MGK6a+;O>i7Uc9u1;3Ox%G^KLf;FRFOrqlkbD4EX-xMhq;oH>vr5u* zRq9=8xy3g`J{+5(26BnhNQu16bt$Rr(}e#N@4D(-r*jrd1kvu^B8;0il1-%II~#Q> ztH)~>lT${bC$n;9Z>Wqe*>7E-9IR^v Q%lTOop{XxdrTlaL57$VK9RL6T literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sr@latin/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..defd1623eeab7c961de313a6a9568d703237c840 GIT binary patch literal 3009 zcmai#Pi$009LEPm(N#pjzxZ!JK`OlRwi3jpt+a(=X-hZkf<~js?AzJh>ArolnVGkx z8)EQah$hAuV`7LV7y~Cy9`K?ElZqE(OgQL4iSb}e^nxc39Q^)f-?j~Eoa~#=%)FW3 z{C?m0z1b@p*S^P4LOc)Q`CtuW6V$#D70QmajNJqdfSbVGU=ExBZwHTp>%o`6TR;Wk z#|)}l!3FRx@HOye@LljW@NC8lAV>dG@L}+B#;f2i^fzF0vNH@~h)rgk25H}7_WqS@ zyaC>U@mAJ91+GK?HSk{W4e&wm97uLQ2k~QwgczW%e^j`}_)$9#=tHN1KtIbs+7(8Qc!;0=IxA@NqB&N&mAT zma?xwiuXH^?Ee5#TvtHS?GKRRy#|uqHQ1c?-2~FSt>6P-2$Bv*K(ZTwWG@EEF9VYP zuY)_l^C0Erw;<))?;x%F3nabQpc(+zgXG8484rVG_j!=^e;K?RY=X4@H0bjI#E+dr z1(WO(5FxP7K*;Z729^u?zB}vPvpl-e*oNkPcxW%ufpWTE9zlcSq3?(a?MJ>*p);iN zB%YmkNK1-`G@$&VGKhyhOVW|fiu9#iCVxqr8}I~p=-lWGH{+pL`-S4|7t)w?CCy1E z`u-6z+lq(sgmQxNp9<;A#wt2>Y%FrBqnwhK&vm5fD7nDK+HEO}NFqtiSVh7qome(z zB0ejVlut!EpG8^NO^p zDmjg2+j&nWMMoRuq-D?PmSjFms<=q1yiC6Oo`tV$M%J9Kcqwg5!>8pUo6%5WM%Vcq zl=VurwS~B_pc38|iHun>mcmMIWh^5H!(6pQU3#}zQ7^#KT&>2Asd~fp>Q(kjy+uBR znl|45RhqGqgepB9C?5V_bNm`e2%Tt+gHV>0bj>XYBUvf6ZJAVAX)$r)WPuNt8mi_- zck$r~XJX=5?7KejQOvVWX6KrIBdiO`_!ev|oHhksigiU- zacpI2x@zeR=fgG|8bp$JRdk@M8+uTtqgb5OQygwkmZF7C`~3p9<^b%eBsV)XduYY$ z{9u@y(D+yqYzi3)oP^xnj)hA0^Qa+=m2TvCc{13yGLM|ANfR7OB26h@;QK1dQrwD=7a-SlgFB&f&Do)$J<8NjcBDfFjU*(A{+Q(SpdqHn9e_go@dx}GkbQM_Y3(z?*A z-Jiy_fiMu_@~$a5a_KD#5${gQtuqpLtK>*fh~Yh2-kQy|R6H*e%?|38 zSUMwnie$Q|%>NTG0E1bClEt#4slt2YEv^#(g|Zh#Z|7c=Y_2*lI`O>nF+)k@EELYX zpP1>Mg_Y$*QCB6BfZ`Aa E0npIy%>V!Z literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/sv/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..f048587842d3e14c5bfb7e846390ca987b9a1257 GIT binary patch literal 22003 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/tr/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..9dc0b4de53fda377444cd399eec39f9ebf957e5e GIT binary patch literal 27502 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/locale/zh_CN/LC_MESSAGES/arcmenu.mo new file mode 100644 index 0000000000000000000000000000000000000000..3ce757e4d08a7e7e7348d82c930700560e66b5f5 GIT binary patch literal 9402 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 CR=S=5 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/.keep b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg new file mode 100644 index 0000000..41fce36 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/arch-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg new file mode 100644 index 0000000..aa125be --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/budgie-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg new file mode 100644 index 0000000..fc2640d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/debian-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg new file mode 100644 index 0000000..2e2ac62 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/endeavour-logo-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg new file mode 100644 index 0000000..2c82d74 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/fedora-logo-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg new file mode 100644 index 0000000..cff31b1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/gentoo-logo-symbolic.svg @@ -0,0 +1,35 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg new file mode 100644 index 0000000..d3eadd1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/kali-linux-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg new file mode 100644 index 0000000..4ca02dc --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/manjaro-logo-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg new file mode 100644 index 0000000..f6dfb02 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/mx-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg new file mode 100644 index 0000000..731c0fd --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/opensuse-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg new file mode 100644 index 0000000..c843522 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pop-os-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg new file mode 100644 index 0000000..763a380 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/pureos-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg new file mode 100644 index 0000000..42b8470 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/raspbian-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg new file mode 100644 index 0000000..d69ae29 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/redhat-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg new file mode 100644 index 0000000..720fa18 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/solus-logo-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg new file mode 100644 index 0000000..b6b1393 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/ubuntu-logo-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg new file mode 100644 index 0000000..4903fd2 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/voyager-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg new file mode 100644 index 0000000..6d15f88 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/distro_icons/zorin-logo-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg new file mode 100644 index 0000000..b0037ad --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3D-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg new file mode 100644 index 0000000..985702d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/3d-symbolic-1.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg new file mode 100644 index 0000000..ad8d2a5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg new file mode 100644 index 0000000..7d03f0c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/alien-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg new file mode 100644 index 0000000..ebbaa42 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/app-launcher-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg new file mode 100644 index 0000000..16e9d9e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/apps-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg new file mode 100644 index 0000000..976ac04 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-alt-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg new file mode 100644 index 0000000..7884f4e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg new file mode 100644 index 0000000..251fe3a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arc-menu-old2-symbolic.svg @@ -0,0 +1,103 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg new file mode 100644 index 0000000..73bea1d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-alt-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg new file mode 100644 index 0000000..2278c4e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arcmenu-logo-symbolic.svg @@ -0,0 +1,92 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg new file mode 100644 index 0000000..a57017e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/arrow-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg new file mode 100644 index 0000000..b271af1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bat-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg new file mode 100644 index 0000000..d28b713 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/bug-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg new file mode 100644 index 0000000..80449b8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cita-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg new file mode 100644 index 0000000..c518e65 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/cloud-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg new file mode 100644 index 0000000..5a34df5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/curved-a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg new file mode 100644 index 0000000..63f45e4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/diamond-square-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg new file mode 100644 index 0000000..a1e5380 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dimond-win-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg new file mode 100644 index 0000000..0760fd0 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dolphin-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg new file mode 100644 index 0000000..190f2b7 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dota-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg new file mode 100644 index 0000000..d874f4b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dra-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg new file mode 100644 index 0000000..daba3ed --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragon-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg new file mode 100644 index 0000000..1a583a9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/dragonheart-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg new file mode 100644 index 0000000..de3118c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/eclipse-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg new file mode 100644 index 0000000..6c40cec --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/equal-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg new file mode 100644 index 0000000..f09fbc5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/fly-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg new file mode 100644 index 0000000..307ee2c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/focus-symbolic.svg @@ -0,0 +1,118 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg new file mode 100644 index 0000000..2ca7f94 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg new file mode 100644 index 0000000..a23a9a9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/football2-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg new file mode 100644 index 0000000..4bbe335 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/gnacs-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg new file mode 100644 index 0000000..bd6251d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/groove-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg new file mode 100644 index 0000000..21a7907 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/heddy-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg new file mode 100644 index 0000000..42b1780 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/helmet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg new file mode 100644 index 0000000..7ce4ae4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/kaaet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg new file mode 100644 index 0000000..9924c84 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/launcher-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg new file mode 100644 index 0000000..e352453 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/lins-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg new file mode 100644 index 0000000..0844542 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/loveheart-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg new file mode 100644 index 0000000..55e657a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/octo-maze-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg new file mode 100644 index 0000000..96aa0fb --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pac-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg new file mode 100644 index 0000000..0554b40 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pacman-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg new file mode 100644 index 0000000..2325b5d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/palette-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg new file mode 100644 index 0000000..e48c0b9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peaks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg new file mode 100644 index 0000000..a346c66 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/peeks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg new file mode 100644 index 0000000..a15c420 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pie-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg new file mode 100644 index 0000000..67553a2 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pointer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg new file mode 100644 index 0000000..b2aa610 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/pyrimid-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg new file mode 100644 index 0000000..b8b2284 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/record-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg new file mode 100644 index 0000000..d6c8cee --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/rewind-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg new file mode 100644 index 0000000..946bb65 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/robots-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg new file mode 100644 index 0000000..a0a2b99 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/round-symbolic.svg @@ -0,0 +1,18 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg new file mode 100644 index 0000000..8e59598 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/saucer-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg new file mode 100644 index 0000000..c1c819c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/search-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg new file mode 100644 index 0000000..c7c4a15 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sheild-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg new file mode 100644 index 0000000..8273e6c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/snap-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg new file mode 100644 index 0000000..82962c4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/somnia-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg new file mode 100644 index 0000000..169bb1a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/start-box-symbolic.svg @@ -0,0 +1,138 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg new file mode 100644 index 0000000..02d87d9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/step-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg new file mode 100644 index 0000000..43a3cb5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/sums-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg new file mode 100644 index 0000000..71052b3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/swirl-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg new file mode 100644 index 0000000..e8bf7d6 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/time-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg new file mode 100644 index 0000000..d4ce9d8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/toxic-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg new file mode 100644 index 0000000..cfaddfb --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/transform-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg new file mode 100644 index 0000000..48cda14 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/tree-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg new file mode 100644 index 0000000..bee800f --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/triple-dash-symbolic.svg @@ -0,0 +1,88 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg new file mode 100644 index 0000000..9474a72 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/utool-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg new file mode 100644 index 0000000..7da31b3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vancer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg new file mode 100644 index 0000000..3fbbae0 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/vibe-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg new file mode 100644 index 0000000..c646eae --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-circle-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg new file mode 100644 index 0000000..7eddf2b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/whirl-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg new file mode 100644 index 0000000..08c3ba8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_button_icons/icons/zegon-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg new file mode 100644 index 0000000..1179af3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/arc-menu-symbolic.svg @@ -0,0 +1,93 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg new file mode 100644 index 0000000..b87c15f --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/hamburger-symbolic.svg @@ -0,0 +1 @@ + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg new file mode 100644 index 0000000..09f7966 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/homescreen-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg new file mode 100644 index 0000000..ba04343 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/menu_icons/sleep-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg new file mode 100644 index 0000000..27aa967 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/arc-menu-logo.svg @@ -0,0 +1,1412 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg new file mode 100644 index 0000000..43e74e7 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/donate-icon.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg new file mode 100644 index 0000000..7e35c7b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/gitlab-icon.svg @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + H: 2.5 x + 1/2 x + 1x + 1x + + 1x + + 1x + + + + + + + + + + + H: 2.5 x + + 1/2 x + + 1x + + 1x + + + + 1x + + + + 1x + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg new file mode 100644 index 0000000..b0037ad --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3D-symbolic-1.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg new file mode 100644 index 0000000..985702d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/3d-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg new file mode 100644 index 0000000..ad8d2a5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg new file mode 100644 index 0000000..7d03f0c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alien-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg new file mode 100644 index 0000000..56c7967 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/alternative-category-symbolic.svg @@ -0,0 +1,287 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg new file mode 100644 index 0000000..ebbaa42 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/app-launcher-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg new file mode 100644 index 0000000..16e9d9e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/apps-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg new file mode 100644 index 0000000..976ac04 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-alt-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg new file mode 100644 index 0000000..7884f4e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg new file mode 100644 index 0000000..251fe3a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-old2-symbolic.svg @@ -0,0 +1,103 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg new file mode 100644 index 0000000..1179af3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arc-menu-symbolic.svg @@ -0,0 +1,93 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg new file mode 100644 index 0000000..41fce36 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arch-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg new file mode 100644 index 0000000..0a1afe7 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-layout-symbolic.svg @@ -0,0 +1,330 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg new file mode 100644 index 0000000..73bea1d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-alt-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg new file mode 100644 index 0000000..2278c4e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arcmenu-logo-symbolic.svg @@ -0,0 +1,92 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg new file mode 100644 index 0000000..a57017e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/arrow-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg new file mode 100644 index 0000000..0687ab4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/az-layout-symbolic.svg @@ -0,0 +1,312 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg new file mode 100644 index 0000000..b271af1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bat-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg new file mode 100644 index 0000000..e26d0b1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/brisk-layout-symbolic.svg @@ -0,0 +1,328 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + Exit To App + + + + Lock Outline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg new file mode 100644 index 0000000..2955da8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/browse-presets-symbolic.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg new file mode 100644 index 0000000..077fcc7 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-layout-symbolic.svg @@ -0,0 +1,202 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg new file mode 100644 index 0000000..aa125be --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/budgie-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg new file mode 100644 index 0000000..d28b713 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/bug-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg new file mode 100644 index 0000000..ff230a7 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/button-appearance-symbolic.svg @@ -0,0 +1,45 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg new file mode 100644 index 0000000..46b2317 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/categories-symbolic.svg @@ -0,0 +1,87 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg new file mode 100644 index 0000000..013cc7c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/chromebook-layout-symbolic.svg @@ -0,0 +1,227 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg new file mode 100644 index 0000000..80449b8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cita-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg new file mode 100644 index 0000000..c518e65 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/cloud-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg new file mode 100644 index 0000000..5a34df5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/curved-a-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg new file mode 100644 index 0000000..fc2640d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/debian-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg new file mode 100644 index 0000000..63f45e4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/diamond-square-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg new file mode 100644 index 0000000..a1e5380 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dimond-win-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg new file mode 100644 index 0000000..0760fd0 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dolphin-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg new file mode 100644 index 0000000..190f2b7 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dota-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg new file mode 100644 index 0000000..d874f4b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dra-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg new file mode 100644 index 0000000..02caa74 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/drag-symbolic.svg @@ -0,0 +1,65 @@ + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg new file mode 100644 index 0000000..daba3ed --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragon-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg new file mode 100644 index 0000000..1a583a9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/dragonheart-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg new file mode 100644 index 0000000..de3118c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eclipse-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg new file mode 100644 index 0000000..c969ff2 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/elementary-layout-symbolic.svg @@ -0,0 +1,285 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg new file mode 100644 index 0000000..2eeaae6 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/eleven-layout-symbolic.svg @@ -0,0 +1,219 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg new file mode 100644 index 0000000..2e2ac62 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/endeavour-logo-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg new file mode 100644 index 0000000..6c40cec --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/equal-symbolic.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg new file mode 100644 index 0000000..2c82d74 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fedora-logo-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg new file mode 100644 index 0000000..447e292 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fine-tune-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg new file mode 100644 index 0000000..f09fbc5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/fly-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg new file mode 100644 index 0000000..307ee2c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/focus-symbolic.svg @@ -0,0 +1,118 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg new file mode 100644 index 0000000..2ca7f94 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg new file mode 100644 index 0000000..a23a9a9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/football2-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg new file mode 100644 index 0000000..cff31b1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gentoo-logo-symbolic.svg @@ -0,0 +1,35 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg new file mode 100644 index 0000000..4bbe335 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnacs-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg new file mode 100644 index 0000000..78c769b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomemenu-layout-symbolic.svg @@ -0,0 +1,159 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg new file mode 100644 index 0000000..24067fd --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/gnomeoverview-layout-symbolic.svg @@ -0,0 +1,163 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg new file mode 100644 index 0000000..bd6251d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/groove-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg new file mode 100644 index 0000000..21a7907 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/heddy-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg new file mode 100644 index 0000000..42b1780 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/helmet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg new file mode 100644 index 0000000..09f7966 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/homescreen-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg new file mode 100644 index 0000000..eab2c5c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/icon-preview-symbolic.svg @@ -0,0 +1,70 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg new file mode 100644 index 0000000..fc8dd05 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/info-circle-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg new file mode 100644 index 0000000..020a8e3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/insider-layout-symbolic.svg @@ -0,0 +1,322 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg new file mode 100644 index 0000000..7ce4ae4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kaaet-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg new file mode 100644 index 0000000..d3eadd1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/kali-linux-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg new file mode 100644 index 0000000..501012f --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-category-symbolic.svg @@ -0,0 +1,297 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg new file mode 100644 index 0000000..ba4c27e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-layout-symbolic.svg @@ -0,0 +1,290 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg new file mode 100644 index 0000000..9924c84 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/launcher-symbolic.svg @@ -0,0 +1,66 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg new file mode 100644 index 0000000..e352453 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/lins-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg new file mode 100644 index 0000000..0844542 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/loveheart-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg new file mode 100644 index 0000000..4ca02dc --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/manjaro-logo-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg new file mode 100644 index 0000000..1e85ea4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-layouts-symbolic.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg new file mode 100644 index 0000000..1d75e16 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-general-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg new file mode 100644 index 0000000..15e9d51 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-settings-symbolic.svg @@ -0,0 +1,76 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg new file mode 100644 index 0000000..49311b4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/menu-theme-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg new file mode 100644 index 0000000..8a69a7b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mint-layout-symbolic.svg @@ -0,0 +1,384 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg new file mode 100644 index 0000000..47fae59 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/misc-symbolic.svg @@ -0,0 +1,42 @@ + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg new file mode 100644 index 0000000..e146519 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/modern-category-symbolic.svg @@ -0,0 +1,298 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg new file mode 100644 index 0000000..f6dfb02 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/mx-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg new file mode 100644 index 0000000..55e657a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/octo-maze-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg new file mode 100644 index 0000000..731c0fd --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/opensuse-logo-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg new file mode 100644 index 0000000..96aa0fb --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pac-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg new file mode 100644 index 0000000..0554b40 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pacman-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg new file mode 100644 index 0000000..2325b5d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/palette-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg new file mode 100644 index 0000000..e48c0b9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peaks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg new file mode 100644 index 0000000..a346c66 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/peeks-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg new file mode 100644 index 0000000..a15c420 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pie-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg new file mode 100644 index 0000000..13d524c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pinned-apps-symbolic.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg new file mode 100644 index 0000000..8f94a84 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/plasma-layout-symbolic.svg @@ -0,0 +1,438 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg new file mode 100644 index 0000000..67553a2 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pointer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg new file mode 100644 index 0000000..c843522 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pop-os-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg new file mode 100644 index 0000000..763a380 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pureos-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg new file mode 100644 index 0000000..b2aa610 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/pyrimid-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg new file mode 100644 index 0000000..42b8470 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raspbian-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg new file mode 100644 index 0000000..2d04fcf --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/raven-layout-symbolic.svg @@ -0,0 +1,307 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg new file mode 100644 index 0000000..b8b2284 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/record-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg new file mode 100644 index 0000000..d69ae29 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redhat-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg new file mode 100644 index 0000000..a2e9833 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/redmond-layout-symbolic.svg @@ -0,0 +1,610 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exit To App + + + + Lock Outline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg new file mode 100644 index 0000000..d6c8cee --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/rewind-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg new file mode 100644 index 0000000..946bb65 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/robots-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg new file mode 100644 index 0000000..a0a2b99 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/round-symbolic.svg @@ -0,0 +1,18 @@ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + Gnome Symbolic Icon Theme + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg new file mode 100644 index 0000000..fae1077 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/runner-layout-symbolic.svg @@ -0,0 +1,208 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg new file mode 100644 index 0000000..8e59598 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/saucer-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg new file mode 100644 index 0000000..c1c819c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/search-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg new file mode 100644 index 0000000..c7c4a15 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sheild-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg new file mode 100644 index 0000000..fdd6224 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/shortcuts-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg new file mode 100644 index 0000000..5ccb02c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-category-symbolic.svg @@ -0,0 +1,295 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg new file mode 100644 index 0000000..7acd64d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple-layout-symbolic.svg @@ -0,0 +1,285 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg new file mode 100644 index 0000000..04f57e3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/simple2-layout-symbolic.svg @@ -0,0 +1,210 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg new file mode 100644 index 0000000..8273e6c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/snap-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg new file mode 100644 index 0000000..720fa18 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/solus-logo-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg new file mode 100644 index 0000000..82962c4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/somnia-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg new file mode 100644 index 0000000..169bb1a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/start-box-symbolic.svg @@ -0,0 +1,138 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg new file mode 100644 index 0000000..02d87d9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/step-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg new file mode 100644 index 0000000..43a3cb5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/sums-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg new file mode 100644 index 0000000..71052b3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/swirl-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg new file mode 100644 index 0000000..e8bf7d6 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/time-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg new file mode 100644 index 0000000..ba1c723 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tognee-layout-symbolic.svg @@ -0,0 +1,99 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg new file mode 100644 index 0000000..830e664 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/touch-category-symbolic.svg @@ -0,0 +1,543 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg new file mode 100644 index 0000000..d4ce9d8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/toxic-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg new file mode 100644 index 0000000..b5219b3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/traditional-category-symbolic.svg @@ -0,0 +1,793 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg new file mode 100644 index 0000000..cfaddfb --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/transform-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg new file mode 100644 index 0000000..48cda14 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/tree-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg new file mode 100644 index 0000000..bee800f --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/triple-dash-symbolic.svg @@ -0,0 +1,88 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg new file mode 100644 index 0000000..b6b1393 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/ubuntu-logo-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg new file mode 100644 index 0000000..ff813d5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/unity-layout-symbolic.svg @@ -0,0 +1,504 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg new file mode 100644 index 0000000..9474a72 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/utool-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg new file mode 100644 index 0000000..7da31b3 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vancer-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg new file mode 100644 index 0000000..3fbbae0 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/vibe-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg new file mode 100644 index 0000000..4903fd2 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/voyager-logo-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg new file mode 100644 index 0000000..022435a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/warning-symbolic.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg new file mode 100644 index 0000000..c646eae --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-circle-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg new file mode 100644 index 0000000..7eddf2b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whirl-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg new file mode 100644 index 0000000..75ed8b9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/whisker-layout-symbolic.svg @@ -0,0 +1,392 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit Find + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg new file mode 100644 index 0000000..f29c05d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/windows-layout-symbolic.svg @@ -0,0 +1,86 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg new file mode 100644 index 0000000..08c3ba8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zegon-symbolic.svg @@ -0,0 +1,63 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg new file mode 100644 index 0000000..6d15f88 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/hicolor/16x16/actions/zorin-logo-symbolic.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg new file mode 100644 index 0000000..ff8584d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/icons/prefs_icons/keyboard-symbolic.svg @@ -0,0 +1,52 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets new file mode 100644 index 0000000..f2c8e16 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/media/misc/ArcMenuDefaultPresets @@ -0,0 +1,52 @@ +ArcMenu Style//rgba(53,53,53,0.987)//rgb(223,223,223)//rgb(32,32,32)//rgb(21,83,158)//rgba(255,255,255,1)//rgb(32,32,32)//9//1//5//12//24//false// +Simply Dark//rgba(28, 28, 28, 0.98)//rgba(211, 218, 227, 1)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Blue//rgb(25,31,34)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Light Blue//rgb(255,255,255)//rgb(51,51,51)//rgb(235,235,235)//rgba(189,230,251,0.9)//rgba(89,89,89,1)//rgba(189,230,251,0.9)//9//1//5//12//24//true// +Silk Desert//rgba(50,52,73,0.820946)//rgba(211, 218, 227, 1)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//11//0//0//0//0//false// +Breeze//rgb(237,237,243)//rgb(36,36,40)//rgba(63,62,64,0.246622)//rgba(61,174,235,0.55)//rgb(36,36,40)//rgb(210,210,215)//9//1//0//0//0//false// +Breeze Dark//rgb(49,53,61)//rgb(237,237,243)//rgba(63,62,64,0.246622)//rgba(61,174,235,0.55)//rgb(237,237,243)//rgb(65,69,73)//9//1//0//0//0//false// +Dark Blue 2//rgb(50,52,61)//rgb(211,217,227)//rgba(211,217,227,0.2)//rgb(81,149,226)//rgba(255,255,255,1)//rgba(211,217,227,0.5)//9//1//4//0//0//false// +Dark Orange//rgb(51,51,51)//rgb(226,224,221)//rgba(174,167,159,0.2)//rgb(233,84,32)//rgba(255,255,255,1)//rgba(233,84,32,0.5)//9//1//4//12//24//true// +Light Orange//rgb(246,246,245)//rgb(76,76,76)//rgba(51,51,51,0.2)//rgb(233,84,32)//rgba(114,114,114,1)//rgba(233,84,32,0.5)//9//1//4//12//24//true// +Blue Orange//rgb(44,62,80)//rgb(189,195,199)//rgba(189,195,199,0.2)//rgb(231,76,60)//rgba(227,233,237,1)//rgba(189,195,199,0.5)//9//1//4//0//0//false// +Light Purple//rgb(237,245,252)//rgb(39,45,45)//rgba(39,45,45,0.2)//rgba(144,112,164,0.5)//rgba(77,83,83,1)//rgba(144,112,164,0.5)//9//1//6//0//0//false// +Dark Green//rgb(27,34,36)//rgb(243,243,243)//rgba(46,149,130,0.2)//rgb(46,149,130)//rgba(255,255,255,1)//rgba(46,149,130,0.35)//9//1//6//0//0//true// +Gray//rgb(142,142,142)//rgb(255,255,255)//rgb(63,62,64)//rgba(238, 238, 236, 0.1)//rgba(255,255,255,1)//rgb(63,62,64)//11//0//0//0//0//false// +Terminal Green//rgba(28, 28, 28, 0.98)//rgb(17,164,40)//rgb(63,62,64)//rgba(17,164,40,0.641892)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Sky Clear//rgba(64,145,191,0.756757)//rgb(243,243,243)//rgb(63,62,64)//rgba(135,64,191,0.253378)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Ubi Purple//rgba(174,64,191,0.523649)//rgb(243,243,243)//rgb(63,62,64)//rgba(189,191,64,0.763514)//rgba(255,255,255,1)//rgb(63,62,64)//9//0//0//0//0//false// +Shade//rgb(46,52,54)//rgb(186,189,182)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Red Shade//rgba(191,64,74,0.753378)//rgb(243,243,243)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Tilk Blue//rgba(74,179,228,0.716216)//rgb(243,243,243)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Green Blue//rgb(87,121,89)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Gray Blue//rgb(136,138,133)//rgb(189,230,251)//rgb(41,50,55)//rgb(41,50,55)//rgba(255,255,255,1)//rgb(41,50,55)//9//1//5//12//24//true// +Pastel//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgb(233,185,110)//rgb(173,127,168)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 2//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(191,64,190,0.344595)//rgb(114,159,207)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 3//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(64,137,191,0.358108)//rgb(78,154,6)//rgb(63,62,64)//9//0//0//0//0//false// +Pastel 4//rgb(238,238,236)//rgb(46,52,54)//rgb(63,62,64)//rgba(64,191,70,0.307432)//rgb(196,160,0)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgb(233,185,110)//rgb(173,127,168)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 2//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(191,64,190,0.344595)//rgb(114,159,207)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 3//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(64,137,191,0.358108)//rgb(78,154,6)//rgb(63,62,64)//9//0//0//0//0//false// +Dark Pastel 4//rgb(46,52,54)//rgb(243,243,243)//rgb(63,62,64)//rgba(64,191,70,0.307432)//rgb(196,160,0)//rgb(63,62,64)//9//0//0//0//0//false// +Yellow Shade//rgb(196,160,0)//rgb(46,52,54)//rgb(63,62,64)//rgb(85,87,83)//rgb(238,238,236)//rgb(63,62,64)//9//0//0//0//0//false// +Adapta//rgb(250,251,252)//rgb(34,45,50)//rgb(81,84,86)//rgba(0,150,136,0.121711)//rgba(72,83,88,1)//rgb(0,150,136)//11//0//8//12//24//true// +Adapta Nokto//rgb(38,50,56)//rgb(205,215,218)//rgb(38,50,56)//rgba(125,131,134,0.207237)//rgba(243,253,255,1)//rgb(0,188,212)//11//0//8//12//24//true// +Arc//rgb(245,246,247)//rgb(55,54,68)//rgba(82,148,226,0.903915)//rgba(56,55,68,0.0782918)//rgba(93,92,106,1)//rgb(82,148,226)//11//0//8//12//24//true// +Arc Dark//rgb(56,60,74)//rgb(188,195,205)//rgba(82,148,226,0.903915)//rgba(188,195,205,0.188612)//rgba(226,233,243,1)//rgb(82,148,226)//11//0//8//12//24//true// +Pop!_OS Dark//rgb(69,63,63)//rgb(188,185,183)//rgb(68,61,58)//rgba(250,164,26,0.885135)//rgba(226,223,221,1)//rgb(50,128,138)//11//0//8//12//24//true// +Pop!_OS//rgb(250,251,252)//rgb(87,79,74)//rgba(188,185,183,0.722973)//rgba(250,164,26,0.885135)//rgba(125,117,112,1)//rgb(72,185,199)//11//0//8//12//24//true// +McOS CTLina//rgba(243,243,243,0.841549)//rgb(32,32,32)//rgba(243,243,243,0.841549)//rgb(203,204,207)//rgba(70,70,70,1)//rgb(61,140,248)//11//0//8//12//24//true// +McOS CTLina Dark//rgba(47,47,46,0.873239)//rgb(198,194,194)//rgb(44,45,44)//rgb(37,87,214)//rgba(236,232,232,1)//rgb(37,87,214)//11//0//8//12//24//true// +Android Dark Blue//rgb(63,62,64)//rgb(243,243,243)//rgb(0,177,251)//rgba(237,250,12,0.35473)//rgba(255,255,255,1)//rgb(0,177,251)//11//0//4//12//24//true// +Android Light Blue//rgb(255,255,255)//rgb(63,62,64)//rgb(0,177,251)//rgba(237,250,12,0.35473)//rgba(101,100,102,1)//rgb(0,177,251)//11//0//4//12//24//true// +Android Light Green//rgb(255,255,255)//rgb(63,62,64)//rgb(4,149,90)//rgba(143,219,207,0.334459)//rgba(101,100,102,1)//rgb(237,250,12)//11//0//4//12//24//true// +Android Dark Green//rgb(46,52,54)//rgb(243,243,243)//rgb(4,149,90)//rgba(143,219,207,0.334459)//rgba(255,255,255,1)//rgb(237,250,12)//11//0//4//12//24//true// +Android Dark Yaru//rgb(46,52,54)//rgb(243,243,243)//rgb(189,86,53)//rgba(247,186,36,0.405405)//rgba(255,255,255,1)//rgb(189,86,53)//11//0//4//12//24//true// +Android Light Yaru//rgb(255,255,255)//rgb(63,62,64)//rgb(189,86,53)//rgba(247,186,36,0.405405)//rgba(101,100,102,1)//rgb(189,86,53)//11//0//4//12//24//true// +Adapta 4k Dark//rgb(49,59,67)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Adapta 4k Light//rgb(255,255,255)//rgb(46,52,54)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(84,90,92,1)//rgb(4,149,90)//11//1//4//12//24//true// +Neon Yellow Punk//rgb(49,59,67)//rgb(237,250,12)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(248,255,109,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Blue//rgba(49,59,67,0.841216)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Jade//rgba(24,81,58,0.875)//rgb(243,243,243)//rgb(4,149,90)//rgba(0,177,251,0.337838)//rgba(255,255,255,1)//rgb(4,149,90)//11//1//4//12//24//true// +Halo Dark Amber//rgba(84,34,18,0.881757)//rgb(243,243,243)//rgb(247,186,36)//rgba(247,186,36,0.472973)//rgba(255,255,255,1)//rgb(247,186,36)//11//1//4//12//24//true// +Elegant Purple Haze//rgba(41,1,31,0.881757)//rgb(243,243,243)//rgba(112,8,67,0.425676)//rgba(112,8,67,0.425676)//rgba(255,255,255,1)//rgb(176,52,139)//11//0//4//12//24//true// diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuButton.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuButton.js new file mode 100644 index 0000000..ba9c387 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuButton.js @@ -0,0 +1,875 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Clutter, GLib, GObject, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; +const Util = imports.misc.util; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var DASH_TO_PANEL_UUID = 'dash-to-panel@jderose9.github.com'; +var DASH_TO_DOCK_UUID = 'dash-to-dock@micxgx.gmail.com'; +var UBUNTU_DOCK_UUID = 'ubuntu-dock@ubuntu.com'; + +var MenuButton = GObject.registerClass(class Arc_Menu_MenuButton extends PanelMenu.Button{ + _init(settings, arcMenuPlacement, panel, dashIndex) { + super._init(0.5, null, true); + this._settings = settings; + this._panel = panel; + this.menu.destroy(); + this.menu = null; + this.add_style_class_name('arc-menu-panel-menu'); + this.arcMenuPlacement = arcMenuPlacement; + this.tooltipShowing = false; + this.tooltipHidingID = null; + this.tooltipShowingID = null; + this.dtpNeedsRelease = false; + + let menuManagerParent; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL) + menuManagerParent = this._panel; + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + menuManagerParent = this; + + //Create Main Menus - ArcMenu and arcMenu's context menu + this.arcMenu = new ArcMenu(this, 0.5, St.Side.TOP); + this.arcMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.arcMenuContextMenu = new ArcMenuContextMenu(this, 0.5, St.Side.TOP); + this.arcMenuContextMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.menuManager = new PopupMenu.PopupMenuManager(menuManagerParent); + this.menuManager._changeMenu = (menu) => {}; + this.menuManager.addMenu(this.arcMenu); + this.menuManager.addMenu(this.arcMenuContextMenu); + + //Context Menus for applications and other menu items + this.contextMenuManager = new PopupMenu.PopupMenuManager(this); + this.contextMenuManager._changeMenu = (menu) => {}; + this.contextMenuManager._onMenuSourceEnter = (menu) =>{ + if (this.contextMenuManager.activeMenu && this.contextMenuManager.activeMenu != menu) + return Clutter.EVENT_STOP; + + return Clutter.EVENT_PROPAGATE; + } + + //Sub Menu Manager - Control all other popup menus + this.subMenuManager = new PopupMenu.PopupMenuManager(this); + this.subMenuManager._changeMenu = (menu) => {}; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget = new MW.MenuButtonWidget(); + this.x_expand = false; + this.y_expand = false; + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this._delegate = this; + this.menuButtonWidget = new MW.DashMenuButtonWidget(this, this._settings); + this.dash = this._panel._allDocks[dashIndex]; + this.style_class = 'dash-item-container'; + this.child = this.menuButtonWidget.actor; + this.icon = this.menuButtonWidget.icon; + this.label = this.menuButtonWidget.label; + this.container.showLabel = () => this.menuButtonWidget.showLabel(); + this.container.hideLabel = () => this.menuButtonWidget.hideLabel(); + this.container.toggleButton = this.menuButtonWidget.actor; + this.toggleButton = this.menuButtonWidget.actor; + this.container.setDragApp = () => {}; + this.arcMenuContextMenu.addExtensionSettings(this.arcMenuPlacement); + } + + //Add Menu Button Widget to Button + this.add_child(this.menuButtonWidget.actor); + } + + initiate(){ + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + //Dash to Panel Integration + this.dashToPanel = Main.extensionManager.lookup(DASH_TO_PANEL_UUID); + this.extensionChangedId = Main.extensionManager.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === DASH_TO_PANEL_UUID && extension.state === 1) { + this.dashToPanel = Main.extensionManager.lookup(DASH_TO_PANEL_UUID); + this.syncWithDashToPanel(); + } + if (extension.uuid === DASH_TO_PANEL_UUID && extension.state === 2) { + this.dashToPanel = null; + this.arcMenuContextMenu.removeExtensionSettings(); + this.updateArrowSide(St.Side.TOP); + if(this.dtpPostionChangedID>0 && this.extensionSettingsItem){ + this.extensionSettingsItem.disconnect(this.dtpPostionChangedID); + this.dtpPostionChangedID = 0; + } + } + }); + if(this.dashToPanel && this.dashToPanel.stateObj){ + this.syncWithDashToPanel(); + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + //Dash to Dock Integration + this.dtdPostionChangedID = this._panel._settings.connect('changed::dock-position', ()=> { + let side = this._panel._settings.get_enum('dock-position'); + this.updateArrowSide(side); + }); + } + + this._monitorsChangedId = Main.layoutManager.connect('monitors-changed', () => { + this.updateHeight(); + }); + + this._startupCompleteId = Main.layoutManager.connect('startup-complete', () => { + this.updateHeight(); + }); + + this.initiateRecentlyInstalledApps(); + this.setMenuPositionAlignment(); + + //Create Basic Layout + this.createLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.createLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + setDragApp(){ + } + + handleDragOver(source, _actor, _x, _y, _time) { + return imports.ui.dnd.DragMotionResult.NO_DROP; + } + + acceptDrop(source, _actor, _x, _y, _time) { + return false; + } + + syncWithDashToPanel(){ + this.arcMenuContextMenu.addExtensionSettings(this.arcMenuPlacement); + this.extensionSettingsItem = Utils.getSettings('org.gnome.shell.extensions.dash-to-panel', DASH_TO_PANEL_UUID); + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side); + let dashToPanelPositionSettings = 'panel-positions' + try{ + this.extensionSettingsItem.get_string(dashToPanelPositionSettings); + } catch(e){ + dashToPanelPositionSettings = 'panel-position' + } + this.dtpPostionChangedID = this.extensionSettingsItem.connect('changed::' + dashToPanelPositionSettings, ()=> { + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side); + }); + if(global.dashToPanel && global.dashToPanel.panels){ + global.dashToPanel.panels.forEach(p => { + if(p.panel === this._panel){ + this.dtpPanel = p; + } + }); + } + } + + initiateRecentlyInstalledApps(){ + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this._settings.get_boolean('disable-recently-installed-apps')) + return; + + this._appList = this.listAllApps(); + //Update Categories on 'installed-changed' event------------------------------------- + this._installedChangedId = appSys.connect('installed-changed', () => { + this._newAppList = this.listAllApps(); + + //Filter to find if a new application has been installed + let newApps = this._newAppList.filter(app => !this._appList.includes(app)); + + //A New Application has been installed + //Save it in settings + if(newApps.length){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + let newRecentApps = [...new Set(recentApps.concat(newApps))]; + this._settings.set_strv('recently-installed-apps', newRecentApps); + this.MenuLayout.reloadApplications(); + } + + this._appList = this._newAppList; + }); + } + + listAllApps(){ + let appList = appSys.get_installed().filter(appInfo => { + try { + appInfo.get_id(); // catch invalid file encodings + } catch (e) { + return false; + } + return appInfo.should_show(); + }); + return appList.map(app => app.get_id()); + } + + createMenuLayout(){ + this._menuInForcedLocation = false; + this.arcMenu.actor.style = null; + this.arcMenu.removeAll(); + this.section = new PopupMenu.PopupMenuSection(); + this.arcMenu.addMenuItem(this.section); + this.mainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL + }); + this.mainBox._delegate = this.mainBox; + this.section.actor.add_child(this.mainBox); + + this.MenuLayout = Utils.getMenuLayout(this, this._settings.get_enum('menu-layout')); + this.setMenuPositionAlignment(); + this.updateStyle(); + this.forceMenuLocation(); + this.updateHeight(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + reloadMenuLayout(){ + this._menuInForcedLocation = false; + + this.MenuLayout.destroy(); + this.MenuLayout = null; + + this.arcMenu.actor.style = null; + + this.MenuLayout = Utils.getMenuLayout(this, this._settings.get_enum('menu-layout')); + + this.setMenuPositionAlignment(); + this.updateStyle(); + this.forceMenuLocation(); + this.updateHeight(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + setMenuPositionAlignment(){ + let layout = this._settings.get_enum('menu-layout'); + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + let arrowAlignment = (this._settings.get_int('menu-position-alignment') / 100); + if(layout != Constants.MenuLayout.RUNNER){ + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER){ + this.arcMenuContextMenu._arrowAlignment = arrowAlignment + this.arcMenu._arrowAlignment = arrowAlignment + this.arcMenuContextMenu._boxPointer.setSourceAlignment(.5); + this.arcMenu._boxPointer.setSourceAlignment(.5); + } + else if(this.dashToPanel && this.dashToPanel.stateObj){ + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let side = Utils.getDashToPanelPosition(this.extensionSettingsItem, monitorIndex); + this.updateArrowSide(side, false); + } + else{ + this.updateArrowSide(St.Side.TOP, false); + } + } + else{ + this.updateArrowSide(St.Side.TOP, false); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER){ + this.arcMenuContextMenu._arrowAlignment = arrowAlignment + this.arcMenuContextMenu._boxPointer.setSourceAlignment(.5); + } + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(layout != Constants.MenuLayout.RUNNER){ + let side = this._panel._settings.get_enum('dock-position'); + this.updateArrowSide(side, false); + } + else{ + this.updateArrowSide(St.Side.TOP, false); + } + } + } + + updateArrowSide(side, setAlignment = true){ + let arrowAlignment; + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget.updateArrowIconSide(side); + if(side === St.Side.RIGHT || side === St.Side.LEFT) + arrowAlignment = 1.0; + else + arrowAlignment = 0.5; + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH) + arrowAlignment = 0.5; + + this.arcMenuContextMenu._arrowSide = side; + this.arcMenuContextMenu._boxPointer._arrowSide = side; + this.arcMenuContextMenu._boxPointer._userArrowSide = side; + this.arcMenuContextMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenuContextMenu._arrowAlignment = arrowAlignment; + this.arcMenuContextMenu._boxPointer._border.queue_repaint(); + + this.arcMenu._arrowSide = side; + this.arcMenu._boxPointer._arrowSide = side; + this.arcMenu._boxPointer._userArrowSide = side; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = arrowAlignment; + this.arcMenu._boxPointer._border.queue_repaint(); + + if(setAlignment) + this.setMenuPositionAlignment(); + } + + forceMenuLocation(){ + let layout = this._settings.get_enum('menu-layout'); + let forcedMenuLocation = this._settings.get_enum('force-menu-location'); + if(layout === Constants.MenuLayout.RUNNER || layout === Constants.MenuLayout.RAVEN) + return; + + if(forcedMenuLocation === Constants.ForcedMenuLocation.OFF){ + if(!this._menuInForcedLocation) + return; + this.arcMenu.sourceActor = this; + this.arcMenu.focusActor = this; + this.arcMenu._boxPointer.setPosition(this, 0.5); + this.setMenuPositionAlignment(); + this._menuInForcedLocation = false; + return; + } + + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + + if(!this.dummyWidget){ + this.dummyWidget = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyWidget); + } + + if(!this._menuInForcedLocation){ + this.arcMenu.sourceActor = this.dummyWidget; + this.arcMenu.focusActor = this.dummyWidget; + this.arcMenu._boxPointer.setPosition(this.dummyWidget, 0.5); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px;"; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = 0.5; + this._menuInForcedLocation = true; + } + + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let rect = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY; + if(forcedMenuLocation === Constants.ForcedMenuLocation.TOP_CENTERED) + positionY = rect.y + this.rise; + else if(forcedMenuLocation === Constants.ForcedMenuLocation.BOTTOM_CENTERED) + positionY = rect.y + rect.height - this.rise; + this.dummyWidget.set_position(positionX, positionY); + } + + updateStyle(){ + let forcedMenuLocation = this._settings.get_enum('force-menu-location'); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + let layout = this._settings.get_enum('menu-layout'); + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + let gapAdjustment = this._settings.get_int('gap-adjustment'); + + this.arcMenu.actor.set_style_class_name(null); + this.arcMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + this.arcMenuContextMenu.actor.set_style_class_name(null); + this.arcMenuContextMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenuContextMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + if(layout === Constants.MenuLayout.RAVEN){ + this.MenuLayout?.updateStyle(); + return; + } + + if(removeMenuArrow){ + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px; -boxpointer-gap: " + gapAdjustment + "px;"; + this.arcMenu.box.style = "margin:0px;"; + } + else if(forcedMenuLocation === Constants.ForcedMenuLocation.OFF){ + this.arcMenu.actor.style = "-boxpointer-gap: " + gapAdjustment + "px;"; + this.arcMenu.box.style = null; + } + + this.MenuLayout?.updateStyle(); + } + + vfunc_event(event){ + if (event.type() === Clutter.EventType.BUTTON_PRESS){ + if(event.get_button() == 1){ + this.toggleMenu(); + } + else if(event.get_button() == 3){ + this.arcMenuContextMenu.toggle(); + } + } + else if(event.type() === Clutter.EventType.TOUCH_BEGIN){ + this.toggleMenu(); + } + else if(event.type() === Clutter.EventType.ENTER && this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this.menuButtonWidget.actor.add_style_pseudo_class('selected'); + this.menuButtonWidget._icon.add_style_pseudo_class('active'); + } + else if(event.type() === Clutter.EventType.LEAVE && this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + this.menuButtonWidget.actor.remove_style_pseudo_class('selected'); + this.menuButtonWidget._icon.remove_style_pseudo_class('active'); + } + } + return Clutter.EVENT_PROPAGATE; + } + + toggleMenu(){ + if(this.contextMenuManager.activeMenu) + this.contextMenuManager.activeMenu.toggle(); + if(this.subMenuManager.activeMenu) + this.subMenuManager.activeMenu.toggle(); + + this.forceMenuLocation(); + let layout = this._settings.get_enum('menu-layout'); + if(layout === Constants.MenuLayout.GNOME_OVERVIEW){ + if(this._settings.get_boolean('gnome-dash-show-applications')){ + Main.overview._overview._controls._toggleAppsPage(); + } + else + Main.overview.toggle(); + } + else if(!this.arcMenu.isOpen){ + if(layout === Constants.MenuLayout.RUNNER || layout === Constants.MenuLayout.RAVEN) + this.MenuLayout.updateLocation(); + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + if(this.dtpPanel){ + if(this.dtpPanel.intellihide?.enabled){ + this.dtpPanel.intellihide._revealPanel(true); + this.dtpPanel.intellihide.revealAndHold(1); + } + else if(!this.dtpPanel.panelBox.visible){ + this.dtpPanel.panelBox.visible = true; + this.dtpNeedsHiding = true; + } + } + else if(this._panel === Main.panel && !Main.layoutManager.panelBox.visible){ + Main.layoutManager.panelBox.visible = true; + this.mainPanelNeedsHiding = true; + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(this.dash.getDockState() === 0){ + this.dash._removeAnimations(); + this.dash._animateIn(0, 0); + } + } + this.arcMenu.toggle(); + if(this.arcMenu.isOpen && this.MenuLayout){ + if(this.MenuLayout.activeMenuItem && this.MenuLayout.layoutProperties.SupportsCategoryOnHover) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + else if(this.arcMenu.isOpen){ + this.arcMenu.toggle(); + } + } + + getActiveMenu(){ + if(this.contextMenuManager.activeMenu) + return this.contextMenuManager.activeMenu; + else if(this.subMenuManager.activeMenu) + return this.subMenuManager.activeMenu; + else if(this.arcMenu.isOpen) + return this.arcMenu; + else if(this.arcMenuContextMenu.isOpen) + return this.arcMenuContextMenu; + else + return null; + } + + toggleArcMenuContextMenu(){ + if(this.arcMenuContextMenu.isOpen) + this.arcMenuContextMenu.toggle(); + } + + updateHeight(){ + let layout = this._settings.get_enum('menu-layout'); + + let monitorIndex = Main.layoutManager.findIndexForActor(this); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + let monitorWorkArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor); + + if(height > monitorWorkArea.height){ + height = (monitorWorkArea.height * 8) / 10; + } + + if(!(layout == Constants.MenuLayout.SIMPLE || layout == Constants.MenuLayout.SIMPLE_2 || layout == Constants.MenuLayout.RUNNER) && this.MenuLayout) + this.mainBox.style = `height: ${height}px`; + if(this.MenuLayout?.updateWidth) + this.MenuLayout.updateWidth(true); + } + + _onDestroy(){ + if (this._monitorsChangedId){ + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = null; + } + if (this._startupCompleteId){ + Main.layoutManager.disconnect(this._startupCompleteId); + this._startupCompleteId = null; + } + if(this.createLayoutID){ + GLib.source_remove(this.createLayoutID); + this.createLayoutID = null; + } + if(this.updateMenuLayoutID){ + GLib.source_remove(this.updateMenuLayoutID); + this.updateMenuLayoutID = null; + } + if(this.tooltipShowingID){ + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if(this.tooltipHidingID){ + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.extensionChangedId){ + Main.extensionManager.disconnect(this.extensionChangedId); + this.extensionChangedId = null; + } + if(this.dtpPostionChangedID && this.extensionSettingsItem){ + this.extensionSettingsItem.disconnect(this.dtpPostionChangedID); + this.dtpPostionChangedID = null; + } + if(this.dtdPostionChangedID && this._panel._settings){ + this._panel._settings.disconnect(this.dtdPostionChangedID); + this.dtdPostionChangedID = null; + } + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this.MenuLayout) + this.MenuLayout.destroy(); + if(this.arcMenu) + this.arcMenu.destroy(); + if(this.arcMenuContextMenu) + this.arcMenuContextMenu.destroy(); + if(this.dummyWidget) + this.dummyWidget.destroy(); + + super._onDestroy(); + } + + updateMenuLayout(){ + this.tooltipShowing = false; + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.MenuLayout){ + this.MenuLayout.destroy(); + this.MenuLayout = null; + } + this.updateMenuLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.updateMenuLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + loadExtraPinnedApps(){ + if(this.MenuLayout) + this.MenuLayout.loadExtraPinnedApps(); + } + + updateLocation(){ + if(this.MenuLayout && this.MenuLayout.updateLocation) + this.MenuLayout.updateLocation(); + } + + displayPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.displayPinnedApps(); + } + + loadPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.loadPinnedApps(); + } + + reload(){ + if(this.MenuLayout){ + this.reloadMenuLayout(); + } + } + + shouldLoadPinnedApps(){ + if(this.MenuLayout) + return this.MenuLayout.shouldLoadPinnedApps; + } + + setDefaultMenuView(){ + if(this.MenuLayout) + this.MenuLayout.setDefaultMenuView(); + } + + _onOpenStateChanged(menu, open) { + if(open){ + //Avoid Super L hotkey conflicts with Pop Shell extension by + //setting 'overlay-key' mode to Shell.ActionMode.ALL. + let hotKeyPos = this._settings.get_enum('menu-hotkey'); + if(hotKeyPos === Constants.HotKey.SUPER_L) + Main.wm.allowKeybinding('overlay-key', Shell.ActionMode.ALL); + + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + this.menuButtonWidget.setActiveStylePseudoClass(true); + this.add_style_pseudo_class('active'); + + if(Main.panel.menuManager && Main.panel.menuManager.activeMenu) + Main.panel.menuManager.activeMenu.toggle(); + + if(this.dtpPanel && !this.dtpNeedsRelease){ + if(this.dtpPanel.intellihide?.enabled){ + this.dtpNeedsRelease = true; + } + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + this.menuButtonWidget.hideLabel(); + if(this.dash._autohideIsEnabled || this.dash._intellihideIsEnabled){ + this.dtdNeedsHiding = true; + this.dash._autohideIsEnabled = false; + this.dash._intellihideIsEnabled = false; + } + this.menuButtonWidget.actor.add_style_pseudo_class('selected'); + this.menuButtonWidget._icon.add_style_pseudo_class('active'); + } + } + else{ + if(!this.arcMenu.isOpen){ + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + this.tooltipShowing = false; + if(this.activeTooltip){ + this.activeTooltip.hide(); + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + } + if(this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + if(this.dtpPanel && this.dtpNeedsRelease && !this.dtpNeedsHiding){ + this.dtpNeedsRelease = false; + this.dtpPanel.intellihide?.release(1); + } + if(this.dtpPanel && this.dtpNeedsHiding){ + this.dtpNeedsHiding = false; + this.dtpPanel.panelBox.visible = false; + } + if(this.mainPanelNeedsHiding){ + Main.layoutManager.panelBox.visible = false; + this.mainPanelNeedsHiding = false; + } + this.menuButtonWidget.setActiveStylePseudoClass(false); + this.remove_style_pseudo_class('active'); + } + } + else if(this.arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + if(!this.arcMenu.isOpen && !this.arcMenuContextMenu.isOpen){ + if(this.dtdNeedsHiding){ + let dtdSettings = Utils.getSettings('org.gnome.shell.extensions.dash-to-dock', DASH_TO_DOCK_UUID); + if(dtdSettings){ + this.dash._autohideIsEnabled = dtdSettings.get_boolean('autohide'); + this.dash._intellihideIsEnabled = dtdSettings.get_boolean('intellihide'); + } + this.dash._box.sync_hover(); + this.dash._updateDashVisibility(); + this.dtdNeedsHiding = false; + } + + this.menuButtonWidget.actor.remove_style_pseudo_class('selected'); + if(!this.menuButtonWidget.actor.hover) + this.menuButtonWidget._icon.remove_style_pseudo_class('active'); + } + } + } + } +}); + +var ArcMenu = class Arc_Menu_ArcMenu extends PopupMenu.PopupMenu{ + constructor(sourceActor, arrowAlignment, arrowSide) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this._menuButton = sourceActor; + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + this._boxPointer.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this._menuClosedID = this.connect('menu-closed', () => this._menuButton.setDefaultMenuView()); + this.connect('destroy', () => this._onDestroy()); + } + + open(animate){ + if(!this.isOpen) + this._menuButton.arcMenu.actor._muteInput = false; + super.open(animate); + } + + close(animate){ + if(this.isOpen){ + if(this._menuButton.contextMenuManager.activeMenu) + this._menuButton.contextMenuManager.activeMenu.toggle(); + if(this._menuButton.subMenuManager.activeMenu) + this._menuButton.subMenuManager.activeMenu.toggle(); + } + + super.close(animate); + } + + _onDestroy(){ + if(this._menuClosedID){ + this.disconnect(this._menuClosedID) + this._menuClosedID = null; + } + } +}; + +var ArcMenuContextMenu = class Arc_Menu_ArcMenuContextMenu extends PopupMenu.PopupMenu { + constructor(sourceActor, arrowAlignment, arrowSide) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this._menuButton = sourceActor; + this.extensionSettingsItem = false; + + this.actor.add_style_class_name('panel-menu'); + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + + this.addMenuItem(this.createQuickLinkItem(_("ArcMenu Settings"), Constants.PrefsVisiblePage.MAIN)); + + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.addMenuItem(separator); + + let item = new PopupMenu.PopupMenuItem(_("Settings Quick Links:"), { + activate: false, + reactive: false + }); + item.add_style_class_name("margin-box arcmenu-menu-item"); + this.addMenuItem(item); + + this.addMenuItem(this.createQuickLinkItem(_("Change Menu Layout"), Constants.PrefsVisiblePage.MENU_LAYOUT)); + this.addMenuItem(this.createQuickLinkItem(_("Layout Tweaks"), Constants.PrefsVisiblePage.LAYOUT_TWEAKS)); + this.addMenuItem(this.createQuickLinkItem(_("Customize Menu"), Constants.PrefsVisiblePage.CUSTOMIZE_MENU)); + this.addMenuItem(this.createQuickLinkItem(_("Button Appearance"), Constants.PrefsVisiblePage.BUTTON_APPEARANCE)); + + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.addMenuItem(separator); + + this.addMenuItem(this.createQuickLinkItem(_("About"), Constants.PrefsVisiblePage.ABOUT)); + } + + addExtensionSettings(arcMenuPlacement){ + if(!this.extensionSettingsItem){ + let extensionCommand, extensionName; + if(arcMenuPlacement === Constants.ArcMenuPlacement.PANEL){ + extensionName = _("Dash to Panel Settings"); + extensionCommand = 'gnome-extensions prefs ' + DASH_TO_PANEL_UUID; + } + else if(arcMenuPlacement === Constants.ArcMenuPlacement.DASH){ + let dashToDock = Main.extensionManager.lookup(DASH_TO_DOCK_UUID); + let ubuntuDash = Main.extensionManager.lookup(UBUNTU_DOCK_UUID); + if(dashToDock && dashToDock.stateObj && dashToDock.stateObj.dockManager){ + extensionName = _("Dash to Dock Settings"); + extensionCommand = 'gnome-extensions prefs ' + DASH_TO_DOCK_UUID; + } + if(ubuntuDash && ubuntuDash.stateObj && ubuntuDash.stateObj.dockManager){ + extensionName = _("Ubuntu Dock Settings"); + extensionCommand = 'gnome-control-center ubuntu'; + } + } + + let item = new PopupMenu.PopupMenuItem(_(extensionName)); + item.add_style_class_name("margin-box arcmenu-menu-item"); + item.connect('activate', ()=>{ + Util.spawnCommandLine(extensionCommand); + }); + this.addMenuItem(item, 1); + this.extensionSettingsItem = true; + } + } + + removeExtensionSettings(){ + let children = this._getMenuItems(); + children[1].destroy(); + this.extensionSettingsItem = false; + } + + createQuickLinkItem(title, prefsVisiblePage){ + let item = new PopupMenu.PopupMenuItem(_(title)); + item.add_style_class_name("margin-box arcmenu-menu-item"); + item.connect('activate', ()=>{ + this._settings.set_int('prefs-visible-page', prefsVisiblePage); + Util.spawnCommandLine(Constants.ArcMenuSettingsCommand); + }); + return item; + } +}; diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js new file mode 100644 index 0000000..c38431f --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menuWidgets.js @@ -0,0 +1,3693 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); +const {Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Shell, St} = imports.gi; +const AccountsService = imports.gi.AccountsService; +const AppFavorites = imports.ui.appFavorites; +const BoxPointer = imports.ui.boxpointer; +const Constants = Me.imports.constants; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Signals = imports.signals; +const _SystemActions = imports.misc.systemActions; +const SystemActions = _SystemActions.getDefault(); +const Util = imports.misc.util; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; +const { loadInterfaceXML } = imports.misc.fileUtils; + +const ClocksIntegrationIface = loadInterfaceXML('org.gnome.Shell.ClocksIntegration'); +const ClocksProxy = Gio.DBusProxy.makeProxyWrapper(ClocksIntegrationIface); + +Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish'); +Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish'); + +const INDICATOR_ICON_SIZE = 18; +const USER_AVATAR_SIZE = 28; + +function activatePowerOption(powerType, arcMenu){ + arcMenu.itemActivated(BoxPointer.PopupAnimation.NONE); + if(powerType === Constants.PowerType.POWER_OFF) + SystemActions.activatePowerOff(); + else if(powerType === Constants.PowerType.RESTART) + SystemActions.activateRestart ? SystemActions.activateRestart() : SystemActions.activatePowerOff(); + else if(powerType === Constants.PowerType.LOCK) + SystemActions.activateLockScreen(); + else if(powerType === Constants.PowerType.LOGOUT) + SystemActions.activateLogout(); + else if(powerType === Constants.PowerType.SUSPEND) + SystemActions.activateSuspend(); + else if(powerType === Constants.PowerType.HYBRID_SLEEP) + Utils.activateHybridSleep(); + else if(powerType === Constants.PowerType.HIBERNATE) + Utils.activateHibernate(); +} + +var ApplicationContextItems = GObject.registerClass({ + Signals: { + 'close-context-menu': { }, + }, + +}, class Arc_Menu_ApplicationContextItems extends St.BoxLayout{ + _init(actor, app, menuLayout){ + super._init({ + vertical: true, + x_expand: true, + y_expand: true, + style_class: 'margin-box', + }); + this._menuLayout = menuLayout; + this._settings = menuLayout._settings; + this._menuButton = menuLayout.menuButton; + this._app = app; + this.sourceActor = actor; + this.layout = this._settings.get_enum('menu-layout'); + + this.discreteGpuAvailable = false; + this._switcherooNotifyId = global.connect('notify::switcheroo-control', + () => this._updateDiscreteGpuAvailable()); + this._updateDiscreteGpuAvailable(); + } + + set path(path){ + this._path = path; + } + + _updateDiscreteGpuAvailable() { + this._switcherooProxy = global.get_switcheroo_control(); + if (this._switcherooProxy) { + let prop = this._switcherooProxy.get_cached_property('HasDualGpu'); + this.discreteGpuAvailable = prop?.unpack() ?? false; + } else { + this.discreteGpuAvailable = false; + } + } + + closeMenus(){ + this.close(); + this._menuLayout.arcMenu.toggle(); + } + + close(){ + this.emit('close-context-menu'); + } + + rebuildItems(){ + this.destroy_all_children(); + if(this._app instanceof Shell.App){ + this.appInfo = this._app.get_app_info(); + let actions = this.appInfo.list_actions(); + + let windows = this._app.get_windows().filter( + w => !w.skip_taskbar + ); + + if (windows.length > 0){ + let item = new PopupMenu.PopupMenuItem(_("Current Windows:"), { + reactive: false, + can_focus: false + }); + item.actor.add_style_class_name('inactive'); + this.add_child(item); + + windows.forEach(window => { + let title = window.title ? window.title + : this._app.get_name(); + let item = this._appendMenuItem(title); + item.connect('activate', () => { + this.closeMenus(); + Main.activateWindow(window); + }); + }); + this._appendSeparator(); + } + + if (!this._app.is_window_backed()) { + if (this._app.can_open_new_window() && !actions.includes('new-window')) { + let newWindowItem = this._appendMenuItem(_("New Window")); + newWindowItem.connect('activate', () => { + this.closeMenus(); + this._app.open_new_window(-1); + }); + } + if (this.discreteGpuAvailable && this._app.state == Shell.AppState.STOPPED) { + const appPrefersNonDefaultGPU = this.appInfo.get_boolean('PrefersNonDefaultGPU'); + const gpuPref = appPrefersNonDefaultGPU + ? Shell.AppLaunchGpu.DEFAULT + : Shell.AppLaunchGpu.DISCRETE; + + this._onGpuMenuItem = this._appendMenuItem(appPrefersNonDefaultGPU + ? _('Launch using Integrated Graphics Card') + : _('Launch using Discrete Graphics Card')); + + this._onGpuMenuItem.connect('activate', () => { + this.closeMenus(); + this._app.launch(0, -1, gpuPref); + }); + } + + for (let i = 0; i < actions.length; i++) { + let action = actions[i]; + let item; + if(action === "empty-trash-inactive"){ + item = new PopupMenu.PopupMenuItem(this.appInfo.get_action_name(action), {reactive:false, can_focus:false}); + item.actor.add_style_class_name('inactive'); + this._appendSeparator(); + this.add_child(item); + } + else if(action === "empty-trash"){ + this._appendSeparator(); + item = this._appendMenuItem(this.appInfo.get_action_name(action)); + } + else{ + item = this._appendMenuItem(this.appInfo.get_action_name(action)); + } + + item.connect('activate', (emitter, event) => { + this.closeMenus(); + this._app.launch_action(action, event.get_time(), -1); + }); + } + + //If Trash Can, we don't want to add the rest of the entries below. + if(this.appInfo.get_string('Id') === "ArcMenu_Trash") + return false; + + let desktopIcons = Main.extensionManager.lookup("desktop-icons@csoriano"); + let desktopIconsNG = Main.extensionManager.lookup("ding@rastersoft.com"); + if((desktopIcons && desktopIcons.stateObj) || (desktopIconsNG && desktopIconsNG.stateObj)){ + this._appendSeparator(); + let fileDestination = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP); + let src = Gio.File.new_for_path(this.appInfo.get_filename()); + let dst = Gio.File.new_for_path(GLib.build_filenamev([fileDestination, src.get_basename()])); + let exists = dst.query_exists(null); + if(exists) { + let item = this._appendMenuItem(_("Delete Desktop Shortcut")); + item.connect('activate', () => { + if(src && dst){ + try { + dst.delete(null); + } catch (e) { + log(`Failed to delete shortcut: ${e.message}`); + } + } + this.close(); + }); + } + else { + let item = this._appendMenuItem(_("Create Desktop Shortcut")); + item.connect('activate', () => { + if(src && dst){ + try { + // copy_async() isn't introspectable :-( + src.copy(dst, Gio.FileCopyFlags.OVERWRITE, null, null); + this._markTrusted(dst); + } catch (e) { + log(`Failed to copy to desktop: ${e.message}`); + } + } + this.close(); + }); + } + } + + let canFavorite = global.settings.is_writable('favorite-apps'); + if (canFavorite) { + this._appendSeparator(); + let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._app.get_id()); + if (isFavorite) { + let item = this._appendMenuItem(_("Remove from Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.removeFavorite(this._app.get_id()); + this.close(); + }); + } else { + let item = this._appendMenuItem(_("Add to Favorites")); + item.connect('activate', () => { + let favs = AppFavorites.getAppFavorites(); + favs.addFavorite(this._app.get_id()); + this.close(); + }); + } + } + + let pinnedApps = this._settings.get_strv('pinned-app-list'); + let pinnedAppID = []; + + //filter pinnedApps list by every 3rd entry in list. 3rd entry contains an appID or command + for(let i = 2; i < pinnedApps.length; i += 3){ + pinnedAppID.push(pinnedApps[i]); + } + let isAppPinned = pinnedAppID.find((element) => { + return element == this._app.get_id(); + }); + + //if app is pinned and menulayout has PinnedApps category, show Unpin from ArcMenu entry + if(isAppPinned && this._menuLayout.hasPinnedApps) { + let item = this._appendMenuItem(_("Unpin from ArcMenu")); + item.connect('activate', ()=>{ + this.close(); + for(let i = 0; i < pinnedApps.length; i += 3){ + if(pinnedApps[i + 2] === this._app.get_id()){ + pinnedApps.splice(i, 3); + this._settings.set_strv('pinned-app-list', pinnedApps); + break; + } + } + }); + } + else if(this._menuLayout.hasPinnedApps) { + let item = this._appendMenuItem(_("Pin to ArcMenu")); + item.connect('activate', ()=>{ + this.close(); + pinnedApps.push(this.appInfo.get_display_name()); + pinnedApps.push(''); + pinnedApps.push(this._app.get_id()); + this._settings.set_strv('pinned-app-list',pinnedApps); + }); + } + + if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) { + this._appendSeparator(); + let item = this._appendMenuItem(_("Show Details")); + item.connect('activate', () => { + let id = this._app.get_id(); + let args = GLib.Variant.new('(ss)', [id, '']); + Gio.DBus.get(Gio.BusType.SESSION, null, (o, res) => { + let bus = Gio.DBus.get_finish(res); + bus.call('org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Actions', 'Activate', + GLib.Variant.new('(sava{sv})', + ['details', [args], null]), + null, 0, -1, null, null); + this.closeMenus(); + }); + }); + } + } + } + else if(this._path){ + let newWindowItem = this._appendMenuItem(_("Open Folder Location")); + newWindowItem.connect('activate', () => { + let file = Gio.File.new_for_path(this._path); + let context = global.create_app_launch_context(Clutter.get_current_event().get_time(), -1) + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(file.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + this.closeMenus(); + }); + } + else if(this._menuLayout.hasPinnedApps && this.sourceActor instanceof PinnedAppsMenuItem) { + let item = this._appendMenuItem(_("Unpin from ArcMenu")); + item.connect('activate', () => { + this.close(); + let pinnedApps = this._settings.get_strv('pinned-app-list'); + for(let i = 0; i < pinnedApps.length; i += 3){ + if(pinnedApps[i + 2] === this._app){ + pinnedApps.splice(i, 3); + this._settings.set_strv('pinned-app-list', pinnedApps); + break; + } + } + }); + } + } + + //_markTrusted function borrowed from + //https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/tree/master/extensions/apps-menu + async _markTrusted(file) { + let modeAttr = Gio.FILE_ATTRIBUTE_UNIX_MODE; + let trustedAttr = 'metadata::trusted'; + let queryFlags = Gio.FileQueryInfoFlags.NONE; + let ioPriority = GLib.PRIORITY_DEFAULT; + + try { + let info = await file.query_info_async(modeAttr, queryFlags, ioPriority, null); + + let mode = info.get_attribute_uint32(modeAttr) | 0o100; + info.set_attribute_uint32(modeAttr, mode); + info.set_attribute_string(trustedAttr, 'yes'); + await file.set_attributes_async(info, queryFlags, ioPriority, null); + + // Hack: force nautilus to reload file info + info = new Gio.FileInfo(); + info.set_attribute_uint64( + Gio.FILE_ATTRIBUTE_TIME_ACCESS, GLib.get_real_time()); + try { + await file.set_attributes_async(info, queryFlags, ioPriority, null); + } catch (e) { + log(`Failed to update access time: ${e.message}`); + } + } catch (e) { + log(`Failed to mark file as trusted: ${e.message}`); + } + } + + _appendSeparator() { + let separator = new ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.add_child(separator); + } + + _appendMenuItem(labelText) { + let item = new ArcMenuPopupBaseMenuItem(this._menuLayout); + this.label = new St.Label({ + text: _(labelText), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + item.add_child(this.label); + this.add_child(item); + return item; + } +}); + +var ApplicationContextMenu = class Arc_Menu_ApplicationContextMenu extends PopupMenu.PopupMenu { + constructor(actor, app, menuLayout){ + super(actor, 0.0, St.Side.TOP); + this._menuLayout = menuLayout; + this._settings = menuLayout._settings; + this._menuButton = menuLayout.menuButton; + this._app = app; + this.layout = this._settings.get_enum('menu-layout'); + this._boxPointer.setSourceAlignment(.20); + this._boxPointer._border.queue_repaint(); + this.blockSourceEvents = true; + Main.uiGroup.add_child(this.actor); + this._menuLayout.contextMenuManager.addMenu(this); + this.contextMenuItems = new ApplicationContextItems(actor, app, menuLayout); + this.contextMenuItems.connect('close-context-menu', () => this.toggle()); + this.contextMenuItems._delegate = this.contextMenuItems; + this.box.add_child(this.contextMenuItems); + this.sourceActor = actor; + this.sourceActor.connect("destroy", ()=> { + if(this.isOpen) + this.close(); + Main.uiGroup.remove_child(this.actor); + this.contextMenuItems.destroy(); + this.destroy(); + }); + } + + centerBoxPointerPosition(){ + this._boxPointer.setSourceAlignment(.50); + this._arrowAlignment = .5; + this._boxPointer._border.queue_repaint(); + } + + rightBoxPointerPosition(){ + this._arrowSide = St.Side.LEFT; + this._boxPointer._arrowSide = St.Side.LEFT; + this._boxPointer._userArrowSide = St.Side.LEFT; + this._boxPointer.setSourceAlignment(.50); + this._arrowAlignment = .5; + this._boxPointer._border.queue_repaint(); + } + + set path(path){ + this.contextMenuItems.path = path; + } + + open(animate){ + if(this._menuLayout.searchResults && this.sourceActor !== this._menuLayout.searchResults.getTopResult()) + this._menuLayout.searchResults.getTopResult()?.remove_style_pseudo_class('active'); + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + this._menuButton.tooltipShowing = false; + } + if(this.sourceActor.tooltip){ + this.sourceActor.tooltip.hide(); + this._menuButton.tooltipShowing = false; + } + + super.open(animate); + } + + close(animate){ + super.close(animate); + if(this.sourceActor instanceof ArcMenuButtonItem) + this.sourceActor.sync_hover(); + else{ + this.sourceActor.active = false; + } + + this.sourceActor.sync_hover(); + this.sourceActor.hovered = this.sourceActor.hover; + } + + rebuildItems(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + if(customStyle){ + this.actor.style_class = 'arc-menu-boxpointer'; + this.actor.add_style_class_name('arc-menu'); + } + else{ + this.actor.style_class = 'popup-menu-boxpointer'; + this.actor.add_style_class_name('popup-menu'); + } + + this.contextMenuItems.rebuildItems(); + } + + _onKeyPress(actor, event) { + return Clutter.EVENT_PROPAGATE; + } +}; + +var ArcMenuPopupBaseMenuItem = GObject.registerClass({ + Properties: { + 'active': GObject.ParamSpec.boolean('active', 'active', 'active', + GObject.ParamFlags.READWRITE, + false), + 'hovered': GObject.ParamSpec.boolean('hovered', 'hovered', 'hovered', + GObject.ParamFlags.READWRITE, + false), + 'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive', + GObject.ParamFlags.READWRITE, + true), + }, + Signals: { + 'activate': { param_types: [Clutter.Event.$gtype] }, + }, + +}, class Arc_Menu_PopupBaseMenuItem extends St.BoxLayout{ + _init(menuLayout, params){ + params = imports.misc.params.parse(params, { + reactive: true, + activate: true, + hover: true, + style_class: null, + can_focus: true, + }); + super._init({ style_class: 'popup-menu-item arcmenu-menu-item', + reactive: params.reactive, + track_hover: params.reactive, + can_focus: params.can_focus, + accessible_role: Atk.Role.MENU_ITEM + }); + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this.hasContextMenu = false; + this._delegate = this; + this._menuLayout = menuLayout; + this.arcMenu = this._menuLayout.arcMenu; + this.shouldShow = true; + this._parent = null; + this._active = false; + this._activatable = params.reactive && params.activate; + this._sensitive = true; + + this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' }); + this.add_child(this._ornamentLabel); + + this.x_align = Clutter.ActorAlign.FILL; + this.x_expand = true; + + if (!this._activatable) + this.add_style_class_name('popup-inactive-menu-item'); + + if (params.style_class) + this.add_style_class_name(params.style_class); + + if (params.reactive && params.hover) + this.bind_property('hover', this, 'hovered', GObject.BindingFlags.SYNC_CREATE); + + if(params.hover) + this.actor.connect('notify::hover', this._onHover.bind(this)); + + this.arcMenuOpenStateChangeID = this.arcMenu.connect('open-state-changed', (menu, open) =>{ + if(!open) + this.cancelPopupTimeout(); + }); + + let textureCache = St.TextureCache.get_default(); + let iconThemeChangedId = textureCache.connect('icon-theme-changed', this._updateIcon.bind(this)); + this.connect('destroy', () => { + textureCache.disconnect(iconThemeChangedId); + this._onDestroy(); + }); + } + + _updateIcon() { + if(!this._iconBin || !this.createIcon) + return; + + let icon = this.createIcon(); + this._iconBin.set_child(icon); + } + + get actor() { + return this; + } + + get active(){ + return this._active; + } + + set active(active) { + if(this.isDestroyed) + return; + let activeChanged = active != this.active; + if(activeChanged){ + this._active = active; + if(active){ + if(this._menuLayout.activeMenuItem !== this) + this._menuLayout.activeMenuItem = this; + this.remove_style_class_name('selected'); + this.add_style_pseudo_class('active'); + if(this.can_focus) + this.grab_key_focus(); + } + else{ + this.remove_style_pseudo_class('active'); + this.remove_style_class_name('selected'); + } + this.notify('active'); + } + } + + set hovered(hover) { + let hoverChanged = hover != this.hovered; + if(hoverChanged){ + let isActiveStyle = this.get_style_pseudo_class()?.includes('active') + if(hover && !isActiveStyle){ + this.add_style_class_name('selected'); + } + else{ + this.remove_style_class_name('selected'); + } + } + } + + setShouldShow(){ + //If a saved shortcut link is a desktop app, check if currently installed. + //Do NOT display if application not found. + if(this._command.endsWith(".desktop") && !Shell.AppSystem.get_default().lookup_app(this._command)){ + this.shouldShow = false; + } + } + + _onHover() { + if(this.tooltip === undefined && this.actor.hover && this.label){ + let description = this.description; + if(this._app) + description = this._app.get_description(); + Utils.createTooltip(this._menuLayout, this, this.label, description, this._displayType ? this._displayType : -1); + } + } + + vfunc_button_press_event(){ + let event = Clutter.get_current_event(); + this.pressed = false; + if(event.get_button() == 1){ + this._menuLayout._blockActivateEvent = false; + this.pressed = true; + if(this.hasContextMenu) + this.contextMenuTimeOut(); + } + else if(event.get_button() == 3){ + this.pressed = true; + } + this.active = true; + return Clutter.EVENT_PROPAGATE; + } + + vfunc_button_release_event(){ + let event = Clutter.get_current_event(); + if(event.get_button() == 1 && !this._menuLayout._blockActivateEvent && this.pressed){ + this.pressed = false; + this.activate(event); + if(!(this instanceof CategoryMenuItem) && !(this instanceof ArcMenuButtonItem)) + this.active = false; + return Clutter.EVENT_STOP; + } + if(event.get_button() == 3 && this.pressed){ + this.pressed = false; + if(this.hasContextMenu) + this.popupContextMenu(); + else if(!(this instanceof CategoryMenuItem && !(this instanceof ArcMenuButtonItem))){ + this.active = false; + this.hovered = true; + } + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + vfunc_key_focus_in() { + super.vfunc_key_focus_in(); + if(!this.actor.hover) + this._menuLayout._keyFocusIn(this.actor); + this.active = true; + } + + vfunc_key_focus_out() { + if(this.contextMenu && this.contextMenu.isOpen){ + return; + } + super.vfunc_key_focus_out(); + this.active = false; + } + + activate(event) { + this.emit('activate', event); + } + + vfunc_key_press_event(keyEvent) { + if (!this._activatable) + return super.vfunc_key_press_event(keyEvent); + + let state = keyEvent.modifier_state; + + // if user has a modifier down (except capslock and numlock) + // then don't handle the key press here + state &= ~Clutter.ModifierType.LOCK_MASK; + state &= ~Clutter.ModifierType.MOD2_MASK; + state &= Clutter.ModifierType.MODIFIER_MASK; + + if (state) + return Clutter.EVENT_PROPAGATE; + + let symbol = keyEvent.keyval; + if ( symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter) { + this.activate(Clutter.get_current_event()); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + } + + vfunc_touch_event(event){ + if(event.type == Clutter.EventType.TOUCH_END && !this._menuLayout._blockActivateEvent && this.pressed){ + this.remove_style_pseudo_class('active'); + this.activate(Clutter.get_current_event()); + this.pressed = false; + return Clutter.EVENT_STOP; + } + else if(event.type == Clutter.EventType.TOUCH_BEGIN && !this._menuLayout.contextMenuManager.activeMenu){ + this.pressed = true; + this._menuLayout._blockActivateEvent = false; + if(this.hasContextMenu) + this.contextMenuTimeOut(); + this.add_style_pseudo_class('active'); + } + else if(event.type == Clutter.EventType.TOUCH_BEGIN && this._menuLayout.contextMenuManager.activeMenu){ + this.pressed = false; + this._menuLayout._blockActivateEvent = false; + this._menuLayout.contextMenuManager.activeMenu.toggle(); + } + return Clutter.EVENT_PROPAGATE; + } + + contextMenuTimeOut(){ + this._popupTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 600, () => { + this.pressed = false; + this._popupTimeoutId = null; + if(this.hasContextMenu && this._menuLayout.arcMenu.isOpen && !this._menuLayout._blockActivateEvent) { + this.popupContextMenu(); + this._menuLayout.contextMenuManager.ignoreRelease(); + } + return GLib.SOURCE_REMOVE; + }); + } + + cancelPopupTimeout(){ + if(this._popupTimeoutId){ + GLib.source_remove(this._popupTimeoutId); + this._popupTimeoutId = null; + } + } + + _onDestroy(){ + this.isDestroyed = true; + if(this.arcMenuOpenStateChangeID){ + this.arcMenu.disconnect(this.arcMenuOpenStateChangeID); + this.arcMenuOpenStateChangeID = null; + } + } +}); + +var ArcMenuSeparator = GObject.registerClass( +class Arc_Menu_Separator extends PopupMenu.PopupBaseMenuItem { + _init(separatorLength, separatorAlignment, text) { + super._init({ + style_class: 'popup-separator-menu-item', + reactive: false, + can_focus: false, + }); + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + this.remove_child(this._ornamentLabel); + this.reactive = true; + this.label = new St.Label({ + text: text || '', + style: 'font-weight: bold' + }); + this.add_child(this.label); + this.label_actor = this.label; + + this.label.add_style_pseudo_class = () => { return false; }; + + this.label.connect('notify::text', + this._syncLabelVisibility.bind(this)); + this._syncLabelVisibility(); + + this._separator = new St.Widget({ + style_class: 'popup-separator-menu-item-separator separator-color-style', + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(this._separator); + if(separatorAlignment === Constants.SeparatorAlignment.HORIZONTAL){ + this.style = "padding: 0px 5px;" + if(separatorLength === Constants.SeparatorStyle.SHORT) + this._separator.style = "margin: 5px 45px;"; + else if(separatorLength === Constants.SeparatorStyle.MEDIUM) + this._separator.style = "margin: 5px 15px;"; + else if(separatorLength === Constants.SeparatorStyle.LONG) + this._separator.style = "margin: 0px 5px;"; + else if(separatorLength === Constants.SeparatorStyle.MAX) + this._separator.style = "margin: 0px; padding: 0px;"; + else if(separatorLength === Constants.SeparatorStyle.HEADER_LABEL){ + this._separator.style = "margin: 0px 20px 0px 10px;"; + this.style = "padding: 5px 15px;" + } + } + else if(separatorAlignment === Constants.SeparatorAlignment.VERTICAL){ + if(separatorLength === Constants.SeparatorStyle.ALWAYS_SHOW){ + this.style = "padding: 8px 4px;" + } + else{ + this._syncVisibility(); + this.vertSeparatorChangedID = this._settings.connect('changed::vert-separator', this._syncVisibility.bind(this)); + this.style = "padding: 0px 4px;" + } + + this._separator.style = "margin: 0px; width: 1px; height: -1px;"; + this.remove_child(this.label); + this.x_expand = this._separator.x_expand = true; + this.x_align = this._separator.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = this._separator.y_expand = true; + this.y_align = this._separator.y_align = Clutter.ActorAlign.FILL; + } + + this.connect('destroy', () => { + if(this.vertSeparatorChangedID){ + this._settings.disconnect(this.vertSeparatorChangedID); + this.vertSeparatorChangedID = null; + } + }); + } + + _syncLabelVisibility() { + this.label.visible = this.label.text != ''; + } + + _syncVisibility() { + this._separator.visible = this._settings.get_boolean('vert-separator'); + } +}); + +var ActivitiesMenuItem = GObject.registerClass(class Arc_Menu_ActivitiesMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _("Activities Overview"), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this.label); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + icon_name: 'view-fullscreen-symbolic', + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + } + + activate(event) { + this._menuLayout.arcMenu.toggle(); + Main.overview.show(); + super.activate(event); + } +}); + +var Tooltip = class Arc_Menu_Tooltip{ + constructor(menuLayout, sourceActor, title, description) { + this._menuButton = menuLayout.menuButton; + this._settings = this._menuButton._settings; + this.sourceActor = sourceActor; + if(this.sourceActor.tooltipLocation) + this.location = this.sourceActor.tooltipLocation; + else + this.location = Constants.TooltipLocation.BOTTOM; + let descriptionLabel; + this.actor = new St.BoxLayout({ + vertical: true, + style_class: 'dash-label tooltip-menu-item', + opacity: 0 + }); + + if(title){ + this.titleLabel = new St.Label({ + text: _(title), + style: description ? "font-weight: bold;" : null, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(this.titleLabel); + } + + if(description){ + descriptionLabel = new St.Label({ + text: description, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(descriptionLabel); + } + + global.stage.add_child(this.actor); + + this.actor.connect('destroy',()=>{ + if(this.destroyID){ + this.sourceActor.disconnect(this.destroyID); + this.destroyID = null; + } + if(this.activeID){ + this.sourceActor.disconnect(this.activeID); + this.activeID = null; + } + + if(this.hoverID){ + this.sourceActor.disconnect(this.hoverID); + this.hoverID = null; + } + if(this.toggleID){ + this._settings.disconnect(this.toggleID); + this.toggleID = null; + } + }) + this.activeID = this.sourceActor.connect('notify::active', ()=> this.setActive(this.sourceActor.active)); + this.destroyID = this.sourceActor.connect('destroy',this.destroy.bind(this)); + this.hoverID = this.sourceActor.connect('notify::hover', this._onHover.bind(this)); + this._useTooltips = ! this._settings.get_boolean('disable-tooltips'); + this.toggleID = this._settings.connect('changed::disable-tooltips', this.disableTooltips.bind(this)); + } + + setActive(active){ + if(!active) + this.hide(); + } + + disableTooltips() { + this._useTooltips = ! this._settings.get_boolean('disable-tooltips'); + } + + _onHover() { + if(this._useTooltips){ + if(this.sourceActor.hover){ + if(this._menuButton.tooltipShowing){ + this.show(); + this._menuButton.activeTooltip = this.actor; + } + else{ + this._menuButton.tooltipShowingID = GLib.timeout_add(0, 750, () => { + this.show(); + this._menuButton.tooltipShowing = true; + this._menuButton.activeTooltip = this.actor; + this._menuButton.tooltipShowingID = null; + return GLib.SOURCE_REMOVE; + }); + } + if(this._menuButton.tooltipHidingID){ + GLib.source_remove(this._menuButton.tooltipHidingID); + this._menuButton.tooltipHidingID = null; + } + } + else { + this.hide(); + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + } + this._menuButton.tooltipHidingID = GLib.timeout_add(0, 750, () => { + this._menuButton.tooltipShowing = false; + this._menuButton.activeTooltip = null; + this._menuButton.tooltipHidingID = null; + return GLib.SOURCE_REMOVE; + }); + } + } + } + + show() { + if(this._useTooltips){ + this.actor.opacity = 0; + this.actor.show(); + + let [stageX, stageY] = this.sourceActor.get_transformed_position(); + + let itemWidth = this.sourceActor.allocation.x2 - this.sourceActor.allocation.x1; + let itemHeight = this.sourceActor.allocation.y2 - this.sourceActor.allocation.y1; + + let labelWidth = this.actor.get_width(); + let labelHeight = this.actor.get_height(); + + let x, y; + let gap = 5; + + switch (this.location) { + case Constants.TooltipLocation.BOTTOM_CENTERED: + y = stageY + itemHeight + gap; + x = stageX + Math.floor((itemWidth - labelWidth) / 2); + break; + case Constants.TooltipLocation.TOP_CENTERED: + y = stageY - labelHeight - gap; + x = stageX + Math.floor((itemWidth - labelWidth) / 2); + break; + case Constants.TooltipLocation.BOTTOM: + y = stageY + itemHeight + gap; + x = stageX + gap; + break; + } + + // keep the label inside the screen + let monitor = Main.layoutManager.findMonitorForActor(this.sourceActor); + if (x - monitor.x < gap) + x += monitor.x - x + gap; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; + else if (y - monitor.y < gap) + y += monitor.y - y + gap; + else if (y + labelHeight > monitor.y + monitor.height - gap) + y -= y + labelHeight - (monitor.y + monitor.height) + gap; + + this.actor.set_position(x, y); + this.actor.ease({ + opacity: 255, + duration: Dash.DASH_ITEM_LABEL_SHOW_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + }); + } + } + + hide() { + if(this._useTooltips){ + this.actor.ease({ + opacity: 0, + duration: Dash.DASH_ITEM_LABEL_HIDE_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => this.actor.hide() + }); + } + } + + destroy() { + if (this._menuButton.tooltipShowingID) { + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + } + if (this._menuButton.tooltipHidingID) { + GLib.source_remove(this._menuButton.tooltipHidingID); + this._menuButton.tooltipHidingID = null; + } + if(this.toggleID>0){ + this._settings.disconnect(this.toggleID); + this.toggleID = 0; + } + if(this.hoverID>0){ + this.sourceActor.disconnect(this.hoverID); + this.hoverID = 0; + } + if(this._menuButton.activeTooltip = this.actor) + this._menuButton.activeTooltip = null; + + global.stage.remove_child(this.actor); + this.actor.destroy(); + } +}; + +var ArcMenuButtonItem = GObject.registerClass( + class Arc_Menu_ArcMenuButtonItem extends ArcMenuPopupBaseMenuItem { + _init(menuLayout, tooltipText, iconName, gicon) { + super._init(menuLayout); + this.style_class = 'popup-menu-item arc-menu-button'; + this._settings = this._menuLayout._settings; + this._menuLayout = menuLayout; + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + this.iconName = iconName; + this.gicon = gicon; + this.toggleMenuOnClick = true; + + if(tooltipText){ + this.tooltip = new Tooltip(this._menuLayout, this.actor, tooltipText); + this.tooltip.location = Constants.TooltipLocation.TOP_CENTERED; + this.tooltip.hide(); + } + + if(this.iconName !== null){ + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + } + } + + createIcon(overrideIconSize){ + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: this.gicon ? this.gicon : Gio.icon_new_for_string(this.iconName), + icon_size: overrideIconSize ? overrideIconSize : iconSize, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER + }); + } + + setIconSize(size){ + if(!this._iconBin) + return; + this._iconBin.set_child(this.createIcon(size)); + } + + activate(event){ + if(this.toggleMenuOnClick) + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +// Settings Button +var SettingsButton = GObject.registerClass(class Arc_Menu_SettingsButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Settings"), 'emblem-system-symbolic'); + } + activate(event) { + super.activate(event); + Util.spawnCommandLine('gnome-control-center'); + } +}); + +// Runner Layout Tweaks Button +var RunnerTweaksButton = GObject.registerClass(class Arc_Menu_RunnerTweaksButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Configure Runner"), 'emblem-system-symbolic'); + this.tooltip.location = Constants.TooltipLocation.BOTTOM_CENTERED; + } + activate(event) { + super.activate(event); + this._menuLayout._settings.set_int('prefs-visible-page', Constants.PrefsVisiblePage.RUNNER_TWEAKS); + Util.spawnCommandLine(Constants.ArcMenuSettingsCommand); + } +}); + +//'Insider' layout Pinned Apps hamburger button +var PinnedAppsButton = GObject.registerClass(class Arc_Menu_PinnedAppsButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Pinned Apps"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.togglePinnedAppsMenu(); + } +}); + +//'Windows' layout extras hamburger button +var ExtrasButton = GObject.registerClass(class Arc_Menu_ExtrasButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Extras"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.toggleExtrasMenu(); + } +}); + +//"Leave" Button with popupmenu that shows lock, power off, restart, etc +var LeaveButton = GObject.registerClass(class Arc_Menu_LeaveButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Leave"), 'system-shutdown-symbolic'); + this.toggleMenuOnClick = false; + this._menuLayout = menuLayout; + this.menuButton = menuLayout.menuButton; + this._settings = menuLayout._settings; + this._createLeaveMenu(); + } + + _createLeaveMenu(){ + this.leaveMenu = new PopupMenu.PopupMenu(this, 0.5 , St.Side.BOTTOM); + this.leaveMenu.blockSourceEvents = true; + let section = new PopupMenu.PopupMenuSection(); + this.leaveMenu.addMenuItem(section); + + let box = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + box._delegate = box; + + section.actor.add_child(box); + + box.add_child(this._menuLayout.createLabelRow(_("Session"))); + + this.lockItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.LOCK); + box.add_child(this.lockItem); + + let logOutItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.LOGOUT); + box.add_child(logOutItem); + + box.add_child(this._menuLayout.createLabelRow(_("System"))); + + Utils.canHybridSleep((canHybridSleep, needsAuth) => { + if(canHybridSleep){ + let sleepItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.HYBRID_SLEEP); + box.insert_child_at_index(sleepItem, 4); + } + }); + + Utils.canHibernate((canHibernate, needsAuth) => { + if(canHibernate){ + let hibernateItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.HIBERNATE); + box.insert_child_at_index(hibernateItem, 5); + } + }); + + let suspendItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.SUSPEND); + box.add_child(suspendItem); + + let restartItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.RESTART); + box.add_child(restartItem); + + let powerOffItem = new PowerMenuItem(this._menuLayout, Constants.PowerType.POWER_OFF); + box.add_child(powerOffItem); + + this._menuLayout.subMenuManager.addMenu(this.leaveMenu); + this.leaveMenu.actor.hide(); + Main.uiGroup.add_child(this.leaveMenu.actor); + this.leaveMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.tooltip){ + this.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.active = false; + this.sync_hover(); + this.hovered = this.hover; + } + }); + } + + _onDestroy(){ + Main.uiGroup.remove_child(this.leaveMenu.actor); + this.leaveMenu.destroy(); + } + + activate(event) { + super.activate(event); + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.leaveMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.leaveMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + this.leaveMenu.toggle(); + } +}); + +//'Unity' layout categories hamburger button +var CategoriesButton = GObject.registerClass(class Arc_Menu_CategoriesButton extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, _("Categories"), Me.path + Constants.HamburgerIcon.PATH); + this.toggleMenuOnClick = false; + } + activate(event) { + super.activate(event); + this._menuLayout.toggleCategoriesMenu(); + } +}); + +var PowerButton = GObject.registerClass(class Arc_Menu_PowerButton extends ArcMenuButtonItem { + _init(menuLayout, powerType) { + super._init(menuLayout, Constants.PowerOptions[powerType].TITLE, Constants.PowerOptions[powerType].IMAGE); + this.powerType = powerType; + } + activate(event) { + activatePowerOption(this.powerType, this._menuLayout.arcMenu); + } +}); + +var PowerMenuItem = GObject.registerClass(class Arc_Menu_PowerMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, type) { + super._init(menuLayout); + this.powerType = type; + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(Constants.PowerOptions[this.powerType].TITLE), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this.label); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: Gio.icon_new_for_string(Constants.PowerOptions[this.powerType].IMAGE), + style_class: 'popup-menu-icon', + icon_size: iconSize, + }); + } + + activate(){ + activatePowerOption(this.powerType, this._menuLayout.arcMenu); + } +}); + +var PlasmaMenuItem = GObject.registerClass(class Arc_Menu_PlasmaMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, title, iconPath) { + super._init(menuLayout); + this.remove_child(this._ornamentLabel); + this._menuLayout = menuLayout; + this.tooltipLocation = Constants.TooltipLocation.BOTTOM_CENTERED; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.vertical = true; + this.name = "arc-menu-plasma-button"; + this.iconPath = iconPath; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(title), + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + + this.label.x_align = this.label.y_align = Clutter.ActorAlign.CENTER; + this.label.y_expand = true; + + this._iconBin.x_align = this._iconBin.y_align = Clutter.ActorAlign.CENTER; + this._iconBin.y_expand = true; + + this.label.get_clutter_text().set_line_wrap(true); + this.add_child(this.label); + this.actor.connect('notify::hover', this._onHover.bind(this)); + } + + createIcon(){ + return new St.Icon({ + gicon: Gio.icon_new_for_string(this.iconPath), + style_class: 'popup-menu-icon', + icon_size: Constants.MEDIUM_ICON_SIZE + }); + } + + _onHover(){ + if(this.tooltip === undefined && this.actor.hover && this.label){ + let description = null; + Utils.createTooltip(this._menuLayout, this, this.label, description, Constants.DisplayType.LIST); + } + let shouldHover = this._settings.get_boolean('plasma-enable-hover'); + if(shouldHover && this.actor.hover && !this.isActive){ + this.activate(Clutter.get_current_event()); + } + } + + set active(active) { + let activeChanged = active != this.active; + if(activeChanged){ + this._active = active; + if(active){ + this.add_style_class_name('selected'); + this._menuLayout.activeMenuItem = this; + if(this.can_focus) + this.grab_key_focus(); + } + else{ + this.remove_style_class_name('selected'); + } + this.notify('active'); + } + } + + setActive(active){ + if(active){ + this.isActive = true; + this.set_style_pseudo_class("active-item"); + } + else{ + this.isActive = false; + this.set_style_pseudo_class(null); + } + } + + activate(event){ + this._menuLayout.searchBox.clearWithoutSearchChangeEvent(); + this._menuLayout.clearActiveItem(); + this.setActive(true); + super.activate(event); + } +}); + +var PlasmaCategoryHeader = GObject.registerClass(class Arc_Menu_PlasmaCategoryHeader extends St.BoxLayout{ + _init(menuLayout) { + super._init({ + style_class: "popup-menu-item", + style: 'padding: 0px;', + reactive: true, + track_hover:true, + can_focus: true, + accessible_role: Atk.Role.MENU_ITEM + }); + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this.backButton = new ArcMenuPopupBaseMenuItem(this._menuLayout); + this.backButton.x_expand = false; + this.backButton.x_align = Clutter.ActorAlign.CENTER; + this.label = new St.Label({ + text: _("Applications"), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER, + style: 'font-weight: bold' + }); + + this.backButton.add_child(this.label); + + this.add_child(this.backButton); + this.backButton.connect("activate", () => this._menuLayout.displayCategories() ); + + this.categoryLabel = new St.Label({ + text: '', + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this.categoryLabel); + } + + setActiveCategory(categoryText){ + if(categoryText){ + this.categoryLabel.text = _(categoryText); + this.categoryLabel.show(); + } + else + this.categoryLabel.hide(); + } +}); + +var AllAppsButton = GObject.registerClass(class Arc_Menu_AllAppsButton extends ArcMenuButtonItem{ + _init(menuLayout) { + super._init(menuLayout, null, 'go-next-symbolic'); + this.setIconSize(Constants.EXTRA_SMALL_ICON_SIZE); + this.toggleMenuOnClick = false; + this.style = 'min-height: 28px; padding: 0px 8px;' + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.x_expand = true; + this.x_align = Clutter.ActorAlign.END; + this._label = new St.Label({ + text: _("All Apps"), + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.insert_child_at_index(this._label, 0); + } + + activate(event){ + super.activate(event); + this._menuLayout.displayAllApps(); + } +}); + +var BackButton = GObject.registerClass(class Arc_Menu_BackButton extends ArcMenuButtonItem{ + _init(menuLayout) { + super._init(menuLayout, null, 'go-previous-symbolic'); + this.setIconSize(Constants.EXTRA_SMALL_ICON_SIZE); + this.toggleMenuOnClick = false; + this.style = 'min-height: 28px; padding: 0px 8px;' + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + this.x_expand = true; + this.x_align = Clutter.ActorAlign.END; + this._label = new St.Label({ + text: _("Back"), + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_expand: false, + y_align: Clutter.ActorAlign.CENTER + }); + + this.add_child(this._label); + } + + activate(event){ + super.activate(event); + this._menuLayout.setDefaultMenuView(); + } +}); + +// Menu item to go back to category view +var BackMenuItem = GObject.registerClass(class Arc_Menu_BackMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._layout = this._menuLayout.layout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin({ + x_expand: false, + x_align: Clutter.ActorAlign.START, + }); + this.add_child(this._iconBin); + + this._updateIcon(); + + let backLabel = new St.Label({ + text: _("Back"), + x_expand: false, + x_align: Clutter.ActorAlign.START, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(backLabel); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.MISC_ICON_SIZE); + + return new St.Icon({ + icon_name: 'go-previous-symbolic', + icon_size: iconSize, + }); + } + + activate(event) { + if(this._layout === Constants.MenuLayout.ARCMENU){ + //If the current page is inside a category and + //previous page was the categories page, + //go back to categories page + if(this._menuLayout.previousCategoryType === Constants.CategoryType.CATEGORIES_LIST && (this._menuLayout.activeCategoryType <= 4 || this._menuLayout.activeCategoryType instanceof GMenu.TreeDirectory)) + this._menuLayout.displayCategories(); + else + this._menuLayout.setDefaultMenuView(); + } + else if(this._layout === Constants.MenuLayout.TOGNEE) + this._menuLayout.setDefaultMenuView(); + super.activate(event); + } +}); + +// Menu item to view all apps +var ViewAllPrograms = GObject.registerClass(class Arc_Menu_ViewAllPrograms extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + let backLabel = new St.Label({ + text: _("All Applications"), + x_expand: false, + x_align: Clutter.ActorAlign.START, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + }); + this.add_child(backLabel); + + this._iconBin = new St.Bin({ + x_expand: false, + x_align: Clutter.ActorAlign.START, + }); + this.add_child(this._iconBin); + this._updateIcon(); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.MISC_ICON_SIZE); + + return new St.Icon({ + icon_name: 'go-next-symbolic', + icon_size: iconSize, + x_align: Clutter.ActorAlign.START + }); + } + + activate(event) { + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS || defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + this._menuLayout.displayCategories(); + else + this._menuLayout.displayAllApps(); + super.activate(event); + } +}); + +var ShortcutMenuItem = GObject.registerClass(class Arc_Menu_ShortcutMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, name, icon, command, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + if(this._settings.get_enum('shortcut-icon-type') === Constants.CategoryIconType.FULL_COLOR) + this.add_style_class_name('regular-icons'); + else + this.add_style_class_name('symbolic-icons'); + this._command = command; + this._displayType = displayType; + this.isContainedInCategory = isContainedInCategory; + this.iconName = icon; + + //Check for default commands-------- + if(this._command == "ArcMenu_Software"){ + let softwareManager = Utils.findSoftwareManager(); + this._command = softwareManager ? softwareManager : 'ArcMenu_unfound.desktop'; + } + else if(this._command === "ArcMenu_Trash"){ + this.trash = new Me.imports.placeDisplay.Trash(this); + this._command = "ArcMenu_Trash"; + this._app = this.trash.getApp(); + } + if(!this._app) + this._app = Shell.AppSystem.get_default().lookup_app(this._command); + + if(this._app && icon === ''){ + let appIcon = this._app.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(appIcon instanceof St.Icon){ + this.iconName = appIcon.gicon.to_string(); + } + } + //------------------------------------- + + this.hasContextMenu = this._app ? true : false; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(name), y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this.layout = this._settings.get_enum('menu-layout'); + if(this.layout === Constants.MenuLayout.PLASMA && this._settings.get_boolean('apps-show-extra-details') && this._app){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionLabel = new St.Label({ + text: this._app.get_description(), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + if(this._app.get_description()) + labelBox.add_child(descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + else if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.remove_child(this.label); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + } + this.setShouldShow(); + } + + createIcon(){ + let iconSizeEnum; + if(this.isContainedInCategory) + iconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + else + iconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + iconSizeEnum = this._settings.get_enum('button-item-icon-size'); + defaultIconSize = LayoutProps.DefaultButtonsIconSize; + iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + } + else if(this._displayType === Constants.DisplayType.GRID){ + iconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(iconSizeEnum, defaultIconStyle); + } + + return new St.Icon({ + icon_name: this.iconName, + gicon: Gio.icon_new_for_string(this.iconName), + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + } + + popupContextMenu(){ + if(this._app && this.contextMenu == undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._displayType === Constants.DisplayType.GRID || this.layout === Constants.MenuLayout.UNITY || this.layout === Constants.MenuLayout.AZ) + this.contextMenu.centerBoxPointerPosition(); + else if(this.layout === Constants.MenuLayout.MINT || this.layout === Constants.MenuLayout.TOGNEE) + this.contextMenu.rightBoxPointerPosition(); + if(this._path) + this.contextMenu.path = this._path; + } + if(this.contextMenu !== undefined){ + if(this.tooltip !== undefined) + this.tooltip.hide(); + if(!this.contextMenu.isOpen){ + this.contextMenu.rebuildItems(); + } + this.contextMenu.toggle(); + } + } + + activate(event) { + if(this._command === "ArcMenu_LogOut") + activatePowerOption(Constants.PowerType.LOGOUT, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Lock") + activatePowerOption(Constants.PowerType.LOCK, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_PowerOff") + activatePowerOption(Constants.PowerType.POWER_OFF, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Restart") + activatePowerOption(Constants.PowerType.RESTART, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Suspend") + activatePowerOption(Constants.PowerType.SUSPEND, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_HybridSleep") + activatePowerOption(Constants.PowerType.HYBRID_SLEEP, this._menuLayout.arcMenu); + else if(this._command === "ArcMenu_Hibernate") + activatePowerOption(Constants.PowerType.HIBERNATE, this._menuLayout.arcMenu); + + else{ + this._menuLayout.arcMenu.toggle(); + if(this._command === "ArcMenu_ActivitiesOverview") + Main.overview.show(); + else if(this._command === "ArcMenu_RunCommand") + Main.openRunDialog(); + else if(this._command === "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else if(this._app) + this._app.open_new_window(-1); + else + Util.spawnCommandLine(this._command); + } + } +}); + +// Menu item which displays the current user +var UserMenuItem = GObject.registerClass(class Arc_Menu_UserMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, displayType) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._displayType = displayType; + this._settings = this._menuLayout._settings; + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + this.iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + } + else{ + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + this.iconSize = Utils.getIconSize(IconSizeEnum, USER_AVATAR_SIZE); + } + + this.userMenuIcon = new UserMenuIcon(menuLayout, this.iconSize, false); + + this.add_child(this.userMenuIcon.actor); + this.label = this.userMenuIcon.label; + if(this._displayType !== Constants.DisplayType.BUTTON) + this.add_child(this.label); + } + + activate(event) { + Util.spawnCommandLine("gnome-control-center user-accounts"); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +var UserMenuIcon = class Arc_Menu_UserMenuIcon{ + constructor(menuLayout, size, hasTooltip) { + this._menuLayout = menuLayout; + this.iconSize = size; + + let username = GLib.get_user_name(); + this._user = AccountsService.UserManager.get_default().get_user(username); + + this.actor = new St.Bin({ + style_class: 'menu-user-avatar user-icon', + track_hover: true, + reactive: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + + this.label = new St.Label({ + text: GLib.get_real_name(), + y_align: Clutter.ActorAlign.CENTER + }); + + this.actor.style = "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + + this._userLoadedId = this._user.connect('notify::is-loaded', this._onUserChanged.bind(this)); + this._userChangedId = this._user.connect('changed', this._onUserChanged.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + if(hasTooltip) + this.actor.connect('notify::hover',this._onHover.bind(this)); + + this._onUserChanged(); + } + + _onHover() { + if(this.tooltip === undefined && this.actor.hover){ + this.tooltip = new Tooltip(this._menuLayout, this.actor, GLib.get_real_name()); + this.tooltip.location = Constants.TooltipLocation.BOTTOM_CENTERED; + this.tooltip._onHover(); + } + } + + _onUserChanged() { + if (this._user.is_loaded) { + this.label.set_text(this._user.get_real_name()); + if(this.tooltip) + this.tooltip.titleLabel.text = this._user.get_real_name(); + + let iconFile = this._user.get_icon_file(); + if (iconFile && !GLib.file_test(iconFile ,GLib.FileTest.EXISTS)) + iconFile = null; + + if (iconFile) { + this.actor.child = null; + this.actor.add_style_class_name('user-avatar'); + this.actor.style = 'background-image: url("%s");'.format(iconFile) + "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + } + else { + this.actor.style = "width: " + this.iconSize + "px; height: " + this.iconSize + "px;"; + this.actor.child = new St.Icon({ + icon_name: 'avatar-default-symbolic', + icon_size: this.iconSize, + style: "padding: 5px; width: " + this.iconSize + "px; height: " + this.iconSize + "px;" + }); + } + } + } + + _onDestroy() { + if (this._userLoadedId) { + this._user.disconnect(this._userLoadedId); + this._userLoadedId = null; + } + if (this._userChangedId) { + this._user.disconnect(this._userChangedId); + this._userChangedId = null; + } + } +}; + +// Menu pinned apps item class +var PinnedAppsMenuItem = GObject.registerClass({ + Signals: { 'saveSettings': {}, }, +}, class Arc_Menu_PinnedAppsMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, name, icon, command, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._menuButton = menuLayout.menuButton; + this._settings = this._menuLayout._settings; + this._command = command; + this._iconString = this._iconPath = icon; + this._name = name; + this._displayType = displayType; + this._app = Shell.AppSystem.get_default().lookup_app(this._command); + this.hasContextMenu = true; + this.gridLocation = [-1, -1]; + this.isContainedInCategory = isContainedInCategory; + + //Modifiy the Default Pinned Apps--------------------- + if(this._name == "ArcMenu Settings"){ + this._name = _("ArcMenu Settings"); + } + else if(this._name == "Terminal"){ + this._name = _("Terminal"); + } + else if(this._name == "Files"){ + this._name = _("Files"); + } + if(this._iconPath === "ArcMenu_ArcMenuIcon" || this._iconPath === Me.path + '/media/icons/arc-menu-symbolic.svg'){ + this._iconString = this._iconPath = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + } + //------------------------------------------------------- + + if(this._app && this._iconPath === ''){ + let appIcon = this._app.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(appIcon instanceof St.Icon){ + this._iconString = appIcon.gicon ? appIcon.gicon.to_string() : appIcon.fallback_icon_name; + if(!this._iconString) + this._iconString = ""; + } + } + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: _(this._name), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + if(this._displayType === Constants.DisplayType.LIST && this._settings.get_boolean('apps-show-extra-details') && this._app){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionLabel = new St.Label({ + text: this._app.get_description(), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + if(this._app.get_description()) + labelBox.add_child(descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + this._draggable = DND.makeDraggable(this.actor); + this._draggable._animateDragEnd = (eventTime) => { + this._draggable._animationInProgress = true; + this._draggable._onAnimationComplete(this._draggable._dragActor, eventTime); + }; + this.isDraggableApp = true; + this._draggable.connect('drag-begin', this._onDragBegin.bind(this)); + this._draggable.connect('drag-end', this._onDragEnd.bind(this)); + + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + + this.setShouldShow(); + } + + createIcon(){ + let iconSize; + if(this._displayType === Constants.DisplayType.GRID){ + const IconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(IconSizeEnum, defaultIconStyle); + } + else if(this._displayType === Constants.DisplayType.LIST){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultPinnedIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + return new St.Icon({ + gicon: Gio.icon_new_for_string(this._iconString), + icon_size: iconSize + }); + } + + popupContextMenu(){ + if(this.contextMenu == undefined){ + let app = this._app ? this._app : this._command; + this.contextMenu = new ApplicationContextMenu(this.actor, app, this._menuLayout); + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(this.tooltip !== undefined) + this.tooltip.hide(); + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + _onDragBegin() { + this.isDragging = true; + if(this._menuButton.tooltipShowingID){ + GLib.source_remove(this._menuButton.tooltipShowingID); + this._menuButton.tooltipShowingID = null; + this._menuButton.tooltipShowing = false; + } + if(this.tooltip){ + this.tooltip.hide(); + this._menuButton.tooltipShowing = false; + } + + if(this.contextMenu && this.contextMenu.isOpen) + this.contextMenu.toggle(); + + this.cancelPopupTimeout(); + + this._dragMonitor = { + dragMotion: this._onDragMotion.bind(this) + }; + DND.addDragMonitor(this._dragMonitor); + this._parentBox = this.actor.get_parent(); + let p = this._parentBox.get_transformed_position(); + this.posX = p[0]; + this.posY = p[1]; + + this.actor.opacity = 55; + this.get_allocation_box(); + this.rowHeight = this.height; + this.rowWidth = this.width; + } + + _onDragMotion(dragEvent) { + let layoutManager = this._parentBox.layout_manager; + if(layoutManager instanceof Clutter.GridLayout){ + this.xIndex = Math.floor((this._draggable._dragX - this.posX) / (this.rowWidth + layoutManager.column_spacing)); + this.yIndex = Math.floor((this._draggable._dragY - this.posY) / (this.rowHeight + layoutManager.row_spacing)); + + if(this.xIndex === this.gridLocation[0] && this.yIndex === this.gridLocation[1]){ + return DND.DragMotionResult.CONTINUE; + } + else{ + this.gridLocation = [this.xIndex, this.yIndex]; + } + + this._parentBox.remove_child(this); + let children = this._parentBox.get_children(); + let childrenCount = children.length; + let columns = layoutManager.gridColumns; + let rows = Math.floor(childrenCount / columns); + if(this.yIndex >= rows) + this.yIndex = rows; + if(this.yIndex < 0) + this.yIndex = 0; + if(this.xIndex >= columns - 1) + this.xIndex = columns - 1; + if(this.xIndex < 0) + this.xIndex = 0; + + if(((this.xIndex + 1) + (this.yIndex * columns)) > childrenCount) + this.xIndex = Math.floor(childrenCount % columns); + + this._parentBox.remove_all_children(); + + let x = 0, y = 0; + for(let i = 0; i < children.length; i++){ + if(this.xIndex === x && this.yIndex === y) + [x, y] = this.gridLayoutIter(x, y, columns); + layoutManager.attach(children[i], x, y, 1, 1); + [x, y] = this.gridLayoutIter(x, y, columns); + } + layoutManager.attach(this, this.xIndex, this.yIndex, 1, 1); + } + return DND.DragMotionResult.CONTINUE; + } + + _onDragEnd() { + if (this._dragMonitor) { + DND.removeDragMonitor(this._dragMonitor); + this._dragMonitor = null; + } + this.actor.opacity = 255; + let layoutManager = this._parentBox.layout_manager; + if(layoutManager instanceof Clutter.GridLayout){ + let x = 0, y = 0; + let columns = layoutManager.gridColumns; + let orderedList = []; + let children = this._parentBox.get_children(); + for(let i = 0; i < children.length; i++){ + orderedList.push(this._parentBox.layout_manager.get_child_at(x, y)); + [x, y] = this.gridLayoutIter(x, y, columns); + } + this._menuLayout.pinnedAppsArray = orderedList; + } + this.emit('saveSettings'); + } + + getDragActor() { + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + let icon = new St.Icon({ + gicon: Gio.icon_new_for_string(this._iconString), + style_class: 'popup-menu-icon', + icon_size: this._iconBin.get_child().icon_size + }); + let iconColor = this._settings.get_string('menu-foreground-color'); + if(customStyle) + icon.style = `color: ${iconColor};`; + return icon; + } + + getDragActorSource() { + return this.actor; + } + + gridLayoutIter(x, y, columns){ + x++; + if(x === columns){ + y++; + x = 0; + } + return [x, y]; + } + + activate(event) { + if(this._app) + this._app.open_new_window(-1); + else if(this._command === "ArcMenu_ShowAllApplications") + Main.overview._overview._controls._toggleAppsPage(); + else + Util.spawnCommandLine(this._command); + + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } +}); + +var ApplicationMenuItem = GObject.registerClass(class Arc_Menu_ApplicationMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, app, displayType, metaInfo, isContainedInCategory) { + super._init(menuLayout); + this._app = app; + this._menuLayout = menuLayout; + this.metaInfo = metaInfo; + this._settings = this._menuLayout._settings; + this.searchType = this._menuLayout.layoutProperties.SearchDisplayType; + this._displayType = displayType; + this.hasContextMenu = true; + this.isSearchResult = this.metaInfo ? true : false; + this.isContainedInCategory = isContainedInCategory; + + if(this._app){ + let disableRecentAppsIndicator = this._settings.get_boolean("disable-recently-installed-apps") + if(!disableRecentAppsIndicator){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + this.isRecentlyInstalled = recentApps.some((appIter) => appIter === this._app.get_id()); + } + } + + this._iconBin = new St.Bin({ + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: this._app ? this._app.get_name() : this.metaInfo['name'], + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.description = this._app ? this._app.get_description() : this.metaInfo['description']; + + let searchResultsDescriptionsSetting = this._settings.get_boolean("show-search-result-details"); + let appsShowDescriptionsSetting = this._settings.get_boolean("apps-show-extra-details"); + this.searchResultsDescriptions = searchResultsDescriptionsSetting && this.isSearchResult; + this.appsShowDescriptions = appsShowDescriptionsSetting && !this.isSearchResult; + + if(this.description && (this.searchResultsDescriptions || this.appsShowDescriptions) && this._displayType === Constants.DisplayType.LIST){ + let labelBox = new St.BoxLayout({ + vertical: true + }); + let descriptionText = this.description.split('\n')[0]; + this.descriptionLabel = new St.Label({ + text: descriptionText, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER, + style: "font-weight: lighter;" + }); + labelBox.add_child(this.label); + labelBox.add_child(this.descriptionLabel); + this.add_child(labelBox); + } + else{ + this.add_child(this.label); + } + + this.label_actor = this.label; + + if(this.isRecentlyInstalled){ + this._indicator = new St.Label({ + text: _('New'), + style_class: "arc-menu-menu-item-text-indicator", + style: "border-radius: 15px; margin: 0px; padding: 0px 10px;", + x_expand: true, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._indicator); + } + if(this._displayType === Constants.DisplayType.GRID) + Utils.convertToGridLayout(this); + + this.hoverID = this.connect("notify::hover", () => this.removeIndicator()); + this.keyFocusInID = this.connect("key-focus-in", () => this.removeIndicator()); + } + + createIcon(){ + let iconSize; + if(this._displayType === Constants.DisplayType.GRID){ + this._iconBin.x_align = Clutter.ActorAlign.CENTER; + + const IconSizeEnum = this._settings.get_enum('menu-item-grid-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconStyle = LayoutProps.DefaultIconGridStyle; + iconSize = Utils.getGridIconSize(IconSizeEnum, defaultIconStyle); + } + else if(this._displayType === Constants.DisplayType.LIST){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory || this.isSearchResult ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultPinnedIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + return this.metaInfo ? this.metaInfo['createIcon'](iconSize) : this._app.create_icon_texture(iconSize); + } + + removeIndicator(){ + if(this.isRecentlyInstalled){ + this.isRecentlyInstalled = false; + let recentApps = this._settings.get_strv('recently-installed-apps'); + let index = recentApps.indexOf(this._app.get_id()); + if(index > -1){ + recentApps.splice(index, 1); + } + this._settings.set_strv('recently-installed-apps', recentApps); + + this._indicator.hide(); + this._menuLayout.setRecentlyInstalledIndicator(); + } + } + + popupContextMenu(){ + this.removeIndicator(); + if(this.tooltip) + this.tooltip.hide(); + if(!this._app && !this._path) + return; + + if(this.contextMenu === undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._path) + this.contextMenu.path = this._path; + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + activateSearchResult(provider, metaInfo, terms, event){ + this._menuLayout.arcMenu.toggle(); + if(provider.activateResult){ + provider.activateResult(metaInfo.id, terms); + if (metaInfo.clipboardText) + St.Clipboard.get_default().set_text(St.ClipboardType.CLIPBOARD, metaInfo.clipboardText); + } + else{ + if (metaInfo.id.endsWith('.desktop')) { + let app = Shell.AppSystem.get_default().lookup_app(metaInfo.id); + if (app.can_open_new_window()) + app.open_new_window(-1); + else + app.activate(); + } + else{ + this._menuLayout.arcMenu.itemActivated(BoxPointer.PopupAnimation.NONE); + SystemActions.activateAction(metaInfo.id); + } + } + } + + activate(event) { + this.removeIndicator(); + + if(this.metaInfo){ + this.activateSearchResult(this.provider, this.metaInfo, this.resultsView.terms, event); + return Clutter.EVENT_STOP; + } + else + this._app.open_new_window(-1); + + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _onDestroy(){ + if(this.hoverID){ + this.disconnect(this.hoverID); + this.hoverID = null; + } + if(this.keyFocusInID){ + this.disconnect(this.keyFocusInID); + this.keyFocusInID = null; + } + } +}); + +// Menu Category item class +var CategoryMenuItem = GObject.registerClass(class Arc_Menu_CategoryMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, category, displayType) { + super._init(menuLayout); + this.appList = []; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + this._layout = this._settings.get_enum('menu-layout'); + this._category = category; + this._name = ""; + this._horizontalFlip = this._settings.get_boolean('enable-horizontal-flip'); + this._displayType = displayType; + this.layoutProps = this._menuLayout.layoutProperties; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ + text: this._name, + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this.label); + + if(this.isRecentlyInstalled) + this.setRecentlyInstalledIndicator(true); + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.x_expand = false; + this.x_align = Clutter.ActorAlign.CENTER; + this.y_expand = false; + this.y_align = Clutter.ActorAlign.CENTER; + this.remove_child(this.label); + } + + this.label_actor = this.label; + this._menuLayout._oldX = -1; + this._menuLayout._oldY = -1; + this.connect('motion-event', this._onMotionEvent.bind(this)); + this.connect('enter-event', this._onEnterEvent.bind(this)); + this.connect('leave-event', this._onLeaveEvent.bind(this)); + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + + let defaultIconSize = this.layoutProps.DefaultCategoryIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + let defaultIconSize = this.layoutProps.DefaultButtonsIconSize; + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + let icon = new St.Icon({ + style_class: 'popup-menu-icon', + icon_size: iconSize + }); + + let categoryIconType = this._settings.get_enum('category-icon-type'); + let [name, gicon, iconName, fallbackIconName] = Utils.getCategoryDetails(this._category, categoryIconType); + this._name = _(name); + if(gicon) + icon.gicon = gicon; + else if(iconName) + icon.icon_name = iconName; + else + icon.fallback_icon_name = fallbackIconName; + + return icon; + } + + setRecentlyInstalledIndicator(shouldShow){ + if(this._displayType === Constants.DisplayType.BUTTON) + return; + this.isRecentlyInstalled = shouldShow; + if(shouldShow){ + this._indicator = new St.Icon({ + icon_name: 'message-indicator-symbolic', + style_class: 'arc-menu-menu-item-indicator', + icon_size: INDICATOR_ICON_SIZE, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.add_child(this._indicator); + } + else if(this._indicator && this.contains(this._indicator)) + this.remove_child(this._indicator); + } + + displayAppList(){ + this._menuLayout.searchBox?.clearWithoutSearchChangeEvent(); + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, null); + } + + activate(event) { + this.displayAppList(); + if(this.layoutProps.SupportsCategoryOnHover) + this._menuLayout.setActiveCategory(this, true); + super.activate(event); + } + + _onEnterEvent(actor, event) { + if(this._menuLayout.navigatingCategoryLeaveEventID){ + GLib.source_remove(this._menuLayout.navigatingCategoryLeaveEventID); + this._menuLayout.navigatingCategoryLeaveEventID = null; + } + } + + _onLeaveEvent(actor, event) { + if(!this._menuLayout.navigatingCategoryLeaveEventID){ + this._menuLayout.navigatingCategoryLeaveEventID = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 200, () => { + this._menuLayout.navigatingCategory = null; + this._menuLayout.navigatingCategoryLeaveEventID = null; + return GLib.SOURCE_REMOVE; + }); + } + } + + _onMotionEvent(actor, event) { + if(this.layoutProps.SupportsCategoryOnHover && this._settings.get_boolean('activate-on-hover')){ + if (!this._menuLayout.navigatingCategory) { + this._menuLayout.navigatingCategory = this; + } + + if (this._isInTriangle(event.get_coords())){ + if(this._menuLayout.activeCategoryType !== this._category && this._menuLayout.navigatingCategory === this) + this.activate(Clutter.get_current_event()); + return true; + } + this._menuLayout.navigatingCategory = this; + return true; + } + } + + _isInTriangle([x, y]){ + let [posX, posY] = this._menuLayout.navigatingCategory.get_transformed_position(); + + //the mouse is still in the active category + if (this._menuLayout.navigatingCategory === this){ + this._menuLayout._oldX = x; + this._menuLayout._oldY = y; + return true; + } + + if(!this._menuLayout.navigatingCategory) + return false; + + let width = this._menuLayout.navigatingCategory.width; + let height = this._menuLayout.navigatingCategory.height; + + let maxX = this._horizontalFlip ? posX : posX + width; + let maxY = posY + height; + + let distance = Math.abs(maxX - this._menuLayout._oldX); + let point1 = [this._menuLayout._oldX, this._menuLayout._oldY] + let point2 = [maxX, posY - distance]; + let point3 = [maxX, maxY + distance]; + + let area = Utils.areaOfTriangle(point1, point2, point3); + let a1 = Utils.areaOfTriangle([x, y], point2, point3); + let a2 = Utils.areaOfTriangle(point1, [x, y], point3); + let a3 = Utils.areaOfTriangle(point1, point2, [x, y]); + return area === a1 + a2 + a3; + } +}); + +var SimpleMenuItem = GObject.registerClass(class Arc_Menu_SimpleMenuItem extends CategoryMenuItem{ + _init(menuLayout, category) { + super._init(menuLayout, category); + this.subMenu = new PopupMenu.PopupMenu(this.actor,.5,St.Side.LEFT); + this.subMenu.connect("open-state-changed", (menu, open) => { + if(!open){ + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + }); + + Main.uiGroup.add_child(this.subMenu.actor); + this.section = new PopupMenu.PopupMenuSection(); + this.subMenu.addMenuItem(this.section); + + this.applicationsScrollBox = this._menuLayout._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this._menuLayout.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + this._menuLayout.subMenuManager.addMenu(this.subMenu); + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.applicationsScrollBox.style = 'max-height: 25em;'; + this.applicationsBox._delegate = this.applicationsBox; + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.section.actor.add_child(this.applicationsScrollBox); + + if(this.subMenu._keyPressId) + this.actor.disconnect(this.subMenu._keyPressId); + this.applicationsScrollBox.connect("key-press-event",(actor, event)=>{ + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Right: + case Clutter.KEY_Left: + this.subMenu.toggle(); + this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + case Clutter.KEY_Escape: + if(this.subMenu.isOpen){ + this.subMenu.toggle(); + this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + } + return Clutter.EVENT_STOP; + default: + return Clutter.EVENT_PROPAGATE; + } + }); + this.actor.connect("key-press-event",(actor, event)=>{ + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Escape: + if(this.subMenu.isOpen){ + this.subMenu.toggle(); + } + return Clutter.EVENT_STOP; + case Clutter.KEY_Left: + case Clutter.KEY_Right: + case Clutter.KEY_Return: + if(!this.subMenu.isOpen){ + let navigateFocus = true; + this.activate(event, navigateFocus); + this.subMenu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + return Clutter.EVENT_STOP; + } + else{ + return Clutter.EVENT_PROPAGATE; + } + default: + return Clutter.EVENT_PROPAGATE; + } + }); + this.updateStyle(); + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + + this.subMenu.actor.hide(); + if(customStyle){ + this.subMenu.actor.style_class = 'arc-menu-boxpointer'; + this.subMenu.actor.add_style_class_name('arc-menu'); + } + else + { + this.subMenu.actor.style_class = 'popup-menu-boxpointer'; + this.subMenu.actor.add_style_class_name('popup-menu'); + } + } + + displayAppList(){ + this._menuLayout.activeCategory = this._name; + } + + activate(event, navigateFocus = true) { + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, true); + this.subMenu.toggle(); + if(navigateFocus) + this.subMenu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); + this._menuLayout.setActiveCategory(this, true); + } + + _onMotionEvent(actor, event) { + if (!this._menuLayout.navigatingCategory) { + this._menuLayout.navigatingCategory = this; + } + + if (this._isInTriangle(event.get_coords())){ + if(this._menuLayout.activeCategory !== this._name && this._menuLayout.navigatingCategory === this){ + let navigateFocus = false; + this.activate(event, navigateFocus); + } + return true; + } + this._menuLayout.navigatingCategory = this; + return true; + } +}); +// SubMenu Category item class +var CategorySubMenuItem = GObject.registerClass(class Arc_Menu_CategorySubMenuItem extends PopupMenu.PopupSubMenuMenuItem{ + _init(menuLayout, category) { + super._init('', true); + this.add_style_class_name("arcmenu-menu-item"); + this.add_style_class_name('margin-box'); + this._category = category; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + this._name = ""; + this.isSimpleMenuItem = false; + this._active = false; + this.applicationsMap = new Map(); + this.appList = []; + + let categoryIconType = this._settings.get_enum('category-icon-type'); + let [name, gicon, iconName, fallbackIconName] = Utils.getCategoryDetails(this._category, categoryIconType); + this._name = _(name); + if(gicon) + this.icon.gicon = gicon; + else if(iconName) + this.icon.icon_name = iconName; + else + this.icon.fallback_icon_name = fallbackIconName; + + this.label.text = this._name; + + const IconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = LayoutProps.DefaultCategoryIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + this.icon.icon_size = iconSize; + + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', (action) => { + this._menuLayout._blockActivateEvent = true; + this._menuLayout.onPan(action, this.menu.actor); + }); + panAction.connect('gesture-cancel',(action) => this._menuLayout.onPanEnd(action, this.menu.actor)); + panAction.connect('gesture-end', (action) => this._menuLayout.onPanEnd(action, this.menu.actor)); + this.menu.actor.add_action(panAction); + + this.menu.actor.style = 'max-height: 250px;'; + this.menu.actor.overlay_scrollbars = true; + this.menu.actor.style_class = 'popup-sub-menu ' + (this._menuLayout.disableFadeEffect ? '' : 'small-vfade'); + this.menu._needsScrollbar = () => this._needsScrollbar(); + + this.menu.connect('open-state-changed', () => { + if(!this.menu.isOpen){ + let scrollbar= this.menu.actor.get_vscroll_bar().get_adjustment(); + scrollbar.set_value(0); + } + }); + this.menu.box.style_class = 'margin-box'; + } + + setRecentlyInstalledIndicator(shouldShow){ + this.isRecentlyInstalled = shouldShow; + if(shouldShow){ + this._indicator = new St.Icon({ + icon_name: 'message-indicator-symbolic', + style_class: 'arc-menu-menu-item-indicator', + icon_size: INDICATOR_ICON_SIZE, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER + }); + this.actor.add_child(this._indicator); + } + else if(this._indicator && this.actor.contains(this._indicator)) + this.actor.remove_child(this._indicator); + } + + _needsScrollbar() { + let topMenu = this.menu; + let [, topNaturalHeight] = topMenu.actor.get_preferred_height(-1); + let topThemeNode = topMenu.actor.get_theme_node(); + + let topMaxHeight = topThemeNode.get_max_height(); + let needsScrollbar = topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight; + if(needsScrollbar) + this.menu.actor.style = 'min-height:150px; max-height: 250px;'; + else + this.menu.actor.style = 'max-height: 250px;'; + + this.menu.actor.vscrollbar_policy = St.PolicyType.AUTOMATIC; + + if (needsScrollbar) + this.menu.actor.add_style_pseudo_class('scrolled'); + else + this.menu.actor.remove_style_pseudo_class('scrolled'); + + return needsScrollbar; + } + + loadMenu(){ + let children = this.menu.box.get_children(); + for (let i = 0; i < children.length; i++) { + let item = children[i]; + this.menu.box.remove_child(item); + } + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + for (let i = 0; i < appList.length; i++) { + let app = appList[i]; + let item = this.applicationsMap.get(app); + if(item.actor.get_parent()){ + item.actor.get_parent().remove_child(item.actor); + } + if (!item.actor.get_parent()) { + this.menu.box.add_child(item.actor); + } + } + } + + _setOpenState(open){ + if(this.isSimpleMenuItem && open){ + this._menuLayout.activeCategory = this._name; + Utils.activateCategory(this._category, this._menuLayout, this, true); + } + else if(open) + this.loadMenu(); + + this.setSubmenuShown(open); + } +}); + +// Place Info class +var PlaceInfo = class Arc_Menu_PlaceInfo { + constructor(file, name, icon) { + this.file = file; + this.name = name ? name : this._getFileName(); + this.icon = icon ? icon : null; + this.gicon = icon ? null : this.getIcon(); + } + + launch(timestamp) { + let context = global.create_app_launch_context(timestamp, -1); + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + Main.notifyError(_('Failed to open “%s”').format(this._getFileName()), e.message); + reject(e); + } + }); + }); + } + + getIcon() { + try { + let info = this.file.query_info('standard::symbolic-icon', 0, null); + return info.get_symbolic_icon(); + + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + if (!this.file.is_native()) { + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + } else { + return new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + } + } + + _getFileName() { + try { + let info = this.file.query_info('standard::display-name', 0, null); + return info.get_display_name(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + return this.file.get_basename(); + } + } + } + + destroy(){ + } +}; +Signals.addSignalMethods(PlaceInfo.prototype); + +// Menu Place Shortcut item class +var PlaceMenuItem = GObject.registerClass(class Arc_Menu_PlaceMenuItem extends ArcMenuPopupBaseMenuItem{ + _init(menuLayout, info, displayType, isContainedInCategory) { + super._init(menuLayout); + this._menuLayout = menuLayout; + this._displayType = displayType; + this._info = info; + this._settings = menuLayout._settings; + this.isContainedInCategory = isContainedInCategory; + this.hasContextMenu = true; + + this.label = new St.Label({ + text: _(info.name), + y_expand: true, + y_align: Clutter.ActorAlign.CENTER + }); + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + if(this._displayType === Constants.DisplayType.BUTTON){ + this.style_class = 'popup-menu-item arc-menu-button'; + this.remove_child(this._ornamentLabel); + this.x_expand = this.y_expand = false; + this.x_align = this.y_align = Clutter.ActorAlign.CENTER; + } + else{ + this.add_child(this.label); + } + + this._changedId = this._info.connect('changed', this._propertiesChanged.bind(this)); + } + + createIcon(){ + let iconSizeEnum; + if(this.isContainedInCategory) + iconSizeEnum = this._settings.get_enum('menu-item-icon-size'); + else + iconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + + const LayoutProps = this._menuLayout.layoutProperties; + let defaultIconSize = this.isContainedInCategory ? LayoutProps.DefaultApplicationIconSize : LayoutProps.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(iconSizeEnum, defaultIconSize); + + if(this._displayType === Constants.DisplayType.BUTTON){ + let defaultIconSize = LayoutProps.DefaultButtonsIconSize; + const IconSizeEnum = this._settings.get_enum('button-item-icon-size'); + iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + } + + return new St.Icon({ + gicon: this._info.gicon ? this._info.gicon : this._info.icon, + icon_size: iconSize, + }); + } + + _onDestroy() { + if (this._changedId) { + this._info.disconnect(this._changedId); + this._changedId = null; + } + if(this._info) + this._info.destroy(); + super._onDestroy(); + } + + popupContextMenu(){ + if(this.tooltip) + this.tooltip.hide(); + if(!this._app && !this._path) + return; + + if(this.contextMenu === undefined){ + this.contextMenu = new ApplicationContextMenu(this.actor, this._app, this._menuLayout); + if(this._path) + this.contextMenu.path = this._path; + if(this._displayType === Constants.DisplayType.GRID) + this.contextMenu.centerBoxPointerPosition(); + } + if(!this.contextMenu.isOpen) + this.contextMenu.rebuildItems(); + this.contextMenu.toggle(); + } + + activate(event) { + this._info.launch(event.get_time()); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _propertiesChanged(info) { + this._info = info; + this.createIcon(); + if(this.label) + this.label.text = info.name; + } +}); + +var SearchBox = GObject.registerClass({ +Signals: { + 'search-changed': { param_types: [GObject.TYPE_STRING] }, + 'entry-key-focus-in': { }, + 'entry-key-press': { param_types: [Clutter.Event.$gtype] }, +},}, +class Arc_Menu_SearchBox extends St.Entry { + _init(menuLayout) { + super._init({ + hint_text: _("Search…"), + track_hover: true, + can_focus: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + name: "ArcSearchEntry" + }); + this.searchResults = menuLayout.searchResults; + this._settings = menuLayout._settings; + this.triggerSearchChangeEvent = true; + + const IconSizeEnum = this._settings.get_enum('misc-item-icon-size'); + let iconSize = Utils.getIconSize(IconSizeEnum, Constants.EXTRA_SMALL_ICON_SIZE); + + this._findIcon = new St.Icon({ + style_class: 'search-entry-icon', + icon_name: 'edit-find-symbolic', + icon_size: iconSize + }); + + this._clearIcon = new St.Icon({ + style_class: 'search-entry-icon', + icon_name: 'edit-clear-symbolic', + icon_size: iconSize + }); + + this.set_primary_icon(this._findIcon); + + this._text = this.get_clutter_text(); + this._textChangedId = this._text.connect('text-changed', this._onTextChanged.bind(this)); + this._keyPressId = this._text.connect('key-press-event', this._onKeyPress.bind(this)); + this._keyFocusInId = this._text.connect('key-focus-in', this._onKeyFocusIn.bind(this)); + this._keyFocusInId = this._text.connect('key-focus-out', this._onKeyFocusOut.bind(this)); + this._searchIconClickedId = this.connect('secondary-icon-clicked', () => this.clear()); + this.connect('destroy', this._onDestroy.bind(this)); + } + + updateStyle(removeBorder){ + let style = this.style; + this.style = style.replace("border-width: 0;", ""); + if(removeBorder) + this.style += 'border-width: 0;'; + } + + get entryBox(){ + return this; + } + + get actor(){ + return this; + } + + getText() { + return this.get_text(); + } + + setText(text) { + this.set_text(text); + } + + clearWithoutSearchChangeEvent(){ + this.triggerSearchChangeEvent = false; + this.set_text(''); + this.triggerSearchChangeEvent = true; + } + + hasKeyFocus() { + return this.contains(global.stage.get_key_focus()); + } + + clear() { + this.set_text(''); + } + + isEmpty() { + return this.get_text() == ''; + } + + _onKeyFocusOut(){ + if(!this.isEmpty()){ + this.add_style_pseudo_class('focus'); + return Clutter.EVENT_STOP; + } + } + + _onTextChanged() { + let searchString = this.get_text(); + if(!this.isEmpty()){ + if(!this.hasKeyFocus()) + this.grab_key_focus(); + if (!this.searchResults.getTopResult()?.has_style_pseudo_class("active")) + this.searchResults.getTopResult()?.add_style_pseudo_class("active") + this.add_style_pseudo_class('focus'); + this.set_secondary_icon(this._clearIcon); + } + else{ + if(!this.hasKeyFocus()) + this.remove_style_pseudo_class('focus'); + this.set_secondary_icon(null); + } + + if(this.triggerSearchChangeEvent) + this.emit('search-changed', searchString); + } + + _onKeyPress(actor, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Return || + symbol == Clutter.KEY_KP_Enter) { + if (!this.isEmpty()) { + if (this.searchResults.getTopResult()) { + this.searchResults.getTopResult().activate(event); + } + } + return Clutter.EVENT_STOP; + } + this.emit('entry-key-press', event); + return Clutter.EVENT_PROPAGATE; + } + + _onKeyFocusIn() { + this.add_style_pseudo_class('focus'); + this.emit('entry-key-focus-in'); + return Clutter.EVENT_PROPAGATE; + } + + _onDestroy() { + if (this._textChangedId) { + this._text.disconnect(this._textChangedId); + this._textChangedId = null; + } + if (this._keyPressId) { + this._text.disconnect(this._keyPressId); + this._keyPressId = null; + } + if (this._keyFocusInId) { + this._text.disconnect(this._keyFocusInId); + this._keyFocusInId = null; + } + if(this._searchIconClickedId){ + this.disconnect(this._searchIconClickedId); + this._searchIconClickedId = null; + } + } +}); + +/** + * This class is responsible for the appearance of the menu button. + */ +var MenuButtonWidget = class Arc_Menu_MenuButtonWidget{ + constructor() { + this.actor = new St.BoxLayout({ + style_class: 'panel-status-menu-box', + pack_start: false + }); + this._arrowIcon = PopupMenu.arrowIcon(St.Side.BOTTOM); + this._arrowIcon.add_style_class_name('arc-menu-arrow'); + + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + track_hover:true, + reactive: true, + }); + this._label = new St.Label({ + text: _("Applications"), + y_expand: true, + style_class: 'arc-menu-text', + y_align: Clutter.ActorAlign.CENTER, + }); + + this.actor.add_child(this._icon); + this.actor.add_child(this._label); + this.actor.add_child(this._arrowIcon); + } + + setActiveStylePseudoClass(enable){ + if(enable){ + this._arrowIcon.add_style_pseudo_class('active'); + this._icon.add_style_pseudo_class('active'); + this._label.add_style_pseudo_class('active'); + } + else{ + this._arrowIcon.remove_style_pseudo_class('active'); + this._icon.remove_style_pseudo_class('active'); + this._label.remove_style_pseudo_class('active'); + } + } + + updateArrowIconSide(side){ + let iconName; + switch (side) { + case St.Side.TOP: + iconName = 'pan-down-symbolic'; + break; + case St.Side.RIGHT: + iconName = 'pan-start-symbolic'; + break; + case St.Side.BOTTOM: + iconName = 'pan-up-symbolic'; + break; + case St.Side.LEFT: + iconName = 'pan-end-symbolic'; + break; + } + this._arrowIcon.icon_name = iconName; + } + + getPanelLabel() { + return this._label; + } + + getPanelIcon() { + return this._icon; + } + + showArrowIcon() { + if (!this.actor.contains(this._arrowIcon)) { + this.actor.add_child(this._arrowIcon); + } + } + + hideArrowIcon() { + if (this.actor.contains(this._arrowIcon)) { + this.actor.remove_child(this._arrowIcon); + } + } + + showPanelIcon() { + if (!this.actor.contains(this._icon)) { + this.actor.add_child(this._icon); + } + } + + hidePanelIcon() { + if (this.actor.contains(this._icon)) { + this.actor.remove_child(this._icon); + } + } + + showPanelText() { + if (!this.actor.contains(this._label)) { + this.actor.add_child(this._label); + } + } + + hidePanelText() { + this._label.style = ''; + if (this.actor.contains(this._label)) { + this.actor.remove_child(this._label); + } + } + + setPanelTextStyle(style){ + this._label.style = style; + } +}; + +var DashMenuButtonWidget = class Arc_Menu_DashMenuButtonWidget{ + constructor(menuButton, settings) { + this._menuButton = menuButton; + this._settings = settings; + this.actor = new St.Button({ + style_class: 'show-apps', + track_hover: true, + can_focus: true, + toggle_mode: false, + reactive: false + }); + this.actor._delegate = this; + this.icon = new imports.ui.iconGrid.BaseIcon(_("ArcMenu"), + { setSizeManually: true, + showLabel: false, + createIcon: this._createIcon.bind(this) }); + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + icon_size: 15, + track_hover:true, + reactive: true + }); + this.icon._delegate = this.actor; + this._labelText = _("ArcMenu"); + this.label = new St.Label({ style_class: 'dash-label' }); + this.label.hide(); + Main.layoutManager.addChrome(this.label); + this.label_actor = this.label; + this.actor.set_child(this.icon); + + this.child = this.actor; + } + showLabel() { + if (!this._labelText) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.actor.get_transformed_position(); + let node = this.label.get_theme_node(); + + let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1; + let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1; + + let labelWidth = this.label.get_width(); + let labelHeight = this.label.get_height(); + + let x, y, xOffset, yOffset; + + let position = this._menuButton._panel._settings.get_enum('dock-position'); + this._isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); + let labelOffset = node.get_length('-x-offset'); + switch (position) { + case St.Side.LEFT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = stageX + this.actor.get_width() + xOffset; + break; + case St.Side.RIGHT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = Math.round(stageX) - labelWidth - xOffset; + break; + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + case St.Side.BOTTOM: + yOffset = labelOffset; + y = stageY - labelHeight - yOffset; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + } + + // keep the label inside the screen border + // Only needed fot the x coordinate. + + // Leave a few pixel gap + let gap = 5; + let monitor = Main.layoutManager.findMonitorForActor(this.actor); + if (x - monitor.x < gap) + x += monitor.x - x + labelOffset; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; + + this.label.remove_all_transitions(); + this.label.set_position(x, y); + this.label.ease({ + opacity: 255, + duration: Dash.DASH_ITEM_LABEL_SHOW_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD + }); + } + hideLabel() { + this.label.ease({ + opacity: 0, + duration: Dash.DASH_ITEM_LABEL_HIDE_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => this.label.hide() + }); + } + _createIcon(size) { + this._icon = new St.Icon({ + icon_name: 'start-here-symbolic', + style_class: 'arc-menu-icon', + track_hover:true, + icon_size: size, + reactive: true + }); + let path = this._settings.get_string('custom-menu-button-icon'); + let iconString = Utils.getMenuButtonIcon(this._settings, path); + this._icon.set_gicon(Gio.icon_new_for_string(iconString)); + + return this._icon; + } + getPanelIcon() { + return this._icon; + } +}; + +var WorldClocksSection = GObject.registerClass(class Arc_Menu_WorldClocksSection extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, null, null); + + this.x_expand = true; + this._clock = new imports.gi.GnomeDesktop.WallClock(); + this._clockNotifyId = 0; + + this._locations = []; + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._grid = new St.Widget({ style_class: 'world-clocks-grid', + x_expand: true, + layout_manager: layout }); + layout.hookup_style(this._grid); + + this.add_child(this._grid); + + this._clocksApp = null; + this._clocksProxy = new ClocksProxy( + Gio.DBus.session, + 'org.gnome.clocks', + '/org/gnome/clocks', + this._onProxyReady.bind(this), + null /* cancellable */, + Gio.DBusProxyFlags.DO_NOT_AUTO_START | Gio.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); + + this._clockSettings = new Gio.Settings({ + schema_id: 'org.gnome.shell.world-clocks', + }); + this.clocksChangedID = this._clockSettings.connect('changed', this._clocksChanged.bind(this)); + this._clocksChanged(); + + this._appSystem = Shell.AppSystem.get_default(); + this.syncID = this._appSystem.connect('installed-changed', + this._sync.bind(this)); + this._sync(); + } + + _onDestroy(){ + if(this.syncID){ + this._appSystem.disconnect(this.syncID); + this.syncID = null; + } + if(this.clocksChangedID){ + this._clockSettings.disconnect(this.clocksChangedID); + this.clocksChangedID = null; + } + if(this.clocksProxyID){ + this._clocksProxy.disconnect(this.clocksProxyID); + this.clocksProxyID = null; + } + if (this._clockNotifyId){ + this._clock.disconnect(this._clockNotifyId); + this._clockNotifyId = null; + } + } + + activate(event) { + super.activate(event); + if (this._clocksApp){ + this._clocksApp.activate(); + } + } + + _sync() { + this._clocksApp = this._appSystem.lookup_app('org.gnome.clocks.desktop'); + this.visible = this._clocksApp != null; + } + + _clocksChanged() { + this._grid.destroy_all_children(); + this._locations = []; + + let world = imports.gi.GWeather.Location.get_world(); + let clocks = this._clockSettings.get_value('locations').deep_unpack(); + for (let i = 0; i < clocks.length; i++) { + let l = world.deserialize(clocks[i]); + if (l && l.get_timezone() != null) + this._locations.push({ location: l }); + } + + this._locations.sort((a, b) => { + return a.location.get_timezone().get_offset() - + b.location.get_timezone().get_offset(); + }); + + let layout = this._grid.layout_manager; + let title = this._locations.length == 0 + ? _("Add world clocks…") + : _("World Clocks"); + let header = new St.Label({ x_align: Clutter.ActorAlign.START, + text: title }); + header.style = "font-weight: bold;"; + layout.attach(header, 0, 0, 2, 1); + this.label_actor = header; + + let localOffset = GLib.DateTime.new_now_local().get_utc_offset(); + + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i].location; + + let name = l.get_city_name() || l.get_name(); + let label = new St.Label({ text: name, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true }); + label.style = "font-weight: normal; font-size: 0.9em;"; + let time = new St.Label(); + time.style = "font-feature-settings: \"tnum\"; font-size: 1.2em;"; + let otherOffset = this._getTimeAtLocation(l).get_utc_offset(); + let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR; + let fmt = Math.trunc(offset) == offset ? '%s%.0f' : '%s%.1f'; + let prefix = offset >= 0 ? '+' : '-'; + let tz = new St.Label({ text: fmt.format(prefix, Math.abs(offset)), + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER }); + tz.style = "font-feature-settings: \"tnum\"; font-size: 0.9em;"; + if (this._grid.text_direction == Clutter.TextDirection.RTL) { + layout.attach(tz, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(label, 2, i + 1, 1, 1); + } else { + layout.attach(label, 0, i + 1, 1, 1); + layout.attach(time, 1, i + 1, 1, 1); + layout.attach(tz, 2, i + 1, 1, 1); + } + + this._locations[i].actor = time; + } + + if (this._grid.get_n_children() > 1) { + if (!this._clockNotifyId) { + this._clockNotifyId = + this._clock.connect('notify::clock', this._updateLabels.bind(this)); + } + this._updateLabels(); + } else { + if (this._clockNotifyId) + this._clock.disconnect(this._clockNotifyId); + this._clockNotifyId = 0; + } + } + + _getTimeAtLocation(location) { + let tz = GLib.TimeZone.new(location.get_timezone().get_tzid()); + return GLib.DateTime.new_now(tz); + } + + _updateLabels() { + for (let i = 0; i < this._locations.length; i++) { + let l = this._locations[i]; + let now = this._getTimeAtLocation(l.location); + l.actor.text = Util.formatTime(now, { timeOnly: true }); + } + } + + _onProxyReady(proxy, error) { + if (error) { + log(`Failed to create GNOME Clocks proxy: ${error}`); + return; + } + + this.clocksProxyID = this._clocksProxy.connect('g-properties-changed', + this._onClocksPropertiesChanged.bind(this)); + this._onClocksPropertiesChanged(); + } + + _onClocksPropertiesChanged() { + if (this._clocksProxy.g_name_owner == null) + return; + + this._clockSettings.set_value('locations', + new GLib.Variant('av', this._clocksProxy.Locations)); + } +}); + +var WeatherSection = GObject.registerClass(class Arc_Menu_WeatherSection extends ArcMenuButtonItem { + _init(menuLayout) { + super._init(menuLayout, null, null); + + this.x_expand = true; + this.x_align = Clutter.ActorAlign.FILL; + this._weatherClient = new imports.misc.weather.WeatherClient(); + + let box = new St.BoxLayout({ + vertical: true, + x_expand: true, + }); + + this.add_child(box); + + let titleBox = new St.BoxLayout({ }); + let label = new St.Label({ + x_align: Clutter.ActorAlign.START, + x_expand: true, + y_align: Clutter.ActorAlign.END, + text: _('Weather'), + }) + label.style = "font-weight: bold; padding-bottom: 5px;"; + titleBox.add_child(label); + box.add_child(titleBox); + + this._titleLocation = new St.Label({ + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.END, + }); + this._titleLocation.style = "font-weight: bold; padding-bottom: 5px;"; + titleBox.add_child(this._titleLocation); + + let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); + this._forecastGrid = new St.Widget({ + style_class: 'weather-grid', + layout_manager: layout, + }); + layout.hookup_style(this._forecastGrid); + box.add_child(this._forecastGrid); + + this.syncID = this._weatherClient.connect('changed', this._sync.bind(this)); + this._sync(); + + } + _onDestroy(){ + if(this.syncID){ + this._weatherClient.disconnect(this.syncID); + this.syncID = null; + } + this._weatherClient = null; + } + vfunc_map() { + this._weatherClient.update(); + super.vfunc_map(); + } + + activate(event) { + super.activate(event); + this._weatherClient.activateApp(); + } + + _getInfos() { + let forecasts = this._weatherClient.info.get_forecast_list(); + + let now = GLib.DateTime.new_now_local(); + let current = GLib.DateTime.new_from_unix_local(0); + let infos = []; + for (let i = 0; i < forecasts.length; i++) { + const [valid, timestamp] = forecasts[i].get_value_update(); + if (!valid || timestamp === 0) + continue; // 0 means 'never updated' + + const datetime = GLib.DateTime.new_from_unix_local(timestamp); + if (now.difference(datetime) > 0) + continue; // Ignore earlier forecasts + + if (datetime.difference(current) < GLib.TIME_SPAN_HOUR) + continue; // Enforce a minimum interval of 1h + + if (infos.push(forecasts[i]) == 5) + break; // Use a maximum of five forecasts + + current = datetime; + } + return infos; + } + + _addForecasts() { + let layout = this._forecastGrid.layout_manager; + + let infos = this._getInfos(); + if (this._forecastGrid.text_direction == Clutter.TextDirection.RTL) + infos.reverse(); + + let col = 0; + infos.forEach(fc => { + const [valid_, timestamp] = fc.get_value_update(); + let timeStr = Util.formatTime(new Date(timestamp * 1000), { + timeOnly: true + }); + const [, tempValue] = fc.get_value_temp(imports.gi.GWeather.TemperatureUnit.DEFAULT); + const tempPrefix = tempValue >= 0 ? ' ' : ''; + + let time = new St.Label({ + text: timeStr, + x_align: Clutter.ActorAlign.CENTER, + }); + time.style = "font-size: 0.8em;" + let icon = new St.Icon({ + style_class: 'weather-forecast-icon', + icon_name: fc.get_symbolic_icon_name(), + x_align: Clutter.ActorAlign.CENTER, + x_expand: true, + }); + let temp = new St.Label({ + text: '%s%.0f°'.format(tempPrefix, tempValue), + x_align: Clutter.ActorAlign.CENTER, + }); + + temp.clutter_text.ellipsize = imports.gi.Pango.EllipsizeMode.NONE; + time.clutter_text.ellipsize = imports.gi.Pango.EllipsizeMode.NONE; + + layout.attach(time, col, 0, 1, 1); + layout.attach(icon, col, 1, 1, 1); + layout.attach(temp, col, 2, 1, 1); + col++; + }); + } + + _setStatusLabel(text) { + let layout = this._forecastGrid.layout_manager; + let label = new St.Label({ text }); + layout.attach(label, 0, 0, 1, 1); + } + + _updateForecasts() { + this._forecastGrid.destroy_all_children(); + + if (!this._weatherClient.hasLocation) { + this._setStatusLabel(_("Select a location…")); + return; + } + + let info = this._weatherClient.info; + let loc = info.get_location(); + if (loc.get_level() !== imports.gi.GWeather.LocationLevel.CITY && loc.has_coords()) { + let world = imports.gi.GWeather.Location.get_world(); + loc = world.find_nearest_city(...loc.get_coords()); + } + this._titleLocation.text = loc.get_name(); + + if (this._weatherClient.loading) { + this._setStatusLabel(_("Loading…")); + return; + } + + if (info.is_valid()) { + this._addForecasts(); + return; + } + + if (info.network_error()) + this._setStatusLabel(_("Go online for weather information")); + else + this._setStatusLabel(_("Weather information is currently unavailable")); + } + + _sync() { + this.visible = this._weatherClient.available; + + if (!this.visible) + return; + + this._titleLocation.visible = this._weatherClient.hasLocation; + + this._updateForecasts(); + } +}); + +function _isToday(date) { + let now = new Date(); + return now.getYear() == date.getYear() && + now.getMonth() == date.getMonth() && + now.getDate() == date.getDate(); +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js new file mode 100644 index 0000000..a0c1d16 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/arcmenu.js @@ -0,0 +1,456 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.buttonPressEventID = global.stage.connect("button-press-event", () => { + if(this.arcMenu.isOpen && this.backButton.visible){ + let event = Clutter.get_current_event(); + if(event.get_button() === 8){ + this.backButton.activate(event); + } + } + }); + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'left-panel' + }); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true, + reactive:true + }); + this.leftBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ vertical: true }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBox.add_child(separator); + + this.backButton = new MW.BackMenuItem(this); + this.navigateBox.add_child(this.backButton.actor); + + this.viewProgramsButton = new MW.ViewAllPrograms(this); + this.navigateBox.add_child(this.viewProgramsButton.actor); + this.leftBox.add_child(this.navigateBox); + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 5px 10px 0px 10px;"; + this.leftBox.add_child(this.searchBox.actor); + } + + this.rightBox = new St.BoxLayout({ + vertical: true, + style_class: 'right-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.placesShortcuts = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this.bookmarksShorctus = false; + this.softwareShortcuts = false; + + if(!this._settings.get_boolean('disable-user-avatar')){ + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.rightBox.add_child(this.user.actor); + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.rightBox.add_child(separator); + } + + this.shortcutsBox = new St.BoxLayout({ + vertical: true + }); + + this.shortcutsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.rightBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //draw bottom right horizontal separator + logic to determine if should show + let shouldDraw = false; + if(this._settings.get_value('directory-shortcuts-list').deep_unpack().length > 0){ + this.placesShortcuts = true; + } + if(this._settings.get_value('application-shortcuts-list').deep_unpack().length > 0){ + this.softwareShortcuts = true; + } + + //check to see if should draw separator + if(this.placesShortcuts && (this._settings.get_boolean('show-external-devices') || this.softwareShortcuts || this._settings.get_boolean('show-bookmarks')) ) + shouldDraw = true; + if(shouldDraw){ + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //External Devices and Bookmarks Shortcuts + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this.shortcutsBox.add_child(this.externalDevicesBox); + + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + //create new section for Power, Lock, Logout, Suspend Buttons + this.actionsBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.END, + style: "spacing: 6px; padding: 0px;" + }); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + this.rightBox.add_child(this.actionsBox); + + this.extraCategoriesLinksBox = new St.BoxLayout({ + vertical: true + }); + this.extraCategoriesLinksBox.hide(); + this.extraCategoriesSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + + let extraCategoriesLinksLocation = this._settings.get_enum('arcmenu-extra-categories-links-location'); + if(extraCategoriesLinksLocation === Constants.MenuItemLocation.TOP) + this.leftBox.insert_child_below(this.extraCategoriesLinksBox, this.applicationsScrollBox); + else + this.navigateBox.insert_child_above(this.extraCategoriesLinksBox, this.navigateBox.get_child_at_index(0)); + this.extraCategoriesLinksBox.add_child(this.extraCategoriesSeparator); + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + _createExtraCategoriesLinks(){ + this.showExtraCategoriesLinksBox = false; + let extraCategories = this._settings.get_value("arcmenu-extra-categories-links").deep_unpack(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + + //Don't create extra categories quick links if + //the default menu view is the categories list + if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST) + return; + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + //If ArcMenu layout set to "Pinned Apps" default view and Extra Categories "Pinned Apps" is enabled, + //do not display "Pinned Apps" as an extra category -- Same for "Frequent Apps" + if(categoryEnum == Constants.CategoryType.PINNED_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.FREQUENT_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.ALL_PROGRAMS && shouldShow && defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS) + shouldShow = false; + if(shouldShow){ + let extraCategoryItem = this.categoryDirectories.get(categoryEnum); + if(!extraCategoryItem) + continue; + + this.showExtraCategoriesLinksBox = true; + if(extraCategoryItem.get_parent()) + extraCategoryItem.get_parent().remove_child(extraCategoryItem); + + this.extraCategoriesLinksBox.insert_child_below(extraCategoryItem, this.extraCategoriesSeparator); + } + } + if(this.showExtraCategoriesLinksBox) + this.extraCategoriesLinksBox.show(); + else + this.extraCategoriesLinksBox.hide(); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + this.hasPinnedApps = true; + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + //If ArcMenu layout set to "Pinned Apps" default view and Extra Categories "Pinned Apps" is enabled, + //do not display "Pinned Apps" as an extra category -- Same for "Frequent Apps" + if(categoryEnum == Constants.CategoryType.PINNED_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + shouldShow = false; + if(categoryEnum == Constants.CategoryType.FREQUENT_APPS && shouldShow && defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + + this._createExtraCategoriesLinks(); + } + + displayPinnedApps(){ + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS){ + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + } + else if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else if(defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else if(defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + super.displayPinnedApps(); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayAllApps(showBackButton = true){ + super.displayAllApps(); + this.viewProgramsButton.actor.hide(); + + if(showBackButton){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + } + else{ + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.backButton.actor.hide(); + } + } + + displayCategories(){ + let defaultMenuView = this._settings.get_enum('default-menu-view'); + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS || defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS){ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.hide(); + this.backButton.actor.show(); + } + else{ + this.extraCategoriesLinksBox.hide(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + } + + super.displayCategories(); + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let defaultMenuView = this._settings.get_enum('default-menu-view'); + + if(defaultMenuView === Constants.DefaultMenuView.PINNED_APPS) + this.displayPinnedApps(); + else if(defaultMenuView === Constants.DefaultMenuView.CATEGORIES_LIST) + this.displayCategories(); + else if(defaultMenuView === Constants.DefaultMenuView.FREQUENT_APPS) + this.displayFrequentApps(); + else if(defaultMenuView === Constants.DefaultMenuView.ALL_PROGRAMS) + this.displayAllApps(false); + } + + displayCategoryAppList(appList, category){ + super.displayCategoryAppList(appList, category); + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + } + + displayFrequentApps(){ + this._clearActorsFromBox(); + if (this.showExtraCategoriesLinksBox) this.extraCategoriesLinksBox.show(); + this.viewProgramsButton.actor.show(); + this.backButton.actor.hide(); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + let appList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let isContainedInCategory = false; + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST, null, isContainedInCategory); + appList.push(item); + } + } + let activeMenuItemSet = false; + for (let i = 0; i < appList.length; i++) { + let item = appList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_child(item.actor); + if(!activeMenuItemSet){ + activeMenuItemSet = true; + this.activeMenuItem = item; + } + } + } + + displayRecentFiles(){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + super.displayRecentFiles(); + } + + _clearActorsFromBox(box){ + //keep track of the previous category for the back button. + this.previousCategoryType = this.activeCategoryType; + super._clearActorsFromBox(box); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(!searchBox.isEmpty()){ + this.extraCategoriesLinksBox.hide(); + this.backButton.actor.show(); + this.viewProgramsButton.actor.hide(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } + + destroy(){ + if(this.buttonPressEventID){ + global.stage.disconnect(this.buttonPressEventID); + this.buttonPressEventID = null; + } + super.destroy() + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js new file mode 100644 index 0000000..dce09de --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/az.js @@ -0,0 +1,285 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 4, + RowSpacing: 4, + VerticalMainBox: true, + DefaultMenuWidth: 460, + DefaultIconGridStyle: 'LargeRectIconGrid', + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBoxStyle = "margin: 0px 0px 10px 0px; spacing: 0px; background-color: rgba(186, 196,201, 0.1); padding: 11px 5px;"+ + "border-color:rgba(186, 196,201, 0.2); border-bottom-width: 1px;"; + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: this.topBoxStyle + }); + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.style = "margin: 5px 15px 5px 15px;"; + this.topBox.add_child(this.searchBox.actor); + this.subMainBox.add_child(this.topBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + style: "padding-bottom: 10px;" + }); + this.applicationsScrollBox = this._createScrollBox({ + clip_to_allocation: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px;background-color:rgba(186, 196,201, 0.1) ; padding: 12px 5px;"+ + "border-color:rgba(186, 196,201, 0.2) ; border-top-width: 1px;"; + + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "margin: 0px 15px; spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.user.x_expand = true; + this.user.x_align = Clutter.ActorAlign.FILL; + this.actionsBox.add_child(this.user.actor); + + + let filesButton = new MW.ShortcutMenuItem(this, _("Files"), "system-file-manager", "org.gnome.Nautilus.desktop", Constants.DisplayType.BUTTON); + if(filesButton.shouldShow) + this.actionsBox.add_child(filesButton.actor); + + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + + this.leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(this.leaveButton.actor); + + this.backButton = this._createNavigationButtons(_("All Apps"), MW.BackButton) + this.allAppsButton = this._createNavigationButtons(_("Pinned"), MW.AllAppsButton) + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.IconGridSize = 42; + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + } + + setDefaultMenuView(){ + this.setGridLayout(Constants.DisplayType.GRID, 4, 4); + this.layoutProperties.IconGridSize = 42; + super.setDefaultMenuView(); + this.activeCategory = _("Pinned"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + + displayAllApps(){ + this.activeCategory = _("All Apps"); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + + this.setGridLayout(Constants.DisplayType.LIST, 1, 3); + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 4, 4, false); + } + + updateStyle(){ + super.updateStyle(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + const RoundBottomBorder = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + const RoundTopBorder = "border-radius: " + borderRadius + "px " + borderRadius + "px 0px 0px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + RoundBottomBorder; + this.topBox.style = this.topBoxStyle + RoundTopBorder; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + } + + setGridLayout(displayType, columns, spacing, setStyle = true){ + if(setStyle){ + this.applicationsGrid.x_align = displayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER; + displayType === Constants.DisplayType.LIST ? this.applicationsBox.add_style_class_name('margin-box') : this.applicationsBox.remove_style_class_name('margin-box'); + } + + this.applicationsGrid.layout_manager.column_spacing = spacing; + this.applicationsGrid.layout_manager.row_spacing = spacing; + this.layoutProperties.DisplayType = displayType; + } + + loadCategories() { + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this.layoutProperties.IconGridSize = 26; + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + displayPinnedApps() { + this._clearActorsFromBox(this.applicationsBox); + this.activeCategory = _("Pinned"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + this._hideNavigationButtons(); + + if(category === Constants.CategoryType.PINNED_APPS){ + this.subMainBox.insert_child_at_index(this.allAppsButton, 1); + } + else if(category === Constants.CategoryType.ALL_PROGRAMS){ + this.subMainBox.insert_child_at_index(this.backButton, 1); + } + } + + _hideNavigationButtons(){ + if(this.subMainBox.contains(this.backButton)) + this.subMainBox.remove_child(this.backButton); + if(this.subMainBox.contains(this.allAppsButton)) + this.subMainBox.remove_child(this.allAppsButton); + } + + _createNavigationButtons(buttonTitle, ButtonClass){ + let navButton = this.createLabelRow(buttonTitle); + navButton.remove_child(navButton._ornamentLabel); + navButton.label.y_align = Clutter.ActorAlign.CENTER; + navButton.style = 'padding: 0px 15px 10px 15px;' + navButton.add_child(new ButtonClass(this)); + return navButton; + } + + _onSearchBoxChanged(searchBox, searchString){ + this.applicationsBox.remove_style_class_name('margin-box'); + if(!searchBox.isEmpty()) + this._hideNavigationButtons(); + super._onSearchBoxChanged(searchBox, searchString); + } + + destroy(){ + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + this.leaveButton.destroy(); + this.backButton.destroy(); + this.allAppsButton.destroy(); + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js new file mode 100644 index 0000000..af9d2c4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js @@ -0,0 +1,1128 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, GMenu, Gtk, Shell, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const appSys = Shell.AppSystem.get_default(); +const ArcSearch = Me.imports.search; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MenuLayouts = Me.imports.menulayouts; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const { RecentFilesManager } = Me.imports.recentFilesManager; +const Utils = Me.imports.utils; + +//This class handles the core functionality of all the menu layouts. +//Each menu layout extends this class. +var BaseLayout = class { + constructor(menuButton, layoutProperties){ + this.menuButton = menuButton; + this._settings = menuButton._settings; + this.mainBox = menuButton.mainBox; + this.contextMenuManager = menuButton.contextMenuManager; + this.subMenuManager = menuButton.subMenuManager; + this.arcMenu = menuButton.arcMenu; + this.section = menuButton.section; + this.layout = this._settings.get_enum('menu-layout'); + this.layoutProperties = layoutProperties; + this._focusChild = null; + this.shouldLoadPinnedApps = true; + this.hasPinnedApps = false; + + if(this.layoutProperties.Search){ + this.searchResults = new ArcSearch.SearchResults(this); + this.searchBox = new MW.SearchBox(this); + this._searchBoxChangedId = this.searchBox.connect('search-changed', this._onSearchBoxChanged.bind(this)); + this._searchBoxKeyPressId = this.searchBox.connect('entry-key-press', this._onSearchBoxKeyPress.bind(this)); + } + + this._mainBoxKeyPressId = this.mainBox.connect('key-press-event', this._onMainBoxKeyPress.bind(this)); + + this._tree = new GMenu.Tree({ menu_basename: 'applications.menu' }); + this._treeChangedId = this._tree.connect('changed', () => this.reloadApplications()); + + this._gnomeFavoritesReloadID = AppFavorites.getAppFavorites().connect('changed', () => { + if(this.categoryDirectories){ + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FAVORITES); + if(categoryMenuItem) + this._loadGnomeFavorites(categoryMenuItem); + } + }); + + this.mainBox.vertical = this.layoutProperties.VerticalMainBox; + + this.createLayout(); + this.updateStyle(); + } + + createLayout(){ + this.disableFadeEffect = this._settings.get_boolean('disable-scrollview-fade-effect'); + this.activeCategoryType = -1; + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.applicationsGrid = new St.Widget({ + x_expand: true, + x_align: this.layoutProperties.DisplayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.applicationsGrid); + } + + setDefaultMenuView(){ + if(this.layoutProperties.Search){ + this.searchBox.clearWithoutSearchChangeEvent(); + this.searchResults.setTerms([]); + } + + this._clearActorsFromBox(); + this.resetScrollBarPosition(); + } + + getColumnsFromActor(actor){ + let gridIconWidth = this.getActorWidthFromStyleClass(actor.name); + return this.getBestFitColumns(gridIconWidth); + } + + getColumnsFromGridIconSizeSetting(){ + let gridIconWidth; + let iconSizeEnum = this._settings.get_enum("menu-item-grid-icon-size"); + + if(iconSizeEnum === Constants.GridIconSize.DEFAULT) + gridIconWidth = this.getActorWidthFromStyleClass(this.layoutProperties.DefaultIconGridStyle); + else{ + Constants.GridIconInfo.forEach((info) => { + if(iconSizeEnum === info.ENUM){ + gridIconWidth = info.SIZE; + return; + } + }); + } + return this.getBestFitColumns(gridIconWidth); + } + + getBestFitColumns(gridIconWidth){ + let width = this.layoutProperties.MenuWidth; + let spacing = this.layoutProperties.ColumnSpacing; + let columns = Math.floor(width / (gridIconWidth + spacing)); + return columns; + } + + getActorWidthFromStyleClass(name){ + let size; + + Constants.GridIconInfo.forEach((info) => { + if(name === info.NAME){ + size = info.SIZE; + return; + } + }); + return size; + } + + resetScrollBarPosition(){ + let appsScrollBoxAdj; + + if(this.applicationsScrollBox){ + appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.categoriesScrollBox){ + appsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.shortcutsScrollBox){ + appsScrollBoxAdj = this.shortcutsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + if(this.actionsScrollBox){ + appsScrollBoxAdj = this.actionsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + } + + reloadApplications(){ + //Don't reload applications if the menu is open. + //Instead, reload on menu-closed event. + //Prevents the menu from jumping to its default view + //when reloadApplications() is called. + if(this.arcMenu.isOpen){ + if(!this._menuClosedID){ + this._menuClosedID = this.arcMenu.connect('menu-closed', () => { + this.reloadApplications(); + if(this._menuClosedID){ + this.arcMenu.disconnect(this._menuClosedID); + this._menuClosedID = null; + } + }); + } + return; + } + + if(this.applicationsMap){ + this.applicationsMap.forEach((value,key,map)=>{ + value.destroy(); + }); + this.applicationsMap = null; + } + + if(this.categoryDirectories){ + this.categoryDirectories.forEach((value,key,map)=>{ + value.destroy(); + }); + this.categoryDirectories = null; + } + + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + if(this.layoutProperties.Search){ + this.searchBox.updateStyle(this._settings.get_boolean('disable-searchbox-border')) + customStyle ? this.searchResults.setStyle('arc-menu-status-text') : this.searchResults.setStyle(''); + if(customStyle){ + this.searchBox.remove_style_class_name('default-search-entry'); + this.searchBox.add_style_class_name('arc-search-entry'); + } + else{ + this.searchBox.remove_style_class_name('arc-search-entry'); + this.searchBox.add_style_class_name('default-search-entry'); + } + } + } + + loadCategories(displayType = Constants.DisplayType.LIST){ + this.applicationsMap = new Map(); + this._tree.load_sync(); + let root = this._tree.get_root_directory(); + let iter = root.iter(); + let nextType; + while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) { + if (nextType == GMenu.TreeItemType.DIRECTORY) { + let dir = iter.get_directory(); + if (!dir.get_is_nodisplay()) { + let categoryId = dir.get_menu_id(); + let categoryMenuItem; + if(displayType === Constants.DisplayType.SIMPLE_CATEGORY) + categoryMenuItem = new MW.SimpleMenuItem(this, dir); + else if(displayType === Constants.DisplayType.SUBMENU_CATEGORY) + categoryMenuItem = new MW.CategorySubMenuItem(this, dir); + else + categoryMenuItem = new MW.CategoryMenuItem(this, dir, displayType); + this.categoryDirectories.set(categoryId, categoryMenuItem); + let foundRecentlyInstallApp = this._loadCategory(categoryId, dir); + categoryMenuItem.setRecentlyInstalledIndicator(foundRecentlyInstallApp); + //Sort the App List Alphabetically + categoryMenuItem.appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + } + } + } + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.ALL_PROGRAMS); + if(categoryMenuItem){ + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + //Show Recently Installed Indicator on All Programs category + if(value.isRecentlyInstalled && !categoryMenuItem.isRecentlyInstalled) + categoryMenuItem.setRecentlyInstalledIndicator(true); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + categoryMenuItem.appList = appList; + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FAVORITES); + if(categoryMenuItem){ + this._loadGnomeFavorites(categoryMenuItem); + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FREQUENT_APPS); + if(categoryMenuItem){ + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()) + categoryMenuItem.appList.push(mostUsed[i]); + } + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this.hasPinnedApps = true; + categoryMenuItem.appList = categoryMenuItem.appList.concat(this.pinnedAppsArray); + } + categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + if(categoryMenuItem){ + this._loadRecentFiles(categoryMenuItem); + } + + } + + _loadCategory(categoryId, dir, submenuItem) { + let iter = dir.iter(); + let nextType; + let foundRecentlyInstallApp = false; + let isLayoutSimple2 = this.layout === Constants.MenuLayout.SIMPLE_2; + while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) { + if (nextType == GMenu.TreeItemType.ENTRY) { + let entry = iter.get_entry(); + let id; + try { + id = entry.get_desktop_file_id(); + } catch (e) { + continue; + } + let app = appSys.lookup_app(id); + if (!app) + app = new Shell.App({ app_info: entry.get_app_info() }); + if (app.get_app_info().should_show()){ + let item = this.applicationsMap.get(app); + if (!item) { + let isContainedInCategory = true; + item = new MW.ApplicationMenuItem(this, app, this.layoutProperties.DisplayType, null, isContainedInCategory); + } + let disabled = this._settings.get_boolean("disable-recently-installed-apps") + if(!disabled && item.isRecentlyInstalled) + foundRecentlyInstallApp = true; + if(!submenuItem){ + let categoryMenuItem = this.categoryDirectories.get(categoryId); + categoryMenuItem.appList.push(app); + this.applicationsMap.set(app, item); + } + else{ + submenuItem.applicationsMap.set(app, item); + } + } + } + else if (nextType == GMenu.TreeItemType.DIRECTORY) { + let subdir = iter.get_directory(); + if (!subdir.get_is_nodisplay()){ + if(this._settings.get_boolean('enable-sub-menus') && this.layoutProperties.DisplayType === Constants.DisplayType.LIST && !isLayoutSimple2){ + let submenuItem = this.applicationsMap.get(subdir); + if (!submenuItem) { + submenuItem = new MW.CategorySubMenuItem(this, subdir); + submenuItem._setParent(this.arcMenu); + let categoryMenuItem = this.categoryDirectories.get(categoryId); + categoryMenuItem.appList.push(subdir); + this.applicationsMap.set(subdir, submenuItem); + } + let recentlyInstallApp = this._loadCategory(categoryId, subdir, submenuItem); + if(recentlyInstallApp) + foundRecentlyInstallApp = true; + submenuItem.setRecentlyInstalledIndicator(foundRecentlyInstallApp); + } + else{ + let recentlyInstallApp = this._loadCategory(categoryId, subdir); + if(recentlyInstallApp) + foundRecentlyInstallApp = true; + } + } + } + } + return foundRecentlyInstallApp; + } + + setRecentlyInstalledIndicator(){ + let disabled = this._settings.get_boolean("disable-recently-installed-apps") + if(!disabled){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.setRecentlyInstalledIndicator(false); + for(let i = 0; i < categoryMenuItem.appList.length; i++){ + let item = this.applicationsMap.get(categoryMenuItem.appList[i]); + if(!item) + continue; + if(item instanceof MW.CategorySubMenuItem){ + item.setRecentlyInstalledIndicator(false); + for(let menuItem of item.applicationsMap.values()){ + if(menuItem.isRecentlyInstalled){ + item.setRecentlyInstalledIndicator(true); + break; + } + } + } + if(item.isRecentlyInstalled){ + categoryMenuItem.setRecentlyInstalledIndicator(true); + break; + } + } + } + } + } + + displayCategories(categoriesBox){ + if(!categoriesBox){ + categoriesBox = this.applicationsBox; + } + this._clearActorsFromBox(categoriesBox); + + this._futureActiveItem = false; + + for(let categoryMenuItem of this.categoryDirectories.values()){ + if(categoryMenuItem.get_parent()) + continue; + categoriesBox.add_child(categoryMenuItem.actor); + if(!this._futureActiveItem){ + this._futureActiveItem = categoryMenuItem; + } + } + + this.activeMenuItem = this._futureActiveItem; + } + + _loadGnomeFavorites(categoryMenuItem){ + let appList = AppFavorites.getAppFavorites().getFavorites(); + + //Show Recently Installed Indicator on GNOME favorites category + for(let i = 0; i < appList.length; i++){ + let item = this.applicationsMap.get(appList[i]); + if(item && item.isRecentlyInstalled && !categoryMenuItem.isRecentlyInstalled) + categoryMenuItem.setRecentlyInstalledIndicator(true); + } + + categoryMenuItem.appList = appList; + if(this.activeCategoryType === Constants.CategoryType.FAVORITES) + categoryMenuItem.displayAppList(); + } + + _loadRecentFiles(){ + if(!this.recentFilesManager) + this.recentFilesManager = new RecentFilesManager(); + } + + displayRecentFiles(box = this.applicationsBox, callback){ + const homeRegExp = new RegExp('^(' + GLib.get_home_dir() + ')'); + this._clearActorsFromBox(box); + this._futureActiveItem = false; + + this.recentFilesManager.filterRecentFiles(recentFile => { + let file = Gio.File.new_for_uri(recentFile.get_uri()); + let filePath = file.get_path(); + let name = recentFile.get_display_name(); + let icon = Gio.content_type_get_symbolic_icon(recentFile.get_mime_type()).to_string(); + let isContainedInCategory = true; + + let placeMenuItem = this.createMenuItem([name, icon, filePath], Constants.DisplayType.LIST, isContainedInCategory); + placeMenuItem._path = file.get_parent()?.get_path() // can be null + placeMenuItem.style = "padding-right: 15px;"; + placeMenuItem.description = recentFile.get_uri_display().replace(homeRegExp, '~'); + placeMenuItem.fileUri = recentFile.get_uri(); + + placeMenuItem._removeBtn = new MW.ArcMenuButtonItem(this, null, 'edit-delete-symbolic'); + placeMenuItem._removeBtn.toggleMenuOnClick = false; + placeMenuItem._removeBtn.x_align = Clutter.ActorAlign.END; + placeMenuItem._removeBtn.x_expand = true; + placeMenuItem._removeBtn.add_style_class_name("arcmenu-small-button"); + placeMenuItem._removeBtn.setIconSize(14); + placeMenuItem._removeBtn.connect('activate', () => { + try { + let recentManager = this.recentFilesManager.getRecentManager(); + recentManager.remove_item(placeMenuItem.fileUri); + } catch(err) { + log(err); + } + + placeMenuItem.cancelPopupTimeout(); + placeMenuItem.contextMenu?.close(); + box.remove_child(placeMenuItem); + placeMenuItem.destroy(); + }); + + placeMenuItem.add_child(placeMenuItem._removeBtn); + box.add_child(placeMenuItem); + + if(!this._futureActiveItem){ + this._futureActiveItem = placeMenuItem; + this.activeMenuItem = this._futureActiveItem; + } + + if(callback) + callback(); + }); + } + + _displayPlaces() { + var SHORTCUT_TRANSLATIONS = [_("Home"), _("Documents"), _("Downloads"), _("Music"), _("Pictures"), _("Videos"), _("Computer"), _("Network")]; + let directoryShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + for (let i = 0; i < directoryShortcuts.length; i++) { + let directory = directoryShortcuts[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + if(placeMenuItem) + this.shortcutsBox.add_child(placeMenuItem.actor); + } + } + + loadExtraPinnedApps(pinnedAppsArray, separatorIndex){ + let pinnedApps = pinnedAppsArray; + //if the extraPinnedApps array is empty, create a default list of apps. + if(!pinnedApps.length || !Array.isArray(pinnedApps)){ + pinnedApps = this._createExtraPinnedAppsList(); + } + + for(let i = 0;i < pinnedApps.length; i += 3){ + if(i === separatorIndex * 3 && i !== 0) + this._addSeparator(); + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem([pinnedApps[i], pinnedApps[i + 1], pinnedApps[i + 2]], Constants.DisplayType.BUTTON, isContainedInCategory); + placeMenuItem.actor.x_expand = false; + placeMenuItem.actor.y_expand = false; + placeMenuItem.actor.y_align = Clutter.ActorAlign.CENTER; + placeMenuItem.actor.x_align = Clutter.ActorAlign.CENTER; + this.actionsBox.add_child(placeMenuItem.actor); + } + } + + createMenuItem(menuItemArray, displayType, isContainedInCategory){ + let placeInfo, placeMenuItem; + let command = menuItemArray[2]; + let app = Shell.AppSystem.get_default().lookup_app(command); + + if(command === "ArcMenu_Home"){ + let homePath = GLib.get_home_dir(); + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(homePath), _("Home")); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Computer"){ + placeInfo = new PlaceDisplay.RootInfo(); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Network"){ + placeInfo = new PlaceDisplay.PlaceInfo('network', Gio.File.new_for_uri('network:///'), _('Network'),'network-workgroup-symbolic'); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Software"){ + let software = Utils.findSoftwareManager(); + if(software) + placeMenuItem = new MW.ShortcutMenuItem(this, _("Software"), 'system-software-install-symbolic', software, displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Trash"){ + placeMenuItem = new MW.ShortcutMenuItem(this, _("Trash"), '', "ArcMenu_Trash", displayType, isContainedInCategory); + } + else if(command === Constants.ArcMenuSettingsCommand || command === "ArcMenu_Suspend" || command === "ArcMenu_LogOut" || command === "ArcMenu_PowerOff" + || command === "ArcMenu_Lock" || command === "ArcMenu_Restart" || command === "ArcMenu_HybridSleep" || command === "ArcMenu_Hibernate" || app){ + + placeMenuItem = new MW.ShortcutMenuItem(this, menuItemArray[0], menuItemArray[1], menuItemArray[2], displayType, isContainedInCategory); + } + else if(command === "ArcMenu_Recent"){ + let uri = "recent:///"; + placeInfo = new MW.PlaceInfo(Gio.File.new_for_uri(uri), _(menuItemArray[0])); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + else if(command.startsWith("ArcMenu_")){ + let path = command.replace("ArcMenu_",''); + + if(path === "Documents") + path = imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS; + else if(path === "Downloads") + path = imports.gi.GLib.UserDirectory.DIRECTORY_DOWNLOAD; + else if(path === "Music") + path = imports.gi.GLib.UserDirectory.DIRECTORY_MUSIC; + else if(path === "Pictures") + path = imports.gi.GLib.UserDirectory.DIRECTORY_PICTURES; + else if(path === "Videos") + path = imports.gi.GLib.UserDirectory.DIRECTORY_VIDEOS; + + path = GLib.get_user_special_dir(path); + if (path !== null){ + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _(menuItemArray[0])); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + } + else{ + let path = command; + placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _(menuItemArray[0]), (menuItemArray[1] !== "ArcMenu_Folder") ? Gio.icon_new_for_string(menuItemArray[1]) : null); + placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, displayType, isContainedInCategory); + } + return placeMenuItem; + } + + loadPinnedApps(){ + let pinnedApps = this._settings.get_strv('pinned-app-list'); + + this.pinnedAppsArray = null; + this.pinnedAppsArray = []; + + let categoryMenuItem = this.categoryDirectories ? this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS) : null; + let isContainedInCategory = categoryMenuItem ? true : false; + + for(let i = 0; i < pinnedApps.length; i += 3){ + if(i === 0 && pinnedApps[0] === "ArcMenu_WebBrowser") + this._updatePinnedAppsWebBrowser(pinnedApps); + + let pinnedAppsMenuItem = new MW.PinnedAppsMenuItem(this, pinnedApps[i], pinnedApps[i + 1], pinnedApps[i + 2], this.layoutProperties.DisplayType, isContainedInCategory); + pinnedAppsMenuItem.connect('saveSettings', ()=> { + let array = []; + for(let i = 0; i < this.pinnedAppsArray.length; i++){ + array.push(this.pinnedAppsArray[i]._name); + array.push(this.pinnedAppsArray[i]._iconPath); + array.push(this.pinnedAppsArray[i]._command); + } + this._settings.set_strv('pinned-app-list',array); + }); + this.pinnedAppsArray.push(pinnedAppsMenuItem); + } + + if(categoryMenuItem){ + categoryMenuItem.appList = null; + categoryMenuItem.appList = []; + categoryMenuItem.appList = categoryMenuItem.appList.concat(this.pinnedAppsArray); + } + } + + _updatePinnedAppsWebBrowser(pinnedApps){ + //Find the Default Web Browser, if found add to pinned apps list, if not found delete the placeholder. + //Will only run if placeholder is found. Placeholder only found with default settings set. + if(pinnedApps[0] === "ArcMenu_WebBrowser"){ + let browserName = ''; + try{ + //user may not have xdg-utils package installed which will throw error + let [res, stdout, stderr, status] = GLib.spawn_command_line_sync("xdg-settings get default-web-browser"); + let webBrowser = String.fromCharCode(...stdout); + browserName = webBrowser.split(".desktop")[0]; + browserName += ".desktop"; + } + catch(error){ + global.log("ArcMenu Error - Failed to find default web browser. Removing placeholder pinned app.") + } + + this._app = appSys.lookup_app(browserName); + if(this._app){ + pinnedApps[0] = this._app.get_name(); + pinnedApps[1] = ''; + pinnedApps[2] = this._app.get_id(); + } + else{ + pinnedApps.splice(0,3); + } + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + } + } + + displayPinnedApps(){ + this._clearActorsFromBox(); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + placesAddSeparator(id){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this._sections[id].add_child(separator); + } + + _redisplayPlaces(id) { + if(this._sections[id].get_n_children() > 0){ + this.bookmarksShorctus = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this._sections[id].destroy_all_children(); + } + this._createPlaces(id); + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + if(this.placesManager.get('network').length > 0) + this.networkDevicesShorctus = true; + if(this.placesManager.get('devices').length > 0) + this.externalDevicesShorctus=true; + if(this.placesManager.get('bookmarks').length > 0) + this.bookmarksShorctus = true; + + if(this._settings.get_boolean('show-bookmarks')){ + if(id === 'bookmarks' && places.length > 0){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + //create a separator if bookmark and software shortcut are both shown + if(this.bookmarksShorctus && this.softwareShortcuts){ + this.placesAddSeparator(id); + } + } + } + if(this._settings.get_boolean('show-external-devices')){ + if(id === 'devices'){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + if((this.externalDevicesShorctus && !this.networkDevicesShorctus) && (this.bookmarksShorctus || this.softwareShortcuts)) + this.placesAddSeparator(id); + } + if(id === 'network'){ + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i]); + this._sections[id].add_child(item); + } + if(this.networkDevicesShorctus && (this.bookmarksShorctus || this.softwareShortcuts)) + this.placesAddSeparator(id); + } + } + } + + setActiveCategory(category, setActive = true){ + this._futureActiveItem = category; + this.activeMenuItem = category; + } + + setFrequentAppsList(categoryMenuItem){ + categoryMenuItem.appList = []; + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()) + categoryMenuItem.appList.push(mostUsed[i]); + } + } + + _clearActorsFromBox(box){ + this.recentFilesManager?.cancelCurrentQueries(); + if(!box){ + box = this.applicationsBox; + this.activeCategoryType = -1; + } + let parent = box.get_parent(); + if(parent instanceof St.ScrollView){ + let scrollBoxAdj = parent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = box.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + box.remove_child(actor); + } + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _displayAppList(apps, category, grid){ + this.activeCategoryType = category; + grid.remove_all_children(); + let count = 0; + let top = -1; + let left = 0; + this._futureActiveItem = false; + let currentCharacter; + let alphabetizeAllPrograms = this._settings.get_boolean("alphabetize-all-programs") && this.layoutProperties.DisplayType === Constants.DisplayType.LIST; + let rtl = this.mainBox.get_text_direction() == Clutter.TextDirection.RTL; + let columns = -1; + + for (let i = 0; i < apps.length; i++) { + let app = apps[i]; + let item; + let shouldShow = true; + + if(category === Constants.CategoryType.PINNED_APPS || category === Constants.CategoryType.HOME_SCREEN){ + item = app; + if(!item.shouldShow) + shouldShow = false; + } + else{ + item = this.applicationsMap.get(app); + if (!item) { + item = new MW.ApplicationMenuItem(this, app, this.layoutProperties.DisplayType); + this.applicationsMap.set(app, item); + } + } + + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + + if(shouldShow){ + if(columns === -1){ + if(grid.layout_manager.forceGridColumns) + columns = grid.layout_manager.forceGridColumns; + else if(this.layoutProperties.DisplayType === Constants.DisplayType.GRID) + columns = this.getColumnsFromActor(item); + else + columns = 1; + grid.layout_manager.gridColumns = columns; + } + + if(!rtl && (count % columns === 0)){ + top++; + left = 0; + } + else if(rtl && (left === 0)){ + top++; + left = columns; + } + + if(alphabetizeAllPrograms && category === Constants.CategoryType.ALL_PROGRAMS){ + if(currentCharacter !== app.get_name().charAt(0).toLowerCase()){ + currentCharacter = app.get_name().charAt(0).toLowerCase(); + + let label = this._createLabelWithSeparator(currentCharacter.toUpperCase()); + grid.layout_manager.attach(label, left, top, 1, 1); + top++; + } + } + + grid.layout_manager.attach(item, left, top, 1, 1); + item.gridLocation = [left, top]; + + if(item instanceof MW.CategorySubMenuItem){ + top++; + grid.layout_manager.attach(item.menu.actor, left, top, 1, 1); + } + + if(!rtl) + left++; + else if(rtl) + left--; + count++; + + if(!this._futureActiveItem && grid === this.applicationsGrid){ + this._futureActiveItem = item; + } + } + } + if(this.applicationsBox && !this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.add_child(this.applicationsGrid); + if(this._futureActiveItem) + this.activeMenuItem = this._futureActiveItem; + } + + displayAllApps(){ + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + } + + get activeMenuItem() { + return this._activeMenuItem; + } + + set activeMenuItem(item) { + let itemChanged = item !== this._activeMenuItem; + if(itemChanged){ + this._activeMenuItem = item; + if(this.arcMenu.isOpen && item && this.layoutProperties.SupportsCategoryOnHover) + item.grab_key_focus(); + else if(this.arcMenu.isOpen) + this.mainBox.grab_key_focus(); + if(this.layout === Constants.MenuLayout.LAUNCHER && !this.layoutProperties.StandaloneRunner && item) + this.createActiveSearchItemPanel(item); + } + } + + _onSearchBoxChanged(searchBox, searchString) { + if(searchBox.isEmpty()){ + this.searchResults.hide(); + this.setDefaultMenuView(); + } + else{ + this._clearActorsFromBox(); + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.applicationsBox.add_child(this.searchResults); + this.searchResults.show(); + searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); + this.searchResults.setTerms(searchString.split(/\s+/)); + } + } + + _onSearchBoxKeyPress(searchBox, event) { + let symbol = event.get_key_symbol(); + switch (symbol) { + case Clutter.KEY_Up: + case Clutter.KEY_Down: + case Clutter.KEY_Left: + case Clutter.KEY_Right: + let direction; + if (symbol === Clutter.KEY_Down || symbol === Clutter.KEY_Up) + return Clutter.EVENT_PROPAGATE; + if (symbol === Clutter.KEY_Right) + direction = St.DirectionType.RIGHT; + if (symbol === Clutter.KEY_Left) + direction = St.DirectionType.LEFT; + + let cursorPosition = this.searchBox.clutter_text.get_cursor_position(); + + if(cursorPosition === Constants.CaretPosition.END && symbol === Clutter.KEY_Right) + cursorPosition = Constants.CaretPosition.END; + else if(cursorPosition === Constants.CaretPosition.START && symbol === Clutter.KEY_Left) + cursorPosition = Constants.CaretPosition.START; + else + cursorPosition = Constants.CaretPosition.MIDDLE; + + if(cursorPosition === Constants.CaretPosition.END || cursorPosition === Constants.CaretPosition.START){ + let navigateActor = this.activeMenuItem; + if(this.searchResults.hasActiveResult()){ + navigateActor = this.searchResults.getTopResult(); + if(navigateActor.has_style_pseudo_class("active")){ + navigateActor.grab_key_focus(); + return this.mainBox.navigate_focus(navigateActor, direction, false); + } + navigateActor.grab_key_focus(); + return Clutter.EVENT_STOP; + } + if(!navigateActor) + return Clutter.EVENT_PROPAGATE; + return this.mainBox.navigate_focus(navigateActor, direction, false); + } + return Clutter.EVENT_PROPAGATE; + default: + return Clutter.EVENT_PROPAGATE; + } + } + + _onMainBoxKeyPress(actor, event) { + if (event.has_control_modifier()) { + if(this.searchBox) + this.searchBox.grab_key_focus(); + return Clutter.EVENT_PROPAGATE; + } + + let symbol = event.get_key_symbol(); + let unicode = Clutter.keysym_to_unicode(symbol); + + switch (symbol) { + case Clutter.KEY_BackSpace: + if(this.searchBox && !this.searchBox.hasKeyFocus() && !this.searchBox.isEmpty()){ + this.searchBox.grab_key_focus(); + let newText = this.searchBox.getText().slice(0, -1); + this.searchBox.setText(newText); + } + return Clutter.EVENT_PROPAGATE; + case Clutter.KEY_Up: + case Clutter.KEY_Down: + case Clutter.KEY_Left: + case Clutter.KEY_Right: + let direction; + if (symbol === Clutter.KEY_Down) + direction = St.DirectionType.DOWN; + if (symbol === Clutter.KEY_Right) + direction = St.DirectionType.RIGHT + if (symbol === Clutter.KEY_Up) + direction = St.DirectionType.UP; + if (symbol === Clutter.KEY_Left) + direction = St.DirectionType.LEFT; + + if(this.layoutProperties.Search && this.searchBox.hasKeyFocus() && this.searchResults.hasActiveResult() && this.searchResults.get_parent()){ + if(this.searchResults.getTopResult().has_style_pseudo_class("active")){ + this.searchResults.getTopResult().actor.grab_key_focus(); + return actor.navigate_focus(global.stage.key_focus, direction, false); + } + this.searchResults.getTopResult().actor.grab_key_focus(); + return Clutter.EVENT_STOP; + } + else if(global.stage.key_focus === this.mainBox && symbol === Clutter.KEY_Up){ + return actor.navigate_focus(global.stage.key_focus, direction, true); + } + else if(global.stage.key_focus === this.mainBox){ + this.activeMenuItem.grab_key_focus(); + return Clutter.EVENT_STOP; + } + + return actor.navigate_focus(global.stage.key_focus, direction, false); + case Clutter.KEY_Tab: + case Clutter.KEY_KP_Tab: + case Clutter.KEY_KP_Enter: + case Clutter.KEY_Return: + case Clutter.KEY_Escape: + return Clutter.EVENT_PROPAGATE; + default: + if (unicode !== 0 && this.searchBox) { + global.stage.set_key_focus(this.searchBox.clutter_text); + let synthEvent = event.copy(); + synthEvent.set_source(this.searchBox.clutter_text); + this.searchBox.clutter_text.event(synthEvent, false); + } + } + return Clutter.EVENT_PROPAGATE; + } + + destroy(){ + if(this.recentFilesManager){ + this.recentFilesManager.destroy(); + this.recentFilesManager = null; + } + + if(this._treeChangedId){ + this._tree.disconnect(this._treeChangedId); + this._treeChangedId = null; + this._tree = null; + } + + if(this.applicationsBox){ + if(this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.remove_child(this.applicationsGrid); + } + + if(this.network){ + this.network.destroy(); + this.networkMenuItem.destroy(); + } + + if(this.computer){ + this.computer.destroy(); + this.computerMenuItem.destroy(); + } + + if(this.placesManager){ + for(let id in this._sections){ + this._sections[id].get_children().forEach((child) =>{ + child.destroy(); + }); + }; + if(this.placeManagerUpdatedID){ + this.placesManager.disconnect(this.placeManagerUpdatedID); + this.placeManagerUpdatedID = null; + } + this.placesManager.destroy(); + this.placesManager = null + } + + if(this._searchBoxChangedId){ + this.searchBox?.disconnect(this._searchBoxChangedId); + this._searchBoxChangedId = null;; + } + if(this._searchBoxKeyPressId){ + this.searchBox?.disconnect(this._searchBoxKeyPressId); + this._searchBoxKeyPressId = null; + } + if(this._searchBoxKeyFocusInId){ + this.searchBox?.disconnect(this._searchBoxKeyFocusInId); + this._searchBoxKeyFocusInId = null; + } + + if(this.searchBox) + this.searchBox.destroy(); + + if(this.searchResults){ + this.searchResults.setTerms([]); + this.searchResults.destroy(); + this.searchResults = null; + } + + if (this._mainBoxKeyPressId) { + this.mainBox.disconnect(this._mainBoxKeyPressId); + this._mainBoxKeyPressId = null; + } + + if(this._gnomeFavoritesReloadID){ + AppFavorites.getAppFavorites().disconnect(this._gnomeFavoritesReloadID); + this._gnomeFavoritesReloadID = null; + } + + if(this.pinnedAppsArray){ + for(let i = 0; i < this.pinnedAppsArray.length; i++){ + this.pinnedAppsArray[i].destroy(); + } + this.pinnedAppsArray = null; + } + + if(this.applicationsMap){ + this.applicationsMap.forEach((value,key,map)=>{ + value.destroy(); + }); + this.applicationsMap = null; + } + + if(this.categoryDirectories){ + this.categoryDirectories.forEach((value,key,map)=>{ + value.destroy(); + }); + this.categoryDirectories = null; + } + + this.mainBox.destroy_all_children(); + } + + _createScrollBox(params){ + let scrollBox = new St.ScrollView(params); + let panAction = new Clutter.PanAction({ interpolate: false }); + panAction.connect('pan', (action) => { + this._blockActivateEvent = true; + this.onPan(action, scrollBox); + }); + panAction.connect('gesture-cancel',(action) => this.onPanEnd(action, scrollBox)); + panAction.connect('gesture-end', (action) => this.onPanEnd(action, scrollBox)); + scrollBox.add_action(panAction); + + scrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); + scrollBox.clip_to_allocation = true; + + return scrollBox; + } + + _createLabelWithSeparator(headerLabel){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.HEADER_LABEL, Constants.SeparatorAlignment.HORIZONTAL, headerLabel); + return separator; + } + + createLabelRow(title){ + let labelRow = new PopupMenu.PopupMenuItem(_(title), { + hover: false, + can_focus: false + }); + labelRow.actor.add_style_pseudo_class = () => { return false;}; + labelRow.label.style = 'font-weight: bold;'; + return labelRow; + } + + _keyFocusIn(actor) { + if (this._focusChild == actor) + return; + this._focusChild = actor; + Utils.ensureActorVisibleInScrollView(actor); + } + + onPan(action, scrollbox) { + let [dist_, dx_, dy] = action.get_motion_delta(0); + let adjustment = scrollbox.get_vscroll_bar().get_adjustment(); + adjustment.value -= dy; + return false; + } + + onPanEnd(action, scrollbox) { + let velocity = -action.get_velocity(0)[2]; + let adjustment = scrollbox.get_vscroll_bar().get_adjustment(); + let endPanValue = adjustment.value + velocity * 2; + adjustment.value = endPanValue; + } +}; diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js new file mode 100644 index 0000000..fefdcd6 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/brisk.js @@ -0,0 +1,206 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true, + style_class: 'right-panel-plus70' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus70 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'left-panel-small ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.leftBox.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + this.actionsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.actionsBox.style = "padding: 5px 0px 0px 0px;" + this.leftBox.add_child(this.actionsBox); + + //create new section for Power, Lock, Logout, Suspend Buttons + this.sessionBox = new St.BoxLayout({ + vertical: false, + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.END, + x_align: Clutter.ActorAlign.CENTER + }); + this.sessionBox.style = "spacing: 6px;"; + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.sessionBox.add_child(powerButton); + } + } + this.leftBox.add_child(this.sessionBox); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.loadCategories(); + this.loadPinnedApps(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + loadExtraPinnedApps(){ + this.actionsBox.destroy_all_children(); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + let pinnedApps = this._settings.get_strv('brisk-shortcuts-list'); + + for(let i = 0;i < pinnedApps.length; i += 3){ + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem([pinnedApps[i],pinnedApps[i+1], pinnedApps[i+2]], Constants.DisplayType.LIST, isContainedInCategory); + if(placeMenuItem){ + this.actionsBox.add_child(placeMenuItem.actor); + } + } + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js new file mode 100644 index 0000000..46107c5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/budgie.js @@ -0,0 +1,184 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * Budgie.js Layout Created By: MagneFire https://gitlab.com/MagneFire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MAX, Constants.SeparatorAlignment.HORIZONTAL); + separator.style += "margin-bottom: 6px;"; + this.mainBox.add_child(separator); + } + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + vertical: true, + style_class: 'right-panel-plus70', + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus70 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + // Disable horizontal scrolling, hide vertical scrollbar, but allow vertical scrolling. + this.applicationsScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel-small ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + this.leftBox.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + if(this._settings.get_boolean('enable-activities-shortcut')){ + this.activitiesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.activities = new MW.ActivitiesMenuItem(this); + this.activitiesBox.add_child(this.activities.actor); + this.leftBox.add_child(this.activitiesBox); + } + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MAX, Constants.SeparatorAlignment.HORIZONTAL); + separator.style += "margin-top: 6px;"; + this.mainBox.add_child(separator); + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.actor.style = "padding-top: 8px; padding-bottom: 8px; margin: 0; spacing: 0;"; + categoryMenuItem._iconBin.visible = false; + } + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js new file mode 100644 index 0000000..e0d862c --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/chromebook.js @@ -0,0 +1,118 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 450, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START + }); + this.mainBox.add_child(this.subMainBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + reactive: true + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js new file mode 100644 index 0000000..79de6aa --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/elementary.js @@ -0,0 +1,118 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + DefaultMenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + + this.subMainBox= new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START + }); + this.mainBox.add_child(this.subMainBox); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + reactive:true + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;" + this.mainBox.add_child(this.searchBox.actor); + } + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js new file mode 100644 index 0000000..1b3f548 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/eleven.js @@ -0,0 +1,376 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultMenuWidth: 650, + DefaultIconGridStyle: "MediumRectIconGrid", + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.style = "margin: 5px 15px 10px 15px;"; + + this.topBox.add_child(this.searchBox.actor); + this.mainBox.insert_child_at_index(this.topBox, 0); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + style: "padding-bottom: 10px;" + }); + this.applicationsScrollBox = this._createScrollBox({ + clip_to_allocation: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.arcMenu.box.style = "padding-bottom:0px;"; + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px; background-color:rgba(186, 196,201, 0.1); padding: 12px 25px;"+ + "border-color: rgba(186, 196,201, 0.2); border-top-width: 1px;"; + this.themeNodeBorderRadius = ""; + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + this.themeNodeBorderRadius + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true, + style: 'padding: 0px 25px;' + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 10, + row_spacing: 5, + column_homogeneous: true + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + layout.forceGridColumns = 2; + this.shortcutsBox.add_child(this.shortcutsGrid); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.actionsBox.add_child(this.user.actor); + + this.quickLinksBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.CENTER, + vertical: false, + style: 'spacing: 10px;' + }); + let path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD); + if (path !== null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Downloads")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.quickLinksBox.add_child(placeMenuItem.actor); + } + + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path !== null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.quickLinksBox.add_child(placeMenuItem.actor); + } + + let settingsButton = new MW.SettingsButton(this); + this.quickLinksBox.add_child(settingsButton.actor); + + this.leaveButton = new MW.LeaveButton(this); + this.quickLinksBox.add_child(this.leaveButton.actor); + + this.actionsBox.add_child(this.quickLinksBox); + + this.backButton = this._createNavigationButtons(_("All Apps"), MW.BackButton); + this.allAppsButton = this._createNavigationButtons(_("Pinned"), MW.AllAppsButton); + this.frequentAppsHeader = this._createNavigationButtons(_("Frequent"), null); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + + this.disableFrequentAppsID = this._settings.connect("changed::eleven-disable-frequent-apps", () => this.setDefaultMenuView()); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + } + + loadFrequentApps(){ + this.frequentAppsList = []; + + if(this._settings.get_boolean("eleven-disable-frequent-apps")) + return; + + let labelRow = this.createLabelRow(_("Frequent")); + this.applicationsBox.add_child(labelRow); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + + if(mostUsed.length < 1) + return; + + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + this.frequentAppsList.push(item); + } + } + + const MaxItems = 8; + if(this.frequentAppsList.length > MaxItems) + this.frequentAppsList.splice(MaxItems); + } + + setDefaultMenuView(){ + this.layoutProperties.IconGridSize = 34; + this.setGridLayout(Constants.DisplayType.GRID, 6, 0); + super.setDefaultMenuView(); + this.loadFrequentApps(); + this.activeCategory = _("Pinned"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + } + + displayAllApps(){ + this.activeCategory = _("All Apps"); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + + this.setGridLayout(Constants.DisplayType.LIST, 1, 5); + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this._clearActorsFromBox(); + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 6, 0, false); + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + this.themeNodeBorderRadius; + + if(removeMenuArrow) + this.arcMenu.box.style = "padding-bottom:0px; margin:0px;"; + else + this.arcMenu.box.style = "padding-bottom:0px;"; + } + + setGridLayout(displayType, columns, spacing, setStyle = true){ + if(setStyle){ + this.applicationsGrid.x_align = displayType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER; + displayType === Constants.DisplayType.LIST ? this.applicationsBox.add_style_class_name('margin-box') : this.applicationsBox.remove_style_class_name('margin-box'); + } + this.applicationsGrid.layout_manager.column_spacing = spacing; + this.applicationsGrid.layout_manager.row_spacing = spacing; + this.layoutProperties.DisplayType = displayType; + } + + loadCategories() { + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + displayPinnedApps() { + this._clearActorsFromBox(this.applicationsBox); + this.activeCategory = _("Pinned"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + + if(this.frequentAppsList.length > 0 && !this._settings.get_boolean("eleven-disable-frequent-apps")){ + this.activeCategory = _("Frequent"); + this.setGridLayout(Constants.DisplayType.GRID, 2, 0); + this._displayAppList(this.frequentAppsList, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + this.setGridLayout(Constants.DisplayType.GRID, 6, 0); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + } + else if(this.applicationsBox.contains(this.shortcutsBox)){ + this.applicationsBox.remove_child(this.shortcutsBox); + } + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + this._hideNavigationButtons(); + + if(category === Constants.CategoryType.PINNED_APPS){ + this.applicationsBox.insert_child_at_index(this.allAppsButton, 0); + } + else if(category === Constants.CategoryType.HOME_SCREEN){ + this.applicationsBox.insert_child_at_index(this.frequentAppsHeader, 2); + } + else if(category === Constants.CategoryType.ALL_PROGRAMS){ + this.mainBox.insert_child_at_index(this.backButton, 1); + } + } + + _hideNavigationButtons(){ + if(this.mainBox.contains(this.backButton)) + this.mainBox.remove_child(this.backButton); + } + + _createNavigationButtons(buttonTitle, ButtonClass){ + let navButton = this.createLabelRow(buttonTitle); + navButton.remove_child(navButton._ornamentLabel); + navButton.label.y_align = Clutter.ActorAlign.CENTER; + navButton.label.style = 'padding: 15px 0px;'; + navButton.style = 'padding: 0px 25px;' + if(ButtonClass) + navButton.add_child(new ButtonClass(this)); + return navButton; + } + + _onSearchBoxChanged(searchBox, searchString){ + this.applicationsBox.remove_style_class_name('margin-box'); + if(!searchBox.isEmpty()) + this._hideNavigationButtons(); + super._onSearchBoxChanged(searchBox, searchString); + } + + destroy(){ + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + this.backButton.destroy(); + this.allAppsButton.destroy(); + if(this.disableFrequentAppsID){ + this._settings.disconnect(this.disableFrequentAppsID); + this.disableFrequentAppsID = null; + } + + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js new file mode 100644 index 0000000..8b66793 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/gnomemenu.js @@ -0,0 +1,161 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + + this.activitiesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + let activities = new MW.ActivitiesMenuItem(this); + this.activitiesBox.add_child(activities.actor); + this.leftBox.add_child(this.activitiesBox); + + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.actor.style = "padding-top: 8px; padding-bottom: 8px;"; + categoryMenuItem._iconBin.visible = false; + } + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js new file mode 100644 index 0000000..e298283 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/insider.js @@ -0,0 +1,337 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + PinnedAppsColumns: 1, + DefaultMenuWidth: 525, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.actionsBox.style = "margin: 0px 5px 0px 10px; spacing: 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.pinnedAppsButton = new MW.PinnedAppsButton(this); + this.pinnedAppsButton.actor.y_expand = true; + this.pinnedAppsButton.actor.y_align= Clutter.ActorAlign.START; + this.pinnedAppsButton.actor.margin = 5; + this.actionsBox.add_child(this.pinnedAppsButton.actor); + let userButton = new MW.UserMenuItem(this, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(userButton.actor); + let path = GLib.get_user_special_dir(imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path != null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(placeMenuItem.actor); + } + let settingsButton = new MW.SettingsButton(this); + settingsButton.actor.expand = false; + settingsButton.actor.margin = 5; + this.actionsBox.add_child(settingsButton.actor); + this.leaveButton = new MW.LeaveButton(this); + this.leaveButton.actor.expand = false; + this.leaveButton.actor.margin = 5; + this.actionsBox.add_child(this.leaveButton.actor); + + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + let userMenuBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.START, + vertical: false, + }) + this.user = new MW.UserMenuIcon(this, 55, true); + this.user.actor.x_align = Clutter.ActorAlign.CENTER; + this.user.actor.y_align = Clutter.ActorAlign.CENTER; + this.user.label.x_align = Clutter.ActorAlign.CENTER; + this.user.label.style = "margin-left: 10px;" + userMenuBox.add_child(this.user.actor); + userMenuBox.add_child(this.user.label); + this.subMainBox.add_child(userMenuBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 15px 10px 10px 10px;"; + this.subMainBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor( this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + + this._createPinnedAppsMenu(); + this.setDefaultMenuView(); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + super.loadPinnedApps(); + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + } + + _createPinnedAppsMenu(){ + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.pinnedAppsMenu = new PopupMenu.PopupMenu(this.dummyCursor, 0, St.Side.TOP); + this.pinnedAppsMenu.blockSourceEvents = true; + this.section = new PopupMenu.PopupMenuSection(); + this.pinnedAppsMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + let headerBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.leftPanelPopup.add_child(headerBox); + + this.backButton = new MW.BackMenuItem(this); + this.backButton.connect("activate", () => this.togglePinnedAppsMenu()); + headerBox.add_child(this.backButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + headerBox.add_child(separator); + headerBox.add_child(this.createLabelRow(_("Pinned Apps"))); + + this.pinnedAppsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + overlay_scrollbars: true, + reactive:true + }); + + this.leftPanelPopup.add_child(this.pinnedAppsScrollBox); + + this.pinnedAppsBox = new St.BoxLayout({ + vertical: true + }); + this.pinnedAppsScrollBox.add_actor(this.pinnedAppsBox); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 0, + row_spacing: 0 + }); + this.pinnedAppsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + layout_manager: layout + }); + layout.forceGridColumns = 1; + layout.hookup_style(this.pinnedAppsGrid); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor) - 1; + this.leftPanelPopup.style = `height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this.displayPinnedApps(); + this.subMenuManager.addMenu(this.pinnedAppsMenu); + this.pinnedAppsMenu.actor.hide(); + Main.uiGroup.add_child(this.pinnedAppsMenu.actor); + this.pinnedAppsMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.pinnedAppsButton.tooltip){ + this.pinnedAppsButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.pinnedAppsButton.active = false; + this.pinnedAppsButton.sync_hover(); + this.pinnedAppsButton.hovered = this.pinnedAppsButton.hover; + } + }); + } + + togglePinnedAppsMenu(){ + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.pinnedAppsMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.pinnedAppsMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + this.pinnedAppsButton.tooltip.hide(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let backgroundColor = themeNode.get_color('-arrow-background-color'); + let borderWidth = themeNode.get_length('-arrow-border-width'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + let drawBoxShadow = true; + if(backgroundColor?.alpha === 0){ + backgroundColor = themeNode.get_color('background-color'); + if(backgroundColor?.alpha === 0){ + drawBoxShadow = false; + } + } + + let styleProperties, shadowColor; + if(drawBoxShadow){ + shadowColor = backgroundColor.shade(.35); + backgroundColor = Utils.clutterColorToRGBA(backgroundColor); + shadowColor = Utils.clutterColorToRGBA(shadowColor); + styleProperties = "box-shadow: 3px 0px 2px " + shadowColor + "; background-color: " + backgroundColor + ";"; + } + + this.pinnedAppsMenu.actor.style = "-boxpointer-gap: 0px; -arrow-border-color: transparent; -arrow-border-width: 0px; width: 250px;" + +"-arrow-base: 0px; -arrow-rise: 0px; -arrow-background-color: transparent;" + +"border-radius: " + borderRadius + "px;" + styleProperties; + + this.arcMenu.actor.get_allocation_box(); + let [x, y] = this.arcMenu.actor.get_transformed_position(); + let rise = themeNode.get_length('-arrow-rise'); + + if(this.arcMenu._arrowSide === St.Side.TOP) + y += rise + 1; + else + y += 1; + + if(this.arcMenu._arrowSide === St.Side.LEFT) + x = x + (borderRadius * 2) + rise + 1; + else + x = x + (borderRadius * 2); + + this.dummyCursor.set_position(Math.round(x + borderWidth), Math.round(y + borderWidth)); + this.pinnedAppsMenu.toggle(); + if(this.pinnedAppsMenu.isOpen){ + this.activeMenuItem = this.backButton; + this.backButton.grab_key_focus(); + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + this.activeMenuItem = this.applicationsGrid.layout_manager.get_child_at(0, 0); + if(!this.applicationsBox.contains(this.applicationsGrid)) + this.applicationsBox.add_child(this.applicationsGrid); + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayPinnedApps() { + this._clearActorsFromBox(this.pinnedAppsBox); + this.layoutProperties.GridColumns = 1; + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.pinnedAppsGrid); + if(!this.pinnedAppsBox.contains(this.pinnedAppsGrid)) + this.pinnedAppsBox.add_child(this.pinnedAppsGrid); + this.updateStyle(); + this.layoutProperties.GridColumns = 5; + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js new file mode 100644 index 0000000..7dbeccc --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/launcher.js @@ -0,0 +1,465 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const MORE_PROVIDERS_POP_UP = -1; +const MAX_VISIBLE_PROVIDERS = 4; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + SearchDisplayType: Constants.DisplayType.LIST, + DisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + MenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.activeResult = null; + this.searchProvidersBoxStyle = "padding: 0px 15px; margin-bottom: 10px; height: 50px; background-color: rgba(186, 196, 201, 0.1); border-color:rgba(186, 196, 201, 0.2); border-bottom-width: 1px;" + this.themeNodeBorderRadius = ""; + this.searchProvidersBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: this.searchProvidersBoxStyle + this.themeNodeBorderRadius + }); + this.searchProvidersBox.clip_to_allocation = true; + this.mainBox.add_child(this.searchProvidersBox); + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 10px;"; + this.searchTermsChangedID = this.searchResults.connect('have-results', () => { + this.searchResultsChangedEvent(); + }); + this.searchNoResultsID = this.searchResults.connect('no-results', () => { + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + }) + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.subMainBox.style = "width:750px; spacing: 8px;"; + + this.searchResultDetailsBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL, + style: 'width: 415px; spacing: 20px;' + }); + + this.searchResultDetailsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.searchResultDetailsScrollBox.add_actor(this.searchResultDetailsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + this.mainBox.add_child(this.searchBox); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.arcMenu.box.style = "padding-top: 0px;"; + this.hasPinnedApps = true; + this.loadPinnedApps(); + this.loadCategories(); + + this.moreItem = this.createProviderMenuItem(_("More"), MORE_PROVIDERS_POP_UP); + let arrowIcon = PopupMenu.arrowIcon(St.Side.BOTTOM); + arrowIcon.y_expand = false; + this.moreItem.add_child(arrowIcon); + this._createMoreProvidersMenu(); + + this.setDefaultMenuView(); + } + + loadPinnedApps(){ + super.loadPinnedApps(); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.FREQUENT_APPS, Constants.DisplayType.LIST); + this.categoryDirectories.set(Constants.CategoryType.FREQUENT_APPS, categoryMenuItem); + + super.loadCategories(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.moveProvidersMenuItems = []; + this.moreProvidersBox.remove_all_children(); + this.searchResults.setProvider(Constants.CategoryType.SEARCH_RESULTS); + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + this.displayPinnedApps(); + this.searchProvidersBox.remove_all_children(); + let allProvidersItem = this.createProviderMenuItem(_("All"), Constants.CategoryType.SEARCH_RESULTS); + this.searchProvidersBox.add_child(allProvidersItem); + let searchProviders = this.searchResults.getProviders(); + + let currentItems = 1; + for(let provider of searchProviders){ + provider = provider.appInfo ? provider : _("Applications"); + let item = this.createProviderMenuItem(provider, provider.appInfo ? null : Constants.CategoryType.ALL_PROGRAMS); + + if(currentItems < MAX_VISIBLE_PROVIDERS) + this.searchProvidersBox.add_child(item); + else{ + this.moveProvidersMenuItems.push(item); + item.moreIndex = currentItems - MAX_VISIBLE_PROVIDERS; + item.x_expand = true; + item.x_align = Clutter.ActorAlign.FILL; + this.moreProvidersBox.add_child(item); + } + + currentItems++; + } + + this.searchProvidersBox.add_child(this.moreItem); + + this.activeProvider = allProvidersItem; + this.activeProvider.add_style_class_name("active-item"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + createProviderMenuItem(provider, providerEnum){ + let providerName = provider.appInfo ? provider.appInfo.get_name() : provider; + + let providerMenuItem = new MW.ArcMenuPopupBaseMenuItem(this); + providerMenuItem.name = "arc-menu-launcher-button"; + providerMenuItem.x_expand = false; + providerMenuItem.remove_child(providerMenuItem._ornamentLabel); + providerMenuItem.x_align = Clutter.ActorAlign.START; + providerMenuItem.style = 'padding: 10px 14px; margin: 0px;'; + providerMenuItem.provider = provider; + let label = new St.Label({ + text: _(providerName), + y_expand: false, + y_align: Clutter.ActorAlign.CENTER, + }); + providerMenuItem.label = label; + providerMenuItem.add_child(label); + + providerMenuItem.connect("activate", () => this.activateProviderMenuItem(providerMenuItem, providerEnum)); + return providerMenuItem; + } + + activateProviderMenuItem(providerMenuItem, providerEnum){ + if(providerEnum && providerEnum === MORE_PROVIDERS_POP_UP){ + this.moreItem.add_style_class_name("active-item"); + this.toggleMoreProvidersMenu(); + } + else{ + if(this.activeProvider) + this.activeProvider.remove_style_class_name("active-item"); + + if(this.moreProvidersMenu.isOpen) + this.moreProvidersMenu.toggle(); + + this.moreItem.remove_style_class_name("active-item"); + this.moreItem.active = false; + + let potentialMovedItem = this.searchProvidersBox.get_child_at_index(MAX_VISIBLE_PROVIDERS); + + if(potentialMovedItem.wasMoved) + this.moveProviderMenuItem(potentialMovedItem, this.searchProvidersBox, this.moreProvidersBox, true); + + if(providerMenuItem.get_parent() === this.moreProvidersBox) + this.moveProviderMenuItem(providerMenuItem, this.moreProvidersBox, this.searchProvidersBox, false); + + this.activeProvider = providerMenuItem; + providerMenuItem.add_style_class_name("active-item"); + + this.displayProviderPage(providerMenuItem.provider, providerEnum); + this.searchResults.setProvider(providerMenuItem.provider.appInfo ? providerMenuItem.provider.appInfo.get_id() : providerEnum); + + if(!this.searchBox.isEmpty()){ + this._clearActorsFromBox(); + let searchString = this.searchBox.get_text(); + searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); + this.searchResults.setTerms([]); + + let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + this.applicationsBox.add_child(this.searchResults); + this.searchResults.setTerms(searchString.split(/\s+/)); + this.searchResults.highlightDefault(true); + this.activeProvider.grab_key_focus(); + } + } + } + + moveProviderMenuItem(menuItem, currentBox, newBox, wasMoved){ + let expand = wasMoved ? true : false; + let align = wasMoved ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.START; + let index = wasMoved ? menuItem.moreIndex : MAX_VISIBLE_PROVIDERS; + + currentBox.remove_child(menuItem); + newBox.insert_child_at_index(menuItem, index); + menuItem.x_expand = expand; + menuItem.x_align = align; + menuItem.wasMoved = !wasMoved; + } + + displayProviderPage(provider, providerEnum){ + if(this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.remove_child(this.searchResultDetailsScrollBox); + if(providerEnum){ + if(providerEnum === Constants.CategoryType.SEARCH_RESULTS) + this.displayPinnedApps(); + if(providerEnum === Constants.CategoryType.ALL_PROGRAMS) + this.displayFrequentApps(); + return; + } + this._clearActorsFromBox(); + let providerName = provider.appInfo ? provider.appInfo.get_name() : provider; + let providerIcon = provider.appInfo ? provider.appInfo.get_icon() : Gio.icon_new_for_string(''); + + this.setSearchHintText(providerName); + + let providerBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + }); + let icon = new St.Icon({ + icon_size: 76, + gicon: providerIcon, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + }); + let label = new St.Label({ + text: _("Search") + " " + _(providerName), + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: false, + y_align: Clutter.ActorAlign.START, + }); + providerBox.add_child(icon); + providerBox.add_child(label); + this.applicationsBox.add_child(providerBox); + } + + _createMoreProvidersMenu(){ + this.moreProvidersMenu = new PopupMenu.PopupMenu(this.moreItem, 0.5, St.Side.TOP); + this.moreProvidersMenu.connect('open-state-changed', (menu, open) => { + if(!open) + this.moreItem.remove_style_class_name("active-item"); + }); + + this.section = new PopupMenu.PopupMenuSection(); + this.moreProvidersMenu.addMenuItem(this.section); + + this.moreProvidersBox = new St.BoxLayout({ + vertical: true + }); + + this.moreProvidersScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'vfade', + overlay_scrollbars: true, + reactive: true + }); + this.moreProvidersScrollBox._delegate = this.moreProvidersBoxScrollBox; + this.moreProvidersScrollBox.add_actor(this.moreProvidersBox); + this.moreProvidersScrollBox.clip_to_allocation = true; + + this.moreProvidersScrollBox.style = "max-height: 350px;"; + this.section.actor.add_child(this.moreProvidersScrollBox); + this.subMenuManager.addMenu(this.moreProvidersMenu); + this.moreProvidersMenu.actor.hide(); + Main.uiGroup.add_child(this.moreProvidersMenu.actor); + } + + toggleMoreProvidersMenu(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.moreProvidersMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.moreProvidersMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + + this.moreProvidersMenu.toggle(); + } + + displayFrequentApps(){ + this._clearActorsFromBox(); + this.setSearchHintText(_("Applications")); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.FREQUENT_APPS); + let label = this.createLabelRow(_("Frequent Apps")); + this.applicationsBox.add_child(label); + this.layoutProperties.GridColumns = 5; + super._displayAppList(categoryMenuItem.appList, Constants.CategoryType.FREQUENT_APPS, this.applicationsGrid); + } + + setSearchHintText(providerName){ + this.searchBox.hint_text = _("Search") + " " + _(providerName) + "…"; + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: " + borderRadius + "px " + borderRadius + "px 0px 0px;"; + this.searchProvidersBox.style = this.searchProvidersBoxStyle + this.themeNodeBorderRadius; + if(removeMenuArrow) + this.arcMenu.box.style = "padding-top: 0px; margin: 0px;"; + else + this.arcMenu.box.style = "padding-top: 0px;"; + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + } + + displayPinnedApps() { + super._clearActorsFromBox(); + let label = this.createLabelRow(_("Pinned Apps")); + this.searchBox.hint_text = _("Search…"); + this.applicationsBox.add_child(label); + this.layoutProperties.GridColumns = 5; + super._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + } + + searchResultsChangedEvent(){ + if(!this.subMainBox.contains(this.searchResultDetailsScrollBox)) + this.subMainBox.add_child(this.searchResultDetailsScrollBox); + if(this.activeResult === this.searchResults.getTopResult()) + return; + + this.activeResult = this.searchResults.getTopResult(); + if(!this.activeResult || this.activeResult === null){ + return; + } + + this.createActiveSearchItemPanel(this.searchResults.getTopResult()); + } + + createActiveSearchItemPanel(activeResult){ + if(!activeResult) + return; + if(!this.subMainBox.contains(this.searchResultDetailsScrollBox)) + return; + if(!activeResult.provider || activeResult === this.activeResultMenuItem) + return; + this.activeCategoryType = -1; + this.searchResultDetailsBox.destroy_all_children(); + + if(!activeResult.metaInfo) + return; + + let app = activeResult.app ? activeResult.app : null; + let path = activeResult._path ? activeResult._path : null; + + this.activeResultMenuItem = new MW.ApplicationMenuItem(this, app, Constants.DisplayType.GRID, activeResult.metaInfo); + this.activeResultMenuItem.name = "ExtraLargeIconGrid"; + this.activeResultMenuItem.provider = activeResult.provider; + this.activeResultMenuItem.resultsView = activeResult.resultsView; + this.activeResultMenuItem._path = path; + this.activeResultMenuItem.x_expand = false; + this.activeResultMenuItem.x_align = Clutter.ActorAlign.CENTER; + let iconSize = 76; + let icon = activeResult.metaInfo ?activeResult.metaInfo['createIcon'](iconSize) : app.create_icon_texture(iconSize); + this.activeResultMenuItem._iconBin.set_child(icon); + if(!this.activeResultMenuItem._iconBin.get_child()){ + let icon = new St.Icon({ + icon_size: iconSize, + gicon: activeResult.provider.appInfo.get_icon() + }); + this.activeResultMenuItem._iconBin.set_child(icon); + } + this.searchResultDetailsBox.add_child(this.activeResultMenuItem); + this.searchResultContextItems = new MW.ApplicationContextItems(this.activeResultMenuItem, app, this); + this.searchResultContextItems.path = path; + this.searchResultContextItems.rebuildItems(); + this.searchResultDetailsBox.add_child(this.searchResultContextItems); + } + + destroy(){ + this.arcMenu.box.style = null; + + if(this.searchTermsChangedID){ + this.searchResults.disconnect(this.searchTermsChangedID); + this.searchTermsChangedID = null; + } + + if(this.searchNoResultsID){ + this.searchResults.disconnect(this.searchNoResultsID); + this.searchNoResultsID = null; + } + + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js new file mode 100644 index 0000000..3185f2d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/mint.js @@ -0,0 +1,250 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + //Stores the Pinned Icons on the left side + this.actionsScrollBox = new St.ScrollView({ + x_expand: false, + y_expand: false, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'small-vfade' + }); + this.actionsScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL); + this.actionsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsScrollBox.add_actor(this.actionsBox); + this.actionsScrollBox.clip_to_allocation = true; + + this.actionsScrollBox.style = "padding: 21px 0px; width: 62px; margin: 0px 10px 10px 20px; background-color:rgba(186, 196,201, 0.1); border-color:rgba(186, 196,201, 0.2); border-width: 1px; border-radius: 5px;"; + this.actionsBox.style = "spacing: 10px;"; + //check if custom ArcMenu is enabled + if( this._settings.get_boolean('enable-custom-arc-menu')) + this.actionsBox.add_style_class_name('arc-menu'); + + this.mainBox.add_child(this.actionsScrollBox); + this.rightMenuBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.rightMenuBox); + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 20px 10px 8px;"; + this.rightMenuBox.add_child(this.searchBox.actor); + } + else + this.rightMenuBox.style = "margin-top: 10px;"; + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.rightMenuBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + + this.categoriesScrollBox.add_actor( this.categoriesBox); + this.categoriesScrollBox.clip_to_allocation = true; + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 20px 10px 8px;"; + this.rightMenuBox.add_child(this.searchBox.actor); + } + this.loadCategories(); + this.loadPinnedApps(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + _addSeparator(){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.add_child(separator); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + loadExtraPinnedApps(){ + this.actionsBox.destroy_all_children(); + super.loadExtraPinnedApps(this._settings.get_strv('mint-pinned-app-list'), this._settings.get_int('mint-separator-index')); + } + + _createExtraPinnedAppsList(){ + let pinnedApps = []; + //Find the Default Web Browser, if found add to pinned apps list, if not found delete the placeholder. + //Will only run if placeholder is found. Placeholder only found with default settings set. + let browserName = ''; + try{ + //user may not have xdg-utils package installed which will throw error + let [res, stdout, stderr, status] = GLib.spawn_command_line_sync("xdg-settings get default-web-browser"); + let webBrowser = String.fromCharCode(...stdout); + browserName = webBrowser.split(".desktop")[0]; + browserName += ".desktop"; + } + catch(error){ + global.log("ArcMenu Error - Failed to find default web browser. Removing placeholder pinned app.") + } + this._app = appSys.lookup_app(browserName); + if(this._app){ + let appIcon = this._app.create_icon_texture(25); + let iconName = ''; + if(appIcon.icon_name) + iconName = appIcon.icon_name; + else if(appIcon.gicon) + iconName = appIcon.gicon.to_string(); + pinnedApps.push(this._app.get_name(), iconName, this._app.get_id()); + } + else{ + pinnedApps.push(_("Home"), "ArcMenu_Home", "ArcMenu_Home"); + } + pinnedApps.push(_("Terminal"), "utilities-terminal", "org.gnome.Terminal.desktop"); + pinnedApps.push(_("Settings"), "emblem-system-symbolic", "gnome-control-center.desktop"); + + let software = Utils.findSoftwareManager(); + if(software) + pinnedApps.push(_("Software"), 'system-software-install-symbolic', software); + else + pinnedApps.push(_("Documents"), "ArcMenu_Documents", "ArcMenu_Documents"); + + pinnedApps.push(_("Files"), "system-file-manager", "org.gnome.Nautilus.desktop"); + pinnedApps.push(_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"); + pinnedApps.push(_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"); + pinnedApps.push(_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"); + + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('mint-pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + return pinnedApps; + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js new file mode 100644 index 0000000..2135cc5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/plasma.js @@ -0,0 +1,453 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gio, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 450, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START + }); + this.leftTopBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + vertical: false, + y_align: Clutter.ActorAlign.CENTER, + style: "padding-left: 10px; margin-left: 0.4em" + }); + this.rightTopBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + style_class: 'popup-menu-item', + style: "padding: 0px; margin: 0px; spacing: 0px;" + }); + + this.user = new MW.UserMenuIcon(this, 55, true); + this.user.actor.x_expand = false; + this.user.actor.y_expand = true; + this.user.actor.x_align = Clutter.ActorAlign.CENTER; + this.user.actor.y_align = Clutter.ActorAlign.CENTER; + this.leftTopBox.add_child(this.user.actor); + this.rightTopBox.add_child(this.user.label); + this.user.label.style = "padding-left: 0.4em; margin: 0px 10px 0px 15px; font-weight: bold;"; + this.user.label.y_expand = false; + this.user.label.x_expand = true; + this.user.label.x_align = Clutter.ActorAlign.START; + this.rightTopBox.add_child(this.searchBox.actor); + + this.topBox.add_child(this.leftTopBox); + this.topBox.add_child(this.rightTopBox); + + this.searchBarLocation = this._settings.get_enum('searchbar-default-top-location'); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? 'margin-box' : 'margin-box small-vfade', + overlay_scrollbars: true, + reactive:true, + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBoxContainer = new St.BoxLayout({ + x_expand: true, + y_expand: false, + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START + }); + this.navigateBox = new St.BoxLayout({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + style: "spacing: 6px;", + }); + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_homogeneous: true, + column_spacing: 10, + row_spacing: 10 + }); + this.grid = new St.Widget({ + layout_manager: layout + }); + layout.hookup_style(this.grid); + this.navigateBox.add_child(this.grid); + + this.pinnedAppsButton = new MW.PlasmaMenuItem(this, _("Pinned Apps"), Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'); + this.pinnedAppsButton.connect("activate", () => this.displayPinnedApps() ); + this.grid.layout_manager.attach(this.pinnedAppsButton, 0, 0, 1, 1); + this.pinnedAppsButton.set_style_pseudo_class("active-item"); + + this.applicationsButton = new MW.PlasmaMenuItem(this, _("Applications"), 'preferences-desktop-apps-symbolic'); + this.applicationsButton.connect("activate", () => this.displayCategories() ); + this.grid.layout_manager.attach(this.applicationsButton, 1, 0, 1, 1); + + this.computerButton = new MW.PlasmaMenuItem(this, _("Computer"), 'computer-symbolic'); + this.computerButton.connect("activate", () => this.displayComputerCategory() ); + this.grid.layout_manager.attach(this.computerButton, 2, 0, 1, 1); + + this.leaveButton = new MW.PlasmaMenuItem(this, _("Leave"), 'system-shutdown-symbolic'); + this.leaveButton.connect("activate", () => this.displayPowerItems() ); + this.grid.layout_manager.attach(this.leaveButton, 3, 0, 1, 1); + + this.categoryHeader = new MW.PlasmaCategoryHeader(this); + this.categoryHeader.add_style_class_name('margin-box'); + + if(this.searchBarLocation === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 3px 10px 5px 10px;"; + this.topBox.style = 'padding-top: 0.5em;' + + this.navigateBoxContainer.add_child(this.navigateBox); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBoxContainer.add_child(separator); + this.navigateBoxContainer.y_expand = false; + this.navigateBoxContainer.y_align = Clutter.ActorAlign.START; + this.mainBox.add_child(this.navigateBoxContainer); + this.mainBox.add_child(this.applicationsScrollBox); + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + + this.mainBox.add_child(this.topBox); + } + else if(this.searchBarLocation === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 3px 10px 10px 10px;"; + + this.mainBox.add_child(this.topBox); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + this.mainBox.add_child(this.applicationsScrollBox); + this.navigateBoxContainer.y_expand = true; + this.navigateBoxContainer.y_align = Clutter.ActorAlign.END; + separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.navigateBoxContainer.add_child(separator); + this.navigateBoxContainer.add_child(this.navigateBox); + this.mainBox.add_child(this.navigateBoxContainer); + } + + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcutsList = this._settings.get_value('application-shortcuts-list').deep_unpack(); + this.applicationShortcuts = []; + for(let i = 0; i < applicationShortcutsList.length; i++){ + let applicationName = applicationShortcutsList[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcutsList[i][1], applicationShortcutsList[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.applicationShortcuts.push(shortcutMenuItem.actor); + } + + let directoryShortcutsList = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + this._loadPlaces(directoryShortcutsList); + + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + this.updateWidth(); + this._createPowerItems(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setFrequentAppsList(categoryMenuItem){ + categoryMenuItem.appList = []; + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + categoryMenuItem.appList.push(mostUsed[i]); + let item = this.applicationsMap.get(mostUsed[i]); + if (!item) { + item = new MW.ApplicationMenuItem(this, mostUsed[i], this.layoutProperties.DisplayType); + this.applicationsMap.set(mostUsed[i], item); + } + } + } + } + + _clearActorsFromBox(box){ + this.categoryHeader.setActiveCategory(null); + if(this.mainBox.contains(this.categoryHeader)) + this.mainBox.remove_child(this.categoryHeader); + super._clearActorsFromBox(box); + } + + clearActiveItem(){ + this.pinnedAppsButton.setActive(false); + this.computerButton.setActive(false); + this.applicationsButton.setActive(false); + this.leaveButton.setActive(false); + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum === Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayComputerCategory(){ + this._clearActorsFromBox(this.applicationsBox); + this.applicationsBox.add_child(this.createLabelRow(_("Application Shortcuts"))); + for(let i = 0; i < this.applicationShortcuts.length; i++){ + this.applicationsBox.add_child(this.applicationShortcuts[i]); + } + this.applicationsBox.add_child(this.createLabelRow(_("Places"))); + for(let i = 0; i < this.directoryShortcuts.length; i++){ + this.applicationsBox.add_child(this.directoryShortcuts[i]); + } + this.applicationsBox.add_child(this.externalDevicesBox); + this.activeMenuItem = this.applicationShortcuts[0]; + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + + if(id === 'bookmarks' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Bookmarks"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'devices' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Devices"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'network' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Network"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + } + + displayPinnedApps(){ + this.activeCategoryType = Constants.CategoryType.PINNED_APPS; + super.displayPinnedApps(); + } + + _loadPlaces(directoryShortcutsList) { + this.directoryShortcuts = []; + for (let i = 0; i < directoryShortcutsList.length; i++) { + let isContainedInCategory = false; + let directory = directoryShortcutsList[i]; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + this.directoryShortcuts.push(placeMenuItem); + } + } + + _createPowerItems(){ + this.lock = new MW.PowerMenuItem(this, Constants.PowerType.LOCK); + this.logOut = new MW.PowerMenuItem(this, Constants.PowerType.LOGOUT); + Utils.canHybridSleep((canHybridSleep, needsAuth) => { + if(canHybridSleep){ + this.sleep = new MW.PowerMenuItem(this, Constants.PowerType.HYBRID_SLEEP); + } + }); + + + Utils.canHibernate((canHibernate, needsAuth) => { + if(canHibernate){ + this.hibernate = new MW.PowerMenuItem(this, Constants.PowerType.HIBERNATE); + } + }); + this.suspend = new MW.PowerMenuItem(this, Constants.PowerType.SUSPEND); + this.restart = new MW.PowerMenuItem(this, Constants.PowerType.RESTART); + this.powerOff = new MW.PowerMenuItem(this, Constants.PowerType.POWER_OFF); + } + + displayPowerItems(){ + this._clearActorsFromBox(this.applicationsBox); + this.applicationsBox.add_child(this.createLabelRow(_("Session"))); + this.applicationsBox.add_child(this.lock); + this.applicationsBox.add_child(this.logOut); + this.applicationsBox.add_child(this.createLabelRow(_("System"))); + this.applicationsBox.add_child(this.suspend); + if(this.sleep) + this.applicationsBox.insert_child_at_index(this.sleep, 4); + + if(this.hibernate) + this.applicationsBox.insert_child_at_index(this.hibernate, 5); + this.applicationsBox.add_child(this.restart); + this.applicationsBox.add_child(this.powerOff); + this.activeMenuItem = this.lock; + } + + displayCategories(){ + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + this._clearActorsFromBox(this.applicationsBox); + + this.categoryHeader.setActiveCategory(null); + this._insertCategoryHeader(); + + let isActiveMenuItemSet = false; + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.applicationsBox.add_child(categoryMenuItem.actor); + if(!isActiveMenuItemSet){ + isActiveMenuItemSet = true; + this.activeMenuItem = categoryMenuItem; + } + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.clearActiveItem(); + this.pinnedAppsButton.set_style_pseudo_class("active-item"); + this.displayPinnedApps(); + } + + _insertCategoryHeader(){ + if(this.mainBox.contains(this.categoryHeader)) + this.mainBox.remove_child(this.categoryHeader); + if(this.searchBarLocation === Constants.SearchbarLocation.BOTTOM) + this.mainBox.insert_child_at_index(this.categoryHeader, 1); + else + this.mainBox.insert_child_at_index(this.categoryHeader, 2); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._insertCategoryHeader(); + this.categoryHeader.setActiveCategory(this.activeCategory); + this._displayAppList(appList, category, this.applicationsGrid); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + this._insertCategoryHeader(); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.categoryHeader.setActiveCategory(this.activeCategory); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(!searchBox.isEmpty()){ + this.clearActiveItem(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } + + destroy(){ + if(this.sleep) + this.sleep.destroy(); + if(this.hibernate) + this.hibernate.destroy(); + + this.lock.destroy(); + this.logOut.destroy(); + this.suspend.destroy(); + this.restart.destroy(); + this.powerOff.destroy(); + + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js new file mode 100644 index 0000000..2630ef5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/raven.js @@ -0,0 +1,395 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 410, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + SupportsCategoryOnHover: true, + DefaultCategoryIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.ravenPositionChangedID = this._settings.connect('changed::raven-position', () => this._updatePosition()); + + this.dummyCursor = new St.Widget({ width: 1, height: 0, opacity: 0}); + Main.uiGroup.add_child(this.dummyCursor); + this.updateLocation(); + + //store old ArcMenu variables + this.oldSourceActor = this.arcMenu.sourceActor; + this.oldFocusActor = this.arcMenu.focusActor; + this.oldArrowAlignment = this.arcMenu.actor._arrowAlignment; + + this.arcMenu.sourceActor = this.dummyCursor; + this.arcMenu.focusActor = this.dummyCursor; + this.arcMenu._boxPointer.setPosition(this.dummyCursor, 0); + this.arcMenu.close(); + this.arcMenu._boxPointer.hide(); + + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen) + this.activeCategory = _("Pinned Apps"); + else + this.activeCategory = _("All Programs"); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px; -boxpointer-gap: 0px; -arrow-border-radius: 0px"; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + this.actionsBoxContainer = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + + this.actionsBox = new St.BoxLayout({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + this.actionsBoxContainer.add_child(this.actionsBox); + this.actionsBox.style = "spacing: 5px;"; + this.actionsBoxContainerStyle = "margin: 0px 0px 0px 0px; spacing: 10px; background-color: rgba(186, 196,201, 0.1); padding: 5px 5px;"+ + "border-color: rgba(186, 196,201, 0.2);"; + + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + //Sub Main Box -- stores left and right box + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.subMainBox.add_child(this.topBox); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 25px 10px 10px 10px;"; + this.topBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + x_align: Clutter.ActorAlign.FILL, + vertical: true, + style: "padding-bottom: 10px;" + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.weatherBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END, + vertical: true + }); + + this._weatherItem = new MW.WeatherSection(this); + this._weatherItem.style = "border-radius:4px; padding: 10px; margin: 0px 25px 25px 25px;"; + this._clocksItem = new MW.WorldClocksSection(this); + this._clocksItem.x_expand = true; + this._clocksItem.x_align = Clutter.ActorAlign.FILL; + this._clocksItem.style = "border-radius:4px; padding: 10px; margin: 0px 25px 25px 25px;"; + + this.weatherBox.add_child(this._clocksItem); + this.weatherBox.add_child(this._weatherItem); + + this.appShortcuts = []; + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + + this.shortcutsBox.add_child(this.shortcutsGrid); + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.GRID); + this.appShortcuts.push(shortcutMenuItem); + } + + this.updateWidth(); + this._updatePosition(); + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.weatherBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _updatePosition(){ + let ravenPosition = this._settings.get_enum('raven-position'); + if(this.mainBox.contains(this.actionsBoxContainer)){ + this.mainBox.remove_child(this.actionsBoxContainer); + } + if(ravenPosition === Constants.RavenPosition.LEFT){ + this.mainBox.insert_child_at_index(this.actionsBoxContainer, 0); + this.actionsBoxContainer.style = "border-right-width: 1px;" + this.actionsBoxContainerStyle; + } + else if(ravenPosition === Constants.RavenPosition.RIGHT){ + this.mainBox.insert_child_at_index(this.actionsBoxContainer, 1); + this.actionsBoxContainer.style = "border-left-width: 1px;" + this.actionsBoxContainerStyle; + } + } + + updateLocation(){ + let ravenPosition = this._settings.get_enum('raven-position'); + + let alignment = ravenPosition === Constants.RavenPosition.LEFT ? 0 : 1; + this.arcMenu._boxPointer.setSourceAlignment(alignment); + this.arcMenu._arrowAlignment = alignment; + + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let monitorWorkArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + + let positionX = ravenPosition === Constants.RavenPosition.LEFT ? monitorWorkArea.x : monitorWorkArea.x + monitorWorkArea.width - 1; + let positionY = this.arcMenu._arrowSide === St.Side.BOTTOM ? monitorWorkArea.y + monitorWorkArea.height : monitorWorkArea.y; + + this.dummyCursor.set_position(positionX, positionY); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + let screenHeight = monitorWorkArea.height; + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderWidth = themeNode.get_length('-arrow-border-width'); + + let height = Math.round((screenHeight - borderWidth * 2) / scaleFactor); + this.mainBox.style = `height: ${height}px;`; + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen){ + this.activeCategory = _("Pinned Apps"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + else{ + this.activeCategory = _("All Programs"); + let isGridLayout = true; + this.displayAllApps(isGridLayout); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + } + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + updateStyle(){ + super.updateStyle(); + + this.arcMenu.actor.style = "-arrow-base: 0px; -arrow-rise: 0px; -boxpointer-gap: 0px; -arrow-border-radius: 0px;"; + this.arcMenu.box.style = "padding-bottom: 0px; padding-top: 0px; margin: 0px;"; + this.updateLocation(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.HOME_SCREEN, Constants.DisplayType.BUTTON); + this.categoryDirectories.set(Constants.CategoryType.HOME_SCREEN, categoryMenuItem); + this.hasPinnedApps = true; + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum == Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.BUTTON); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.BUTTON); + this.displayCategories(); + } + + displayCategories(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.actionsBox.add_child(categoryMenuItem.actor); + } + } + + displayPinnedApps() { + if(this.activeCategoryType === Constants.CategoryType.HOME_SCREEN) + this._clearActorsFromBox(this.applicationsBox); + else + this._clearActorsFromBox(); + this.activeCategory = _("Pinned Apps"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + this.activeCategory = _("Shortcuts"); + this._displayAppList(this.appShortcuts, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + let actors = this.weatherBox.get_children(); + for (let i = 0; i < actors.length; i++) { + this.weatherBox.remove_child(actors[i]); + } + if(this._settings.get_boolean('enable-clock-widget-raven')){ + this.weatherBox.add_child(this._clocksItem); + } + if(this._settings.get_boolean('enable-weather-widget-raven')){ + this.weatherBox.add_child(this._weatherItem); + } + if(!this.subMainBox.contains(this.weatherBox)) + this.subMainBox.add_child(this.weatherBox); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + let label = this._createLabelWithSeparator(_("Recent Files")); + label.actor.style += "padding-left: 10px;"; + this.applicationsBox.insert_child_at_index(label, 0); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.applicationsBox.add_style_class_name('margin-box'); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _clearActorsFromBox(box) { + if(this.subMainBox.contains(this.weatherBox)){ + this.subMainBox.remove_child(this.weatherBox); + } + + this.applicationsBox.remove_style_class_name('margin-box'); + super._clearActorsFromBox(box); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + let label = this._createLabelWithSeparator(this.activeCategory); + + if(grid === this.applicationsGrid){ + label.actor.style += "padding-left: 10px;"; + this.applicationsBox.insert_child_at_index(label.actor, 0); + } + else{ + label.actor.style += "padding-left: 10px; padding-top: 20px;"; + this.applicationsBox.insert_child_at_index(label.actor, 2); + } + } + + destroy(){ + if(this._clocksItem) + this._clocksItem.destroy(); + if(this._weatherItem) + this._weatherItem.destroy(); + + if(this.ravenPositionChangedID){ + this._settings.disconnect(this.ravenPositionChangedID); + this.ravenPositionChangedID = null; + } + + this.arcMenu.actor.style = null; + this.arcMenu.box.style = null; + this.arcMenu.sourceActor = this.oldSourceActor; + this.arcMenu.focusActor = this.oldFocusActor; + this.arcMenu._boxPointer.setPosition(this.oldSourceActor, this.oldArrowAlignment); + this.arcMenu.close(); + this.arcMenu._boxPointer.hide(); + Main.uiGroup.remove_child(this.dummyCursor); + this.dummyCursor.destroy(); + + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js new file mode 100644 index 0000000..d0cb17d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/redmond.js @@ -0,0 +1,229 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 10, + RowSpacing: 10, + DefaultMenuWidth: 450, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 10px 5px 10px;"; + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP) + this.subMainBox.add_child(this.searchBox.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.subMainBox.add_child(this.applicationsScrollBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.subMainBox.add_child(this.searchBox.actor); + } + + this.rightBox = new St.BoxLayout({ + y_align: Clutter.ActorAlign.FILL, + y_expand: true, + vertical: true, + style_class: 'right-panel margin-box' + }); + + this.placesShortcuts = false; + this.externalDevicesShorctus = false; + this.networkDevicesShorctus = false; + this.bookmarksShorctus = false; + this.softwareShortcuts = false; + + if(!this._settings.get_boolean('disable-user-avatar')){ + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.rightBox.add_child(this.user.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.rightBox.add_child(separator); + } + + this.shortcutsBox = new St.BoxLayout({ + vertical: true + }); + + this.shortcutsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.rightBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //draw bottom right horizontal separator + logic to determine if should show + let shouldDraw = false; + if(this._settings.get_value('directory-shortcuts-list').deep_unpack().length>0){ + this.placesShortcuts=true; + } + if(this._settings.get_value('application-shortcuts-list').deep_unpack().length>0){ + this.softwareShortcuts = true; + } + + //check to see if should draw separator + if(this.placesShortcuts && (this._settings.get_boolean('show-external-devices') || this.softwareShortcuts || this._settings.get_boolean('show-bookmarks')) ) + shouldDraw=true; + if(shouldDraw){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.SHORT, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //External Devices and Bookmarks Shortcuts + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this.shortcutsBox.add_child(this.externalDevicesBox); + + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + //create new section for Power, Lock, Logout, Suspend Buttons + this.actionsBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_expand: true, + y_align: Clutter.ActorAlign.END, + style: "spacing: 6px;" + }); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + this.rightBox.add_child(this.actionsBox); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.mainBox.add_child(horizonalFlip ? this.rightBox : this.subMainBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.mainBox.add_child(verticalSeparator); + this.mainBox.add_child(horizonalFlip ? this.subMainBox: this.rightBox); + horizonalFlip ? this.rightBox.style += "margin-right: 0px" : this.rightBox.style += "margin-left: 0px" + + this.updateWidth(); + this.loadCategories(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayAllApps(); + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + super.loadCategories(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js new file mode 100644 index 0000000..7386301 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/runner.js @@ -0,0 +1,208 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PanelMenu = imports.ui.panelMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton, isStandalone) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + StandaloneRunner: isStandalone + }); + } + + createLayout(){ + super.createLayout(); + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.updateLocation(); + + //store old ArcMenu variables + this.oldSourceActor = this.arcMenu.sourceActor; + this.oldFocusActor = this.arcMenu.focusActor; + this.oldArrowAlignment = this.arcMenu.actor._arrowAlignment; + + this.arcMenu.sourceActor = this.dummyCursor; + this.arcMenu.focusActor = this.dummyCursor; + this.arcMenu._boxPointer.setPosition(this.dummyCursor, 0.5); + + this.topBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: false, + style: "margin: 5px 0px 0px 0px;" + }); + + this.searchBox.style = "margin: 0px 0px 0px 16px;"; + this.runnerTweaksButton = new MW.RunnerTweaksButton(this); + this.runnerTweaksButton.actor.x_expand = false; + this.runnerTweaksButton.actor.y_expand = true; + this.runnerTweaksButton.actor.y_align = this.searchBox.y_align = Clutter.ActorAlign.CENTER; + this.runnerTweaksButton.actor.x_align = Clutter.ActorAlign.CENTER; + this.runnerTweaksButton.actor.style = "margin: 0px 6px;"; + + this.topBox.add_child(this.searchBox.actor); + this.topBox.add_child(this.runnerTweaksButton); + this.mainBox.add_child(this.topBox); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + x_align: Clutter.ActorAlign.START, + overlay_scrollbars: false, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + reactive:true + }); + + this.mainBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style: "margin: 5px 6px 0px 16px;" + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.activeMenuItem = null; + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + this.activeMenuItem = null; + super.setDefaultMenuView(); + if(this._settings.get_boolean("runner-show-frequent-apps")) + this.displayFrequentApps(); + } + + displayFrequentApps(){ + let labelRow = this.createLabelRow(_("Frequent Apps")); + this.applicationsBox.add_child(labelRow); + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + let appList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + appList.push(item); + } + } + let activeMenuItemSet = false; + for (let i = 0; i < appList.length; i++) { + let item = appList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_actor(item.actor); + if(!activeMenuItemSet){ + activeMenuItemSet = true; + this.activeMenuItem = item; + } + } + } + + /** + * if button is hidden, menu should appear on current monitor, unless preference is to always show on primary monitor + * @returns index of monitor where menu should appear + */ + _getMonitorIndexForPlacement() { + if (this.layoutProperties.StandaloneRunner) { + return this._settings.get_boolean('runner-hotkey-open-primary-monitor') ? Main.layoutManager.primaryMonitor.index : Main.layoutManager.currentMonitor.index; + } + else if (this._settings.get_enum('menu-button-appearance') === Constants.MenuButtonAppearance.NONE) + return this._settings.get_boolean('hotkey-open-primary-monitor') ? Main.layoutManager.primaryMonitor.index : Main.layoutManager.currentMonitor.index; + else + return Main.layoutManager.findIndexForActor(this.menuButton); + } + + updateLocation(){ + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px;"; + this.arcMenu._boxPointer.setSourceAlignment(0.5); + this.arcMenu._arrowAlignment = 0.5; + + let rect = Main.layoutManager.getWorkAreaForMonitor(this._getMonitorIndexForPlacement()); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY = rect.y + (this._settings.get_boolean('runner-use-theme-gap') ? this.rise : 0); + if(this._settings.get_enum('runner-position') == 1) + positionY = Math.round(rect.y + (rect.height / 2) - 125); + this.dummyCursor.set_position(positionX, positionY); + + if(!this.topBox) + return; + + this._runnerWidth = this._settings.get_int("runner-menu-width"); + this._runnerHeight = this._settings.get_int("runner-menu-height"); + this._runnerFontSize = this._settings.get_int("runner-font-size"); + this.mainBox.style = `max-height: ${this._runnerHeight}px;`; + if(this._runnerFontSize > 0){ + this.mainBox.style += `font-size: ${this._runnerFontSize}pt;` + this.searchBox.style += `font-size: ${this._runnerFontSize}pt;` + } + else{ + this.searchBox.style = "margin: 0px 0px 0px 16px;"; + } + this.topBox.style = `width: ${this._runnerWidth}px; margin: 5px 0px 0px 0px;`; + this.applicationsScrollBox.style = `width: ${this._runnerWidth}px;`; + } + + updateStyle(){ + super.updateStyle(); + this.arcMenu.actor.style = "-arrow-base:0px; -arrow-rise:0px;"; + } + + loadCategories(){ + } + + destroy(){ + this.arcMenu.actor.style = null; + this.arcMenu.sourceActor = this.oldSourceActor; + this.arcMenu.focusActor = this.oldFocusActor; + this.arcMenu._boxPointer.setPosition(this.oldSourceActor, this.oldArrowAlignment); + Main.uiGroup.remove_child(this.dummyCursor); + this.dummyCursor.destroy(); + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js new file mode 100644 index 0000000..0e971e4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple.js @@ -0,0 +1,159 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GMenu, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.mainBox.style = null; + this.mainBox.style_class = 'margin-box'; + this.section = this.menuButton.section; + let actors = this.section.actor.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + this.section.actor.remove_child(actor); + } + this.section.actor.add_child(this.mainBox); + + this.loadPinnedApps(); + this.loadCategories(); + this._display(); + } + + setDefaultMenuView(){ + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + _display() { + this.displayCategories(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + updateStyle(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem.updateStyle(); + } + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.SimpleMenuItem(this, categoryEnum); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.SIMPLE_CATEGORY); + } + + displayCategories(){ + super.displayCategories(this.mainBox); + } + + displayPinnedApps() { + this._clearActorsFromBox(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, categoryMenuItem); + } + } + + _clearActorsFromBox(box) { + let parent = this.applicationsGrid.get_parent(); + if(!parent) + return; + let scrollViewParent = parent.get_parent(); + + if(scrollViewParent && scrollViewParent instanceof St.ScrollView){ + let scrollBoxAdj = scrollViewParent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = parent.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + parent.remove_child(actor); + } + } + + displayCategoryAppList(appList, category, categoryMenuItem){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, categoryMenuItem); + } + + displayRecentFiles(){ + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + let children = categoryMenuItem.applicationsBox.get_children(); + for (let i = 0; i < children.length; i++) { + let actor = children[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + categoryMenuItem.applicationsBox.remove_child(actor); + } + super.displayRecentFiles(categoryMenuItem.applicationsBox); + } + + _displayAppList(apps, category, categoryMenuItem) { + super._displayAppList(apps, category, this.applicationsGrid); + if(!categoryMenuItem.applicationsBox.contains(this.applicationsGrid)) + categoryMenuItem.applicationsBox.add_child(this.applicationsGrid); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js new file mode 100644 index 0000000..ec5b2cf --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/simple2.js @@ -0,0 +1,179 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, St} = imports.gi; +const AppFavorites = imports.ui.appFavorites; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: false, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + this.mainBox.style = null; + this.mainBox.style_class = 'margin-box'; + this.loadPinnedApps(); + this.loadCategories(); + this._display(); + this.arcMenu.actor.style = 'max-height: ' + (this.arcMenu.actor.height + 250) + 'px;'; + } + + setDefaultMenuView(){ + this.activeMenuItem = this.categoryDirectories.values().next().value; + let actors = this.mainBox.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + } + } + + _display() { + this.displayCategories(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategorySubMenuItem(this, categoryEnum); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(Constants.DisplayType.SUBMENU_CATEGORY); + + for(let categoryMenuItem of this.categoryDirectories.values()){ + categoryMenuItem._setParent(this.arcMenu); + categoryMenuItem.isSimpleMenuItem = true; + } + } + + displayCategories(){ + this._clearActorsFromBox(); + let isActiveMenuItemSet = false; + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.arcMenu.addMenuItem(categoryMenuItem); + if(!isActiveMenuItemSet){ + isActiveMenuItemSet = true; + this.activeMenuItem = categoryMenuItem; + } + } + } + + _clearActorsFromBox(box) { + let parent = this.applicationsGrid.get_parent(); + if(!parent) + return; + let scrollViewParent = parent.get_parent(); + + if(scrollViewParent && scrollViewParent instanceof St.ScrollView){ + let scrollBoxAdj = scrollViewParent.get_vscroll_bar().get_adjustment(); + scrollBoxAdj.set_value(0); + } + let actors = parent.get_children(); + for (let i = 0; i < actors.length; i++) { + let actor = actors[i]; + if(actor instanceof St.Widget && actor.layout_manager instanceof Clutter.GridLayout){ + actor.get_children().forEach(gridChild => { + if(gridChild instanceof MW.CategorySubMenuItem) + gridChild.menu.close(); + }); + } + parent.remove_child(actor); + } + super._clearActorsFromBox(this.mainBox); + } + + displayCategoryAppList(appList, category, categoryMenuItem){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, categoryMenuItem); + } + + displayRecentFiles(){ + this._clearActorsFromBox(); + this.applicationsGrid.remove_all_children(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.RECENT_FILES); + + let children = categoryMenuItem.menu.box.get_children(); + for (let i = 0; i < children.length; i++) { + let actor = children[i]; + if(actor._delegate instanceof MW.CategorySubMenuItem) + actor._delegate.menu.close(); + categoryMenuItem.menu.box.remove_child(actor); + } + super.displayRecentFiles(categoryMenuItem.menu.box, () => categoryMenuItem._needsScrollbar()); + if(!categoryMenuItem.menu.box.contains(this.applicationsGrid)) + categoryMenuItem.menu.box.add_child(this.applicationsGrid); + + } + + displayPinnedApps() { + this._clearActorsFromBox(); + let categoryMenuItem = this.categoryDirectories.get(Constants.CategoryType.PINNED_APPS); + if(categoryMenuItem){ + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, categoryMenuItem); + } + } + + _displayAppList(apps, category, categoryMenuItem) { + super._displayAppList(apps, category, this.applicationsGrid); + let box = categoryMenuItem.menu.box; + if(!box.contains(this.applicationsGrid)) + box.add_child(this.applicationsGrid); + } + + destroy(){ + this.arcMenu.actor.style = null; + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js new file mode 100644 index 0000000..9d279ee --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tognee.js @@ -0,0 +1,290 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * tognee Layout Created By: tognee https://gitlab.com/tognee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 290, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + + this.searchBox.name = "ArcSearchEntryRound"; + + //subMainBox stores left and right box + this.subMainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + // The "Left Box" + // Contains the app list and the searchbar + this.appBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + vertical: true, + y_align: Clutter.ActorAlign.FILL, + }); + + //Applications Box - Contains Favorites, Categories or programs + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true, + reactive:true + }); + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 0px 10px 10px 10px;"; + this.appBox.add_child(this.searchBox.actor); + } + this.appBox.add_child(this.applicationsScrollBox); + this.applicationsBox = new St.BoxLayout({ vertical: true }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + + this.navigateBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.END + }); + this.backButton = new MW.BackMenuItem(this); + this.navigateBox.add_child(new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL)); + this.navigateBox.add_child(this.backButton.actor); + this.appBox.add_child(this.navigateBox); + if(this._settings.get_enum('searchbar-default-bottom-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.appBox.add_child(this.searchBox.actor); + } + + // The "Right Box" + // Contains some useful shortcuts + this.quickBox = new St.BoxLayout({ + vertical: true, + style: "margin: 0px 1px;", + y_expand: true, + y_align: Clutter.ActorAlign.FILL + }); + + this.subMainBox.add_child(horizonalFlip ? this.appBox : this.quickBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.quickBox : this.appBox); + + this.placesShortcuts= this._settings.get_value('directory-shortcuts-list').deep_unpack().length>0; + this.softwareShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack().length>0; + + this.shortcutsBox = new St.BoxLayout({ + vertical: true, + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + style: "spacing: 5px; padding-bottom: 5px;" + }); + + this.shortcutsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + }); + this.shortcutsScrollBox.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.EXTERNAL); + this.shortcutsScrollBox.add_actor(this.shortcutsBox); + this.quickBox.add_child(this.shortcutsScrollBox); + + // Add place shortcuts to menu (Home,Documents,Downloads,Music,Pictures,Videos) + this._displayPlaces(); + + //check to see if should draw separator + if(this.placesShortcuts && this.softwareShortcuts){ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.LONG, Constants.SeparatorAlignment.HORIZONTAL); + this.shortcutsBox.add_child(separator); + } + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let isContainedInCategory = false; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.BUTTON, isContainedInCategory); + if(shortcutMenuItem.shouldShow) + this.shortcutsBox.add_child(shortcutMenuItem.actor); + } + + // Bottom Section for Power etc... + this.actionsScrollBox = new St.ScrollView({ + x_expand: true, + y_expand: false, + y_align: Clutter.ActorAlign.END, + x_align: Clutter.ActorAlign.CENTER + }); + this.actionsScrollBox.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.EXTERNAL); + this.actionsScrollBox.clip_to_allocation = true; + + //create new section for Leave Button + this.actionsBox = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.CENTER, + style: "spacing: 3px;" + }); + this.actionsScrollBox.add_actor(this.actionsBox); + + let leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(leaveButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.LONG, Constants.SeparatorAlignment.HORIZONTAL); + this.actionsBox.insert_child_at_index(separator, 0); + this.quickBox.add_child(this.actionsScrollBox); + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 175px minimum limit for the menu width + menuWidth = Math.max(175, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _displayPlaces() { + let directoryShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + for (let i = 0; i < directoryShortcuts.length; i++) { + let directory = directoryShortcuts[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.BUTTON, isContainedInCategory); + this.shortcutsBox.add_child(placeMenuItem.actor); + } + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayPinnedApps(){ + super.displayPinnedApps(); + this.activeCategoryType = Constants.CategoryType.PINNED_APPS; + this.navigateBox.show(); + } + + displayAllApps(){ + this.navigateBox.hide(); + super.displayAllApps() + } + + displayCategories(){ + super.displayCategories(); + this.activeCategoryType = Constants.CategoryType.CATEGORIES_LIST; + this.navigateBox.hide(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let defaultMenuView = this._settings.get_enum('default-menu-view-tognee'); + + if(defaultMenuView === Constants.DefaultMenuViewTognee.CATEGORIES_LIST) + this.displayCategories(); + else if(defaultMenuView === Constants.DefaultMenuViewTognee.ALL_PROGRAMS) + this.displayAllApps(); + } + + displayCategoryAppList(appList, category){ + super.displayCategoryAppList(appList, category); + this.navigateBox.show(); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.navigateBox.show(); + } + + _onSearchBoxChanged(searchBox, searchString){ + super._onSearchBoxChanged(searchBox, searchString); + if(searchBox.isEmpty()){ + this.navigateBox.hide(); + } + else if(!searchBox.isEmpty()){ + this.navigateBox.show(); + this.activeCategoryType = Constants.CategoryType.SEARCH_RESULTS; + } + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js new file mode 100644 index 0000000..290a169 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/tweaks/tweaks.js @@ -0,0 +1,1286 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Prefs = Me.imports.prefs; +const PW = Me.imports.prefsWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var TweaksPage = GObject.registerClass({ + Signals: { + 'response': { param_types: [GObject.TYPE_INT] }, + }, +}, class Arc_Menu_TweaksPage extends Gtk.Box { + _init(settings, layoutName) { + this._settings = settings; + this.addResponse = false; + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.layoutNameLabel = new Gtk.Label({ + label: "" + _(layoutName) + "", + use_markup: true, + xalign: 0, + hexpand: true, + halign: Gtk.Align.CENTER + }) + + let backButton = new PW.Button({ + icon_name: 'go-previous-symbolic', + title: _("Back"), + icon_first: true, + }); + backButton.halign = Gtk.Align.START; + backButton.connect('clicked', ()=> { + this.emit('response', -20); + }); + this.headerBox = new Gtk.Grid({ + hexpand: true, + halign: Gtk.Align.FILL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + }); + + this.headerBox.attach(backButton, 0, 0, 1, 1); + this.headerBox.attach(this.layoutNameLabel, 0, 0, 1, 1); + this.mainScrollWindow = new Gtk.ScrolledWindow(); + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.append(this.headerBox); + this.mainScrollWindow.set_child(this.mainBox); + this.mainScrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.append(this.mainScrollWindow); + this._createLayout(); + } + + setActiveLayout(menuLayout, layoutName){ + if(layoutName) + this.layoutNameLabel.label = "" + _(layoutName) + ""; + let children = [...this.mainBox]; + for(let child of children){ + this.mainBox.remove(child); + } + this._createLayout(menuLayout); + } + + _createLayout(menuLayout) { + if(!menuLayout) + menuLayout = this._settings.get_enum('menu-layout'); + + if(menuLayout == Constants.MenuLayout.ARCMENU) + this._loadArcMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.BRISK) + this._loadBriskMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.WHISKER) + this._loadWhiskerMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.GNOME_MENU) + this._loadGnomeMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.MINT) + this._loadMintMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.ELEMENTARY) + this._loadElementaryTweaks(); + else if(menuLayout == Constants.MenuLayout.GNOME_OVERVIEW) + this._loadGnomeOverviewTweaks(); + else if(menuLayout == Constants.MenuLayout.SIMPLE) + this._loadPlaceHolderTweaks(); + else if(menuLayout == Constants.MenuLayout.SIMPLE_2) + this._loadPlaceHolderTweaks(); + else if(menuLayout == Constants.MenuLayout.REDMOND) + this._loadRedmondMenuTweaks() + else if(menuLayout == Constants.MenuLayout.UNITY) + this._loadUnityTweaks(); + else if(menuLayout == Constants.MenuLayout.RAVEN) + this._loadRavenTweaks(); + else if(menuLayout == Constants.MenuLayout.BUDGIE) + this._loadBudgieMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.INSIDER) + this._loadInsiderMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.RUNNER) + this._loadRunnerMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.CHROMEBOOK) + this._loadChromebookTweaks(); + else if(menuLayout == Constants.MenuLayout.TOGNEE) + this._loadTogneeMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.PLASMA) + this._loadPlasmaMenuTweaks(); + else if(menuLayout == Constants.MenuLayout.WINDOWS) + this._loadWindowsTweaks(); + else if(menuLayout == Constants.MenuLayout.ELEVEN) + this._loadElevenTweaks(); + else + this._loadPlaceHolderTweaks(); + } + + _createActivateOnHoverRow(){ + let activateOnHoverRow = new PW.FrameBoxRow(); + let activateOnHoverLabel = new Gtk.Label({ + label: _("Category Activation"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let activateOnHoverCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + activateOnHoverCombo.append_text(_("Mouse Click")); + activateOnHoverCombo.append_text(_("Mouse Hover")); + if(this._settings.get_boolean('activate-on-hover')) + activateOnHoverCombo.set_active(1); + else + activateOnHoverCombo.set_active(0); + activateOnHoverCombo.connect('changed', (widget) => { + if(widget.get_active()==0) + this._settings.set_boolean('activate-on-hover',false); + if(widget.get_active()==1) + this._settings.set_boolean('activate-on-hover',true); + }); + + activateOnHoverRow.add(activateOnHoverLabel); + activateOnHoverRow.add(activateOnHoverCombo); + return activateOnHoverRow; + } + _createAvatarShapeRow(){ + let avatarStyleRow = new PW.FrameBoxRow(); + let avatarStyleLabel = new Gtk.Label({ + label: _('Avatar Icon Shape'), + xalign:0, + hexpand: true, + }); + let avatarStyleCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + avatarStyleCombo.append_text(_("Circular")); + avatarStyleCombo.append_text(_("Square")); + avatarStyleCombo.set_active(this._settings.get_enum('avatar-style')); + avatarStyleCombo.connect('changed', (widget) => { + this._settings.set_enum('avatar-style', widget.get_active()); + this._settings.set_boolean('reload-theme', true); + }); + avatarStyleRow.add(avatarStyleLabel); + avatarStyleRow.add(avatarStyleCombo); + return avatarStyleRow; + } + _createSearchBarLocationRow(bottomDefault){ + let searchBarLocationSetting = bottomDefault ? 'searchbar-default-bottom-location' : 'searchbar-default-top-location'; + + let searchbarLocationRow = new PW.FrameBoxRow(); + let searchbarLocationLabel = new Gtk.Label({ + label: _("Searchbar Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let searchbarLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + searchbarLocationCombo.append_text(_("Bottom")); + searchbarLocationCombo.append_text(_("Top")); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting )); + searchbarLocationCombo.connect('changed', (widget) => { + this._settings.set_enum(searchBarLocationSetting , widget.get_active()); + }); + + searchbarLocationRow.add(searchbarLocationLabel); + searchbarLocationRow.add(searchbarLocationCombo); + return searchbarLocationRow; + } + _createFlipHorizontalRow(){ + let horizontalFlipRow = new PW.FrameBoxRow(); + let horizontalFlipLabel = new Gtk.Label({ + label: _("Flip Layout Horizontally"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let horizontalFlipSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + horizontalFlipSwitch.set_active(this._settings.get_boolean('enable-horizontal-flip')); + horizontalFlipSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-horizontal-flip', widget.get_active()); + }); + horizontalFlipRow.add(horizontalFlipLabel); + horizontalFlipRow.add(horizontalFlipSwitch); + return horizontalFlipRow; + } + _disableAvatarRow(){ + let disableAvatarRow = new PW.FrameBoxRow(); + let disableAvatarLabel = new Gtk.Label({ + label: _('Disable User Avatar'), + xalign:0, + hexpand: true, + }); + let disableAvatarSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + disableAvatarSwitch.set_active(this._settings.get_boolean('disable-user-avatar')); + disableAvatarSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('disable-user-avatar', widget.get_active()); + }); + disableAvatarRow.add(disableAvatarLabel); + disableAvatarRow.add(disableAvatarSwitch); + return disableAvatarRow; + } + + _loadElevenTweaks(){ + let elevenTweaksFrame = new PW.FrameBox(); + let disableFrequentAppsRow = new PW.FrameBoxRow(); + let disableFrequentAppsLabel = new Gtk.Label({ + label: _("Disable Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let disableFrequentAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + disableFrequentAppsSwitch.set_active(this._settings.get_boolean('eleven-disable-frequent-apps')); + disableFrequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('eleven-disable-frequent-apps', widget.get_active()); + }); + disableFrequentAppsRow.add(disableFrequentAppsLabel); + disableFrequentAppsRow.add(disableFrequentAppsSwitch); + elevenTweaksFrame.add(disableFrequentAppsRow); + this.mainBox.append(elevenTweaksFrame); + } + + _loadGnomeOverviewTweaks(){ + let gnomeOverviewTweaksFrame = new PW.FrameBox(); + let appsGridRow = new PW.FrameBoxRow(); + let appsGridLabel = new Gtk.Label({ + label: _("Show Applications Grid"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let appsGridSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + appsGridSwitch.set_active(this._settings.get_boolean('gnome-dash-show-applications')); + appsGridSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('gnome-dash-show-applications', widget.get_active()); + }); + appsGridRow.add(appsGridLabel); + appsGridRow.add(appsGridSwitch); + gnomeOverviewTweaksFrame.add(appsGridRow); + this.mainBox.append(gnomeOverviewTweaksFrame); + } + + _loadWindowsTweaks(){ + let windowsTweaksFrame = new PW.FrameBox(); + let frequentAppsRow = new PW.FrameBoxRow(); + let frequentAppsLabel = new Gtk.Label({ + label: _("Disable Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let frequentAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + frequentAppsSwitch.set_active(this._settings.get_boolean('windows-disable-frequent-apps')); + frequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('windows-disable-frequent-apps', widget.get_active()); + }); + frequentAppsRow.add(frequentAppsLabel); + frequentAppsRow.add(frequentAppsSwitch); + windowsTweaksFrame.add(frequentAppsRow); + + let pinnedAppsRow = new PW.FrameBoxRow(); + let pinnedAppsLabel = new Gtk.Label({ + label: _("Disable Pinned Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let pinnedAppsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + pinnedAppsSwitch.set_active(this._settings.get_boolean('windows-disable-pinned-apps')); + pinnedAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('windows-disable-pinned-apps', widget.get_active()); + }); + pinnedAppsRow.add(pinnedAppsLabel); + pinnedAppsRow.add(pinnedAppsSwitch); + windowsTweaksFrame.add(pinnedAppsRow); + + this.mainBox.append(windowsTweaksFrame); + } + + _loadPlasmaMenuTweaks(){ + let plasmaMenuTweaksFrame = new PW.FrameBox(); + + let searchBarLocationSetting = 'searchbar-default-top-location'; + + let searchbarLocationRow = new PW.FrameBoxRow(); + let searchbarLocationLabel = new Gtk.Label({ + label: _("Searchbar Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let searchbarLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + searchbarLocationCombo.append_text(_("Bottom")); + searchbarLocationCombo.append_text(_("Top")); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting)); + searchbarLocationCombo.connect('changed', (widget) => { + this._settings.set_enum(searchBarLocationSetting , widget.get_active()); + }); + + searchbarLocationRow.add(searchbarLocationLabel); + searchbarLocationRow.add(searchbarLocationCombo); + plasmaMenuTweaksFrame.add(searchbarLocationRow); + + let hoverRow = new PW.FrameBoxRow(); + let hoverLabel = new Gtk.Label({ + label: _("Activate on Hover"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hoverSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + hoverSwitch.set_active(this._settings.get_boolean('plasma-enable-hover')); + hoverSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('plasma-enable-hover', widget.get_active()); + }); + hoverRow.add(hoverLabel); + hoverRow.add(hoverSwitch); + plasmaMenuTweaksFrame.add(hoverRow); + + let foregroundColorRow = new PW.FrameBoxRow(); + let foregroundColorLabel = new Gtk.Label({ + label: _('Selected Button Border Color'), + xalign:0, + hexpand: true, + }); + let foregroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + let color = new Gdk.RGBA(); + color.parse(this._settings.get_string('plasma-selected-color')); + foregroundColorChooser.set_rgba(color); + foregroundColorChooser.connect('color-set', ()=>{ + this._settings.set_string('plasma-selected-color', foregroundColorChooser.get_rgba().to_string()); + this._settings.set_boolean('reload-theme', true); + }); + foregroundColorRow.add(foregroundColorLabel); + foregroundColorRow.add(foregroundColorChooser); + plasmaMenuTweaksFrame.add(foregroundColorRow); + + let backgroundColorRow = new PW.FrameBoxRow(); + let backgroundColorLabel = new Gtk.Label({ + label: _('Selected Button Background Color'), + xalign:0, + hexpand: true, + }); + let backgroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this._settings.get_string('plasma-selected-background-color')); + backgroundColorChooser.set_rgba(color); + backgroundColorChooser.connect('color-set', ()=>{ + this._settings.set_string('plasma-selected-background-color',backgroundColorChooser.get_rgba().to_string()); + this._settings.set_boolean('reload-theme', true); + }); + backgroundColorRow.add(backgroundColorLabel); + backgroundColorRow.add(backgroundColorChooser); + plasmaMenuTweaksFrame.add(backgroundColorRow); + + this.mainBox.append(plasmaMenuTweaksFrame); + + let resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + halign: Gtk.Align.START, + hexpand: true + }); + resetButton.set_sensitive(true); + resetButton.connect('clicked', ()=> { + let foregroundColor = this._settings.get_default_value('plasma-selected-color').unpack(); + let backgroundColor = this._settings.get_default_value('plasma-selected-background-color').unpack(); + let hoverEnabled = this._settings.get_default_value('plasma-enable-hover').unpack(); + let showDescriptions = this._settings.get_default_value('apps-show-extra-details').unpack(); + this._settings.reset('searchbar-default-top-location'); + searchbarLocationCombo.set_active(this._settings.get_enum(searchBarLocationSetting)); + hoverSwitch.set_active(hoverEnabled); + color.parse(foregroundColor); + foregroundColorChooser.set_rgba(color); + color.parse(backgroundColor); + backgroundColorChooser.set_rgba(color); + descriptionsSwitch.set_active(showDescriptions); + this._settings.reset('plasma-selected-color'); + this._settings.reset('plasma-selected-background-color'); + this._settings.reset('plasma-enable-hover'); + this._settings.reset('apps-show-extra-details'); + this._settings.set_boolean('reload-theme', true); + }); + this.mainBox.append(resetButton); + } + _loadBriskMenuTweaks(){ + let briskMenuTweaksFrame = new PW.FrameBox(); + briskMenuTweaksFrame.add(this._createActivateOnHoverRow()); + briskMenuTweaksFrame.add(this._createSearchBarLocationRow()); + briskMenuTweaksFrame.add(this._createFlipHorizontalRow()); + let pinnedAppsFrame = new PW.FrameBox(); + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow(); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_max_content_height(100); + pinnedAppsScrollWindow.set_min_content_height(100); + + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('brisk-shortcuts-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('brisk-shortcuts-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Brisk Menu Shortcuts") + "", + use_markup: true, + xalign: 0 + }); + + this.mainBox.append(briskMenuTweaksFrame); + this.mainBox.append(pinnedAppsHeaderLabel); + this.mainBox.append(pinnedAppsScrollWindow); + this.mainBox.append(savePinnedAppsButton); + } + _loadChromebookTweaks(){ + let chromeBookTweaksFrame = new PW.FrameBox(); + chromeBookTweaksFrame.add(this._createSearchBarLocationRow()); + this.mainBox.append(chromeBookTweaksFrame); + } + _loadElementaryTweaks(){ + let elementaryTweaksFrame = new PW.FrameBox(); + elementaryTweaksFrame.add(this._createSearchBarLocationRow()); + this.mainBox.append(elementaryTweaksFrame); + } + _loadBudgieMenuTweaks(){ + let budgieMenuTweaksFrame = new PW.FrameBox(); + budgieMenuTweaksFrame.add(this._createActivateOnHoverRow()); + budgieMenuTweaksFrame.add(this._createSearchBarLocationRow()); + budgieMenuTweaksFrame.add(this._createFlipHorizontalRow()); + + let enableActivitiesRow = new PW.FrameBoxRow(); + let enableActivitiesLabel = new Gtk.Label({ + label: _('Enable Activities Overview Shortcut'), + xalign:0, + hexpand: true, + }); + let enableActivitiesSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + enableActivitiesSwitch.set_active(this._settings.get_boolean('enable-activities-shortcut')); + enableActivitiesSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-activities-shortcut', widget.get_active()); + }); + enableActivitiesRow.add(enableActivitiesLabel); + enableActivitiesRow.add(enableActivitiesSwitch); + budgieMenuTweaksFrame.add(enableActivitiesRow); + + this.mainBox.append(budgieMenuTweaksFrame); + } + _loadRunnerMenuTweaks(){ + let runnerMenuTweaksFrame = new PW.FrameBox(); + let runnerPositionRow = new PW.FrameBoxRow(); + let runnerPositionLabel = new Gtk.Label({ + label: _('Position'), + xalign:0, + hexpand: true, + }); + let runnerPositionCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + runnerPositionCombo.append_text(_("Top")); + runnerPositionCombo.append_text(_("Centered")); + runnerPositionCombo.set_active(this._settings.get_enum('runner-position')); + runnerPositionCombo.connect('changed', (widget) => { + this._settings.set_enum('runner-position', widget.get_active()); + }); + runnerPositionRow.add(runnerPositionLabel); + runnerPositionRow.add(runnerPositionCombo); + runnerMenuTweaksFrame.add(runnerPositionRow); + + let runnerWidthRow = new PW.FrameBoxRow(); + let runnerWidthLabel = new Gtk.Label({ + label: _("Width"), + use_markup: true, + hexpand: true, + xalign: 0 + }); + let runnerWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: 1000, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + runnerWidthScale.add_mark(500, Gtk.PositionType.TOP, _("Default")); + runnerWidthScale.set_value(this._settings.get_int('runner-menu-width')); + runnerWidthScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-menu-width', widget.get_value()); + }); + runnerWidthRow.add(runnerWidthLabel); + runnerWidthRow.add(runnerWidthScale); + runnerMenuTweaksFrame.add(runnerWidthRow); + + let runnerHeightRow = new PW.FrameBoxRow(); + let runnerHeightLabel = new Gtk.Label({ + label: _("Height"), + use_markup: true, + hexpand: true, + xalign: 0 + }); + let runnerHeightScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: 1000, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + runnerHeightScale.add_mark(400, Gtk.PositionType.TOP, _("Default")); + runnerHeightScale.set_value(this._settings.get_int('runner-menu-height')); + runnerHeightScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-menu-height', widget.get_value()); + }); + + runnerHeightRow.add(runnerHeightLabel); + runnerHeightRow.add(runnerHeightScale); + runnerMenuTweaksFrame.add(runnerHeightRow); + + let runnerFontSizeRow = new PW.FrameBoxRow(); + let runnerFontSizeLabel = new Gtk.Label({ + label: _("Font Size"), + hexpand: true, + use_markup: true, + xalign: 0 + }); + let runnerFontSizeScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 30, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + + runnerFontSizeScale.add_mark(0, Gtk.PositionType.TOP, _("Default")); + runnerFontSizeScale.set_value(this._settings.get_int('runner-font-size')); + runnerFontSizeScale.connect('value-changed', (widget) => { + this._settings.set_int('runner-font-size', widget.get_value()); + }); + runnerFontSizeRow.add(runnerFontSizeLabel); + runnerFontSizeRow.add(runnerFontSizeScale); + runnerMenuTweaksFrame.add(runnerFontSizeRow); + + let frequentAppsRow = new PW.FrameBoxRow(); + let frequentAppsLabel = new Gtk.Label({ + label: _("Show Frequent Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let frequentAppsSwitch = new Gtk.Switch(); + if(this._settings.get_boolean('runner-show-frequent-apps')) + frequentAppsSwitch.set_active(true); + frequentAppsSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('runner-show-frequent-apps', widget.get_active()); + }); + frequentAppsRow.add(frequentAppsLabel); + frequentAppsRow.add(frequentAppsSwitch); + runnerMenuTweaksFrame.add(frequentAppsRow); + + let inheritThemeGapRow = new PW.FrameBoxRow(); + let inheritThemeGapLabel = new Gtk.Label({ + label: _("Inherit Shell Theme Popup Gap"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let inheritThemeGapSwitch = new Gtk.Switch(); + if(this._settings.get_boolean('runner-use-theme-gap')) + inheritThemeGapSwitch.set_active(true); + inheritThemeGapSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('runner-use-theme-gap', widget.get_active()); + }); + inheritThemeGapRow.add(inheritThemeGapLabel); + inheritThemeGapRow.add(inheritThemeGapSwitch); + runnerMenuTweaksFrame.add(inheritThemeGapRow); + + this.mainBox.append(runnerMenuTweaksFrame); + } + _loadUnityTweaks(){ + let pinnedAppsFrame = new PW.FrameBox(); + let generalTweaksFrame = new PW.FrameBox(); + let homeScreenRow = new PW.FrameBoxRow(); + let homeScreenLabel = new Gtk.Label({ + label: _('Default View'), + xalign:0, + hexpand: true, + }); + let homeScreenCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + homeScreenCombo.append_text(_("Home Screen")); + homeScreenCombo.append_text(_("All Programs")); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + homeScreenCombo.set_active(homeScreen ? 0 : 1); + homeScreenCombo.connect('changed', (widget) => { + let enable = widget.get_active() ==0 ? true : false; + this._settings.set_boolean('enable-unity-homescreen', enable); + }); + homeScreenRow.add(homeScreenLabel); + homeScreenRow.add(homeScreenCombo); + generalTweaksFrame.add(homeScreenRow); + this.mainBox.append(generalTweaksFrame); + + let widgetFrame = this._createWidgetsRows(Constants.MenuLayout.UNITY); + this.mainBox.append(widgetFrame); + + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + pinnedAppsScrollWindow.set_min_content_height(400); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('unity-pinned-app-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('unity-pinned-app-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Unity Layout Buttons") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsHeaderLabel); + this.mainBox.append(pinnedAppsScrollWindow); + this.mainBox.append(savePinnedAppsButton); + + let pinnedAppsSeparatorHeaderLabel = new Gtk.Label({ + label: "" + _("Button Separator Position") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsSeparatorHeaderLabel); + + let pinnedAppsSeparatorFrame = new PW.FrameBox(); + let pinnedAppsSeparatorRow = new PW.FrameBoxRow(); + let pinnedAppsSeparatorLabel = new Gtk.Label({ + label: _("Separator Position"), + use_markup: true, + xalign: 0 + }); + let pinnedAppsSeparatorScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 7, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true + }); + pinnedAppsSeparatorScale.add_mark(0, Gtk.PositionType.BOTTOM, _("None")); + pinnedAppsSeparatorScale.set_value(this._settings.get_int('unity-separator-index')); + pinnedAppsSeparatorScale.connect('value-changed', (widget) => { + this._settings.set_int('unity-separator-index', widget.get_value()); + }); + + let infoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + infoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _('Adjust the position of the separator in the button panel'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorLabel); + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorScale); + pinnedAppsSeparatorRow.add(infoButton); + pinnedAppsSeparatorFrame.add(pinnedAppsSeparatorRow); + this.mainBox.append(pinnedAppsSeparatorFrame); + } + _loadRavenTweaks(){ + let generalTweaksFrame = new PW.FrameBox(); + let homeScreenRow = new PW.FrameBoxRow(); + let homeScreenLabel = new Gtk.Label({ + label: _('Default View'), + xalign:0, + hexpand: true, + }); + let homeScreenCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + homeScreenCombo.append_text(_("Home Screen")); + homeScreenCombo.append_text(_("All Programs")); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + homeScreenCombo.set_active(homeScreen ? 0 : 1); + homeScreenCombo.connect('changed', (widget) => { + let enable = widget.get_active() ==0 ? true : false; + this._settings.set_boolean('enable-unity-homescreen', enable); + }); + homeScreenRow.add(homeScreenLabel); + homeScreenRow.add(homeScreenCombo); + generalTweaksFrame.add(homeScreenRow); + this.mainBox.append(generalTweaksFrame); + + let ravenPositionRow = new PW.FrameBoxRow(); + let ravenPositionLabel = new Gtk.Label({ + label: _('Position on Monitor'), + xalign:0, + hexpand: true, + }); + let ravenPositionCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + ravenPositionCombo.append_text(_("Left")); + ravenPositionCombo.append_text(_("Right")); + let ravenPosition = this._settings.get_enum('raven-position'); + ravenPositionCombo.set_active(ravenPosition); + ravenPositionCombo.connect('changed', (widget) => { + this._settings.set_enum('raven-position', widget.get_active()); + }); + ravenPositionRow.add(ravenPositionLabel); + ravenPositionRow.add(ravenPositionCombo); + generalTweaksFrame.add(ravenPositionRow); + generalTweaksFrame.add(this._createActivateOnHoverRow()); + let widgetFrame = this._createWidgetsRows(Constants.MenuLayout.RAVEN); + this.mainBox.append(widgetFrame); + } + _loadMintMenuTweaks(){ + let mintMenuTweaksFrame = new PW.FrameBox(); + mintMenuTweaksFrame.add(this._createActivateOnHoverRow()); + mintMenuTweaksFrame.add(this._createSearchBarLocationRow()); + mintMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(mintMenuTweaksFrame); + + let pinnedAppsHeaderLabel = new Gtk.Label({ + label: "" + _("Mint Layout Shortcuts") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsHeaderLabel); + + let pinnedAppsFrame = new PW.FrameBox(); + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow(); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_min_content_height(400); + let savePinnedAppsButton = new Gtk.Button({ + label: _("Save"), + }); + savePinnedAppsButton.connect('clicked', ()=> { + let array = []; + for(let x = 0;x < pinnedAppsFrame.count; x++) { + array.push(pinnedAppsFrame.get_index(x)._name); + array.push(pinnedAppsFrame.get_index(x)._icon); + array.push(pinnedAppsFrame.get_index(x)._cmd); + } + this._settings.set_strv('mint-pinned-app-list',array); + savePinnedAppsButton.set_sensitive(false); + }); + savePinnedAppsButton.set_halign(Gtk.Align.END); + savePinnedAppsButton.set_sensitive(false); + + this._loadPinnedApps(this._settings.get_strv('mint-pinned-app-list'), pinnedAppsFrame, savePinnedAppsButton, pinnedAppsScrollWindow); + pinnedAppsScrollWindow.set_child(pinnedAppsFrame); + this.mainBox.append(pinnedAppsScrollWindow); + + this.mainBox.append(savePinnedAppsButton); + + let pinnedAppsSeparatorHeaderLabel = new Gtk.Label({ + label: "" + _("Shortcut Separator Position") + "", + use_markup: true, + xalign: 0 + }); + this.mainBox.append(pinnedAppsSeparatorHeaderLabel); + + let pinnedAppsSeparatorFrame = new PW.FrameBox(); + let pinnedAppsSeparatorRow = new PW.FrameBoxRow(); + let pinnedAppsSeparatorLabel = new Gtk.Label({ + label: _("Separator Position"), + use_markup: true, + xalign: 0 + }); + let pinnedAppsSeparatorScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 7, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + }); + pinnedAppsSeparatorScale.add_mark(0, Gtk.PositionType.BOTTOM, _("None")); + pinnedAppsSeparatorScale.set_value(this._settings.get_int('mint-separator-index')); + pinnedAppsSeparatorScale.connect('value-changed', (widget) => { + this._settings.set_int('mint-separator-index', widget.get_value()); + }); + + let infoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + infoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _('Adjust the position of the separator in the button panel'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorLabel); + pinnedAppsSeparatorRow.add(pinnedAppsSeparatorScale); + pinnedAppsSeparatorRow.add(infoButton); + pinnedAppsSeparatorFrame.add(pinnedAppsSeparatorRow); + this.mainBox.append(pinnedAppsSeparatorFrame); + } + _loadPinnedApps(array,frame, savePinnedAppsButton, scrollWindow) { + for(let i = 0; i < array.length; i += 3) { + let frameRow = new PW.FrameBoxDragRow(scrollWindow); + frameRow._name = array[i]; + frameRow._icon = Prefs.getIconPath([array[i], array[i+1], array[i+2]]); + frameRow._cmd = array[i+2]; + frameRow.saveButton = savePinnedAppsButton; + frameRow.hasEditButton = true; + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + let arcMenuImage = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + + let arcMenuImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + arcMenuImageBox.append(dragImage); + arcMenuImageBox.append(arcMenuImage); + frameRow.add(arcMenuImageBox); + + let frameLabel = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true + }); + + frameLabel.label = _(frameRow._name); + frameRow.add(frameLabel); + + Prefs.checkIfValidShortcut(frameRow, frameLabel, arcMenuImage); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: frame, + buttons: [savePinnedAppsButton], + modifyButton: true, + changeButton: true + }); + + buttonBox.connect('change', ()=> { + let dialog = new Prefs.AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.OTHER); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + let icon = Prefs.getIconPath(newPinnedApps); + arcMenuImage.gicon = Gio.icon_new_for_string(iconString ? iconString : icon); + dialog.destroy(); + frame.show(); + savePinnedAppsButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new Prefs.AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.OTHER, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + arcMenuImage.gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + dialog.destroy(); + frame.show(); + savePinnedAppsButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + frameRow.add(buttonBox); + frame.add(frameRow); + } + } + _loadWhiskerMenuTweaks(){ + let whiskerMenuTweaksFrame = new PW.FrameBox(); + whiskerMenuTweaksFrame.add(this._createActivateOnHoverRow()); + whiskerMenuTweaksFrame.add(this._createAvatarShapeRow()); + whiskerMenuTweaksFrame.add(this._createSearchBarLocationRow()); + whiskerMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(whiskerMenuTweaksFrame); + } + _loadRedmondMenuTweaks(){ + let redmondMenuTweaksFrame = new PW.FrameBox(); + redmondMenuTweaksFrame.add(this._createSearchBarLocationRow()); + + redmondMenuTweaksFrame.add(this._createFlipHorizontalRow()); + redmondMenuTweaksFrame.add(this._createAvatarShapeRow()); + redmondMenuTweaksFrame.add(this._disableAvatarRow()); + + let placesFrame = new PW.FrameBox(); + let externalDeviceRow = new PW.FrameBoxRow(); + let externalDeviceLabel = new Gtk.Label({ + label: _("External Devices"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let externalDeviceButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-external-devices')) + externalDeviceButton.set_active(true); + externalDeviceButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-external-devices', widget.get_active()); + }); + externalDeviceRow.add(externalDeviceLabel); + externalDeviceRow.add(externalDeviceButton); + + placesFrame.add(externalDeviceRow); + + let bookmarksRow = new PW.FrameBoxRow(); + let bookmarksLabel = new Gtk.Label({ + label: _("Bookmarks"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let bookmarksButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-bookmarks')) + bookmarksButton.set_active(true); + bookmarksButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-bookmarks', widget.get_active()); + }); + bookmarksRow.add(bookmarksLabel); + bookmarksRow.add(bookmarksButton); + + placesFrame.add(bookmarksRow); + this.mainBox.append(redmondMenuTweaksFrame); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Shortcuts") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + this.mainBox.append(placesFrame); + + } + _loadInsiderMenuTweaks(){ + let insiderMenuTweaksFrame = new PW.FrameBox(); + insiderMenuTweaksFrame.add(this._createAvatarShapeRow()); + this.mainBox.append(insiderMenuTweaksFrame); + } + _loadGnomeMenuTweaks(){ + let gnomeMenuTweaksFrame = new PW.FrameBox(); + gnomeMenuTweaksFrame.add(this._createActivateOnHoverRow()); + gnomeMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(gnomeMenuTweaksFrame); + } + _loadPlaceHolderTweaks(){ + let placeHolderFrame = new PW.FrameBox(); + let placeHolderRow = new PW.FrameBoxRow(); + let placeHolderLabel = new Gtk.Label({ + label: _("Nothing Yet!"), + use_markup: true, + halign: Gtk.Align.CENTER, + hexpand: true + }); + placeHolderRow.add(placeHolderLabel); + placeHolderFrame.add(placeHolderRow); + this.mainBox.append(placeHolderFrame); + } + _loadTogneeMenuTweaks(){ + let togneeMenuTweaksFrame = new PW.FrameBox(); + let searchBarBottomDefault = true; + let defaultLeftBoxRow = new PW.FrameBoxRow(); + let defaultLeftBoxLabel = new Gtk.Label({ + label: _("Default View"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let defaultLeftBoxCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END + }); + defaultLeftBoxCombo.append_text(_("Categories List")); + defaultLeftBoxCombo.append_text(_("All Programs")); + defaultLeftBoxCombo.set_active(this._settings.get_enum('default-menu-view-tognee')); + defaultLeftBoxCombo.connect('changed', (widget) => { + this._settings.set_enum('default-menu-view-tognee', widget.get_active()); + }); + + defaultLeftBoxRow.add(defaultLeftBoxLabel); + defaultLeftBoxRow.add(defaultLeftBoxCombo); + togneeMenuTweaksFrame.add(defaultLeftBoxRow); + togneeMenuTweaksFrame.add(this._createSearchBarLocationRow(searchBarBottomDefault)); + togneeMenuTweaksFrame.add(this._createFlipHorizontalRow()); + this.mainBox.append(togneeMenuTweaksFrame); + } + _loadArcMenuTweaks(){ + let arcMenuTweaksFrame = new PW.FrameBox(); + let defaultLeftBoxRow = new PW.FrameBoxRow(); + let defaultLeftBoxLabel = new Gtk.Label({ + label: _("Default View"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let defaultLeftBoxCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + defaultLeftBoxCombo.append_text(_("Pinned Apps")); + defaultLeftBoxCombo.append_text(_("Categories List")); + defaultLeftBoxCombo.append_text(_("Frequent Apps")); + defaultLeftBoxCombo.append_text(_("All Programs")); + defaultLeftBoxCombo.set_active(this._settings.get_enum('default-menu-view')); + defaultLeftBoxCombo.connect('changed', (widget) => { + this._settings.set_enum('default-menu-view', widget.get_active()); + }); + + defaultLeftBoxRow.add(defaultLeftBoxLabel); + defaultLeftBoxRow.add(defaultLeftBoxCombo); + arcMenuTweaksFrame.add(defaultLeftBoxRow); + + let searchBarBottomDefault = true; + arcMenuTweaksFrame.add(this._createSearchBarLocationRow(searchBarBottomDefault)); + arcMenuTweaksFrame.add(this._createFlipHorizontalRow()); + arcMenuTweaksFrame.add(this._createAvatarShapeRow()); + arcMenuTweaksFrame.add(this._disableAvatarRow()); + + let placesFrame = new PW.FrameBox(); + let externalDeviceRow = new PW.FrameBoxRow(); + let externalDeviceLabel = new Gtk.Label({ + label: _("External Devices"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let externalDeviceButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-external-devices')) + externalDeviceButton.set_active(true); + externalDeviceButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-external-devices', widget.get_active()); + }); + externalDeviceRow.add(externalDeviceLabel); + externalDeviceRow.add(externalDeviceButton); + + placesFrame.add(externalDeviceRow); + + let bookmarksRow = new PW.FrameBoxRow(); + let bookmarksLabel = new Gtk.Label({ + label: _("Bookmarks"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let bookmarksButton = new Gtk.Switch(); + if(this._settings.get_boolean('show-bookmarks')) + bookmarksButton.set_active(true); + bookmarksButton.connect('notify::active', (widget) => { + this._settings.set_boolean('show-bookmarks', widget.get_active()); + }); + bookmarksRow.add(bookmarksLabel); + bookmarksRow.add(bookmarksButton); + + placesFrame.add(bookmarksRow); + this.mainBox.append(arcMenuTweaksFrame); + + let extraCategoriesFrame = new PW.FrameBox(); + let extraCategoriesRow = new PW.FrameBoxRow(); + let extraCategoriesButtonRow = new PW.FrameBoxRow(); + let extraCategoriesLocationRow = new PW.FrameBoxRow(); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Shortcuts") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + this.mainBox.append(placesFrame); + this.mainBox.append(new Gtk.Label({ + label: "" + _("Extra Categories Quick Links") + "" + + "\n" + '' + _("Display quick links of extra categories on the home page") + "" + + "\n" + '' + _("See Customize Menu -> Extra Categories") + "", + use_markup: true, + xalign: 0, + hexpand: true + })); + let extraCategoriesLinksBox = new Prefs.MenuSettingsCategoriesPage(this._settings, "arcmenu-extra-categories-links"); + extraCategoriesLinksBox.categoriesFrame.unparent(); + extraCategoriesLinksBox.buttonRow.unparent(); + extraCategoriesRow.add(extraCategoriesLinksBox.categoriesFrame); + extraCategoriesLinksBox.categoriesFrame.hexpand = true; + extraCategoriesLinksBox.categoriesFrame.halign = Gtk.Align.FILL; + extraCategoriesButtonRow.add(extraCategoriesLinksBox.buttonRow); + extraCategoriesFrame.add(extraCategoriesRow); + extraCategoriesFrame.add(extraCategoriesButtonRow); + + this.mainBox.append(extraCategoriesFrame); + + let extraCategoriesLocationFrame = new PW.FrameBox(); + let extraCategoriesLocationLabel = new Gtk.Label({ + label: _("Quick Links Location"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let extraCategoriesLocationCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + extraCategoriesLocationCombo.append_text(_("Bottom")); + extraCategoriesLocationCombo.append_text(_("Top")); + extraCategoriesLocationCombo.set_active(this._settings.get_enum('arcmenu-extra-categories-links-location')); + extraCategoriesLocationCombo.connect('changed', (widget) => { + this._settings.set_enum('arcmenu-extra-categories-links-location' , widget.get_active()); + }); + + extraCategoriesLocationRow.add(extraCategoriesLocationLabel); + extraCategoriesLocationRow.add(extraCategoriesLocationCombo); + extraCategoriesLocationFrame.add(extraCategoriesLocationRow); + this.mainBox.append(extraCategoriesLocationFrame); + } + _createWidgetsRows(layout){ + let weatherWidgetSetting = 'enable-weather-widget-raven'; + let clockWidgetSetting = 'enable-clock-widget-raven'; + if(layout == Constants.MenuLayout.RAVEN){ + weatherWidgetSetting = 'enable-weather-widget-raven'; + clockWidgetSetting = 'enable-clock-widget-raven'; + } + else{ + weatherWidgetSetting = 'enable-weather-widget-unity'; + clockWidgetSetting = 'enable-clock-widget-unity'; + } + + let widgetFrame = new PW.FrameBox(); + let weatherWidgetRow = new PW.FrameBoxRow(); + let weatherWidgetLabel = new Gtk.Label({ + label: _("Enable Weather Widget"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let weatherWidgetSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + weatherWidgetSwitch.set_active(this._settings.get_boolean(weatherWidgetSetting)); + weatherWidgetSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(weatherWidgetSetting, widget.get_active()); + }); + + weatherWidgetRow.add(weatherWidgetLabel); + weatherWidgetRow.add(weatherWidgetSwitch); + widgetFrame.add(weatherWidgetRow); + + let clockWidgetRow = new PW.FrameBoxRow(); + let clockWidgetLabel = new Gtk.Label({ + label: _("Enable Clock Widget"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let clockWidgetSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + clockWidgetSwitch.set_active(this._settings.get_boolean(clockWidgetSetting)); + clockWidgetSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(clockWidgetSetting, widget.get_active()); + }); + + clockWidgetRow.add(clockWidgetLabel); + clockWidgetRow.add(clockWidgetSwitch); + widgetFrame.add(clockWidgetRow); + + return widgetFrame; + } +}); diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js new file mode 100644 index 0000000..b29a5bb --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/unity.js @@ -0,0 +1,445 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.GRID, + SearchDisplayType: Constants.DisplayType.GRID, + ColumnSpacing: 15, + RowSpacing: 15, + VerticalMainBox: true, + DefaultMenuWidth: 750, + DefaultIconGridStyle: "LargeIconGrid", + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + + createLayout(){ + super.createLayout(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen) + this.activeCategory = _("Pinned Apps"); + else + this.activeCategory = _("All Programs"); + + this.topBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false, + style: 'padding-bottom: 10px; padding-right: 15px;' + }); + + this.mainBox.add_child(this.topBox); + this.categoriesButton = new MW.CategoriesButton(this); + + this.subMainBox= new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.mainBox.add_child(this.subMainBox); + + this.searchBox.actor.y_align = Clutter.ActorAlign.CENTER; + this.searchBox.actor.y_expand = true; + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 0px 15px 0px 15px;"; + this.topBox.add_child(this.searchBox.actor); + this.topBox.add_child(this.categoriesButton.actor); + + this.applicationsBox = new St.BoxLayout({ + vertical: true, + style: "padding-bottom: 10px;" + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade', + }); + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + + this.arcMenu.box.style = "padding-bottom:0px;"; + + this.actionsContainerBoxStyle = "margin: 0px; spacing: 0px;background-color:rgba(186, 196,201, 0.1) ; padding: 5px 5px;"+ + "border-color:rgba(186, 196,201, 0.2) ; border-top-width: 1px;"; + this.themeNodeBorderRadius = ""; + this.actionsContainerBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.END, + vertical: false, + style: this.actionsContainerBoxStyle + this.themeNodeBorderRadius + }); + + this.subMainBox.add_child(this.actionsContainerBox); + + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px;"; + this.appsBox = new St.BoxLayout({ + vertical: true + }); + this.actionsContainerBox.add_child(this.actionsBox); + + this.widgetBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.END, + vertical: false, + style_class: 'datemenu-displays-box' + }); + + this.widgetBox.style = "margin: 0px; spacing: 10px; padding: 10px 50px;"; + this._weatherItem = new MW.WeatherSection(this); + this._weatherItem.style = "border-radius:4px; width: 350px; padding: 10px; margin: 0px"; + this._clocksItem = new MW.WorldClocksSection(this); + this._clocksItem.style = "border-radius:4px; padding: 10px; margin: 0px"; + + this.appShortcuts = []; + this.shortcutsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER, + vertical: true + }); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.layoutProperties.ColumnSpacing, + row_spacing: this.layoutProperties.RowSpacing + }); + this.shortcutsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.shortcutsGrid); + + this.shortcutsBox.add_child(this.shortcutsGrid); + + //Add Application Shortcuts to menu (Software, Settings, Tweaks, Terminal) + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + let isContainedInCategory = false; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcuts[i][1], applicationShortcuts[i][2], Constants.DisplayType.GRID, isContainedInCategory); + this.appShortcuts.push(shortcutMenuItem); + } + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + this._createCategoriesMenu(); + this.loadExtraPinnedApps(); + + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.applicationsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView) + this.setDefaultMenuView(); + } + + _addSeparator(){ + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.ALWAYS_SHOW, Constants.SeparatorAlignment.VERTICAL); + this.actionsBox.add_child(verticalSeparator); + } + + loadExtraPinnedApps(){ + this.actionsContainerBox.remove_child(this.actionsBox); + this.actionsBox.destroy_all_children(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + vertical: false + }); + this.actionsBox.style = "spacing: 10px; padding: 5px 0px;"; + this.actionsContainerBox.add_child(this.actionsBox); + + super.loadExtraPinnedApps(this._settings.get_strv('unity-pinned-app-list'), this._settings.get_int('unity-separator-index')); + } + + _createExtraPinnedAppsList(){ + let pinnedApps = []; + pinnedApps.push(_("Home"), "ArcMenu_Home", "ArcMenu_Home"); + pinnedApps.push(_("Documents"), "ArcMenu_Documents", "ArcMenu_Documents"); + pinnedApps.push(_("Downloads"), "ArcMenu_Downloads", "ArcMenu_Downloads"); + + let software = Utils.findSoftwareManager(); + if(software) + pinnedApps.push(_("Software"), 'system-software-install-symbolic', software); + else + pinnedApps.push(_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"); + + pinnedApps.push(_("Files"), "system-file-manager", "org.gnome.Nautilus.desktop"); + pinnedApps.push(_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"); + pinnedApps.push(_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"); + pinnedApps.push(_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"); + + this.shouldLoadPinnedApps = false; // We don't want to trigger a setting changed event + this._settings.set_strv('unity-pinned-app-list', pinnedApps); + this.shouldLoadPinnedApps = true; + return pinnedApps; + } + + _createCategoriesMenu(){ + this.categoriesMenu = new PopupMenu.PopupMenu(this.categoriesButton.actor, 0.5, St.Side.TOP); + this.categoriesMenu.blockSourceEvents = true; + this.categoriesMenu.connect('open-state-changed', (menu, open) => { + if(open){ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.categoriesButton.tooltip){ + this.categoriesButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + else{ + this.categoriesButton.active = false; + this.categoriesButton.sync_hover(); + this.categoriesButton.hovered = this.categoriesButton.hover; + } + }); + this.section = new PopupMenu.PopupMenuSection(); + this.categoriesMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + overlay_scrollbars: true, + reactive:true + }); + this.leftPanelPopup.add_child(this.categoriesScrollBox); + + this.categoriesBox = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + this.categoriesScrollBox.clip_to_allocation = true; + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(350 / scaleFactor); + this.leftPanelPopup.style = `max-height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this._displayCategories(); + this.subMenuManager.addMenu(this.categoriesMenu); + this.categoriesMenu.actor.hide(); + Main.uiGroup.add_child(this.categoriesMenu.actor); + } + + toggleCategoriesMenu(){ + let appsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.categoriesMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.categoriesMenu.actor.add_style_class_name( customStyle ? 'arc-menu' : 'popup-menu'); + this.categoriesButton.tooltip.hide(); + + this.categoriesMenu.toggle(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + let homeScreen = this._settings.get_boolean('enable-unity-homescreen'); + if(homeScreen){ + this.activeCategory = _("Pinned Apps"); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + this.displayPinnedApps(); + } + else{ + this.activeCategory = _("All Programs"); + let isGridLayout = true; + this.displayAllApps(isGridLayout); + this.activeCategoryType = Constants.CategoryType.ALL_PROGRAMS; + } + } + + updateStyle(){ + super.updateStyle(); + let removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + this.themeNodeBorderRadius = "border-radius: 0px 0px " + borderRadius + "px " + borderRadius + "px;"; + this.actionsContainerBox.style = this.actionsContainerBoxStyle + this.themeNodeBorderRadius; + + if(removeMenuArrow) + this.arcMenu.box.style = "padding-bottom:0px; margin:0px;"; + else + this.arcMenu.box.style = "padding-bottom:0px;"; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + let categoryMenuItem = new MW.CategoryMenuItem(this, Constants.CategoryType.HOME_SCREEN, Constants.DisplayType.LIST); + this.categoryDirectories.set(Constants.CategoryType.HOME_SCREEN, categoryMenuItem); + this.hasPinnedApps = true; + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(categoryEnum == Constants.CategoryType.PINNED_APPS) + shouldShow = false; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + _displayCategories(){ + for(let categoryMenuItem of this.categoryDirectories.values()){ + this.categoriesBox.add_actor(categoryMenuItem.actor); + } + } + + displayPinnedApps() { + if(this.activeCategoryType === Constants.CategoryType.HOME_SCREEN) + this._clearActorsFromBox(this.applicationsBox); + else + this._clearActorsFromBox(); + this.subMainBox.remove_child(this.actionsContainerBox); + this.activeCategory = _("Pinned Apps"); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.PINNED_APPS, this.applicationsGrid); + this.activeCategory = _("Shortcuts"); + this._displayAppList(this.appShortcuts, Constants.CategoryType.HOME_SCREEN, this.shortcutsGrid); + if(!this.applicationsBox.contains(this.shortcutsBox)) + this.applicationsBox.add_child(this.shortcutsBox); + this.widgetBox.remove_all_children(); + if(this._settings.get_boolean('enable-clock-widget-unity')) + this.widgetBox.add_child(this._clocksItem); + if(this._settings.get_boolean('enable-weather-widget-unity')) + this.widgetBox.add_child(this._weatherItem); + if(!this.subMainBox.contains(this.widgetBox)) + this.subMainBox.add_child(this.widgetBox); + this.subMainBox.add_child(this.actionsContainerBox); + } + + displayRecentFiles(){ + super.displayRecentFiles(); + let label = this._createLabelWithSeparator(_("Recent Files")); + this.applicationsBox.insert_child_at_index(label, 0); + this.activeCategoryType = Constants.CategoryType.RECENT_FILES; + this.applicationsBox.add_style_class_name('margin-box'); + } + + displayCategoryAppList(appList, category){ + this._clearActorsFromBox(); + this._displayAppList(appList, category, this.applicationsGrid); + } + + _clearActorsFromBox(box) { + if(this.categoriesMenu.isOpen) + this.categoriesMenu.toggle(); + if(this.subMainBox.contains(this.widgetBox)){ + this.subMainBox.remove_child(this.widgetBox); + } + this.applicationsBox.remove_style_class_name('margin-box'); + super._clearActorsFromBox(box); + } + + _displayAppList(apps, category, grid){ + super._displayAppList(apps, category, grid); + + let label = this._createLabelWithSeparator(this.activeCategory); + if(grid === this.applicationsGrid) + this.applicationsBox.insert_child_at_index(label.actor, 0); + else + this.applicationsBox.insert_child_at_index(label.actor, 2); + } + + destroy(){ + if(this._clocksItem) + this._clocksItem.destroy(); + if(this._weatherItem) + this._weatherItem.destroy(); + + this.arcMenu.box.style = null; + this.arcMenu.actor.style = null; + + super.destroy(); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js new file mode 100644 index 0000000..ab4958e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/whisker.js @@ -0,0 +1,187 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, Gtk, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + DisplayType: Constants.DisplayType.LIST, + SearchDisplayType: Constants.DisplayType.LIST, + GridColumns: 1, + ColumnSpacing: 0, + RowSpacing: 0, + SupportsCategoryOnHover: true, + VerticalMainBox: true, + DefaultCategoryIconSize: Constants.MEDIUM_ICON_SIZE, + DefaultApplicationIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.MEDIUM_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: false + }); + + this.actionsBox.style = "spacing: 6px; margin: 0px 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.user = new MW.UserMenuItem(this, Constants.DisplayType.LIST); + this.user.actor.x_expand = true; + this.user.actor.x_align = Clutter.ActorAlign.FILL; + this.actionsBox.add_child(this.user.actor); + + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + + let powerOptions = this._settings.get_value("power-options").deep_unpack(); + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let shouldShow = powerOptions[i][1]; + if(shouldShow){ + let powerButton = new MW.PowerButton(this, powerType); + this.actionsBox.add_child(powerButton); + } + } + + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.TOP){ + this.searchBox.style = "margin: 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + else{ + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + this.mainBox.add_child(separator); + } + + //Sub Main Box -- stores left and right box + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: false, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.rightBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'right-panel-plus45' + }); + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + this.applicationsScrollBox = this._createScrollBox({ + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'right-panel-plus45 ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.rightBox.add_child(this.applicationsScrollBox); + + this.leftBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'left-panel' + }); + + let horizonalFlip = this._settings.get_boolean("enable-horizontal-flip"); + this.subMainBox.add_child(horizonalFlip ? this.rightBox : this.leftBox); + let verticalSeparator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.VERTICAL); + this.subMainBox.add_child(verticalSeparator); + this.subMainBox.add_child(horizonalFlip ? this.leftBox : this.rightBox); + + this.categoriesScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + overlay_scrollbars: true + }); + + this.leftBox.add_child(this.categoriesScrollBox); + this.categoriesBox = new St.BoxLayout({ vertical: true }); + this.categoriesScrollBox.add_actor(this.categoriesBox); + if(this._settings.get_enum('searchbar-default-top-location') === Constants.SearchbarLocation.BOTTOM){ + this.searchBox.style = "margin: 10px 10px 0px 10px;"; + this.mainBox.add_child(this.searchBox.actor); + } + this.loadCategories(); + this.loadPinnedApps(); + + this.setDefaultMenuView(); + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + this.displayCategories(); + this.categoryDirectories.values().next().value.displayAppList(); + this.activeMenuItem = this.categoryDirectories.values().next().value; + if(this.arcMenu.isOpen) + this.activeMenuItem.active = true; + } + + loadCategories(){ + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + + let extraCategories = this._settings.get_value("extra-categories").deep_unpack(); + + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let shouldShow = extraCategories[i][1]; + if(shouldShow){ + let categoryMenuItem = new MW.CategoryMenuItem(this, categoryEnum, Constants.DisplayType.LIST); + this.categoryDirectories.set(categoryEnum, categoryMenuItem); + } + } + + super.loadCategories(); + } + + displayCategories(){ + super.displayCategories(this.categoriesBox); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js new file mode 100644 index 0000000..047bd63 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/menulayouts/windows.js @@ -0,0 +1,465 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Gio, Gtk, Shell, St} = imports.gi; +const BaseMenuLayout = Me.imports.menulayouts.baseMenuLayout; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PlaceDisplay = Me.imports.placeDisplay; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var createMenu = class extends BaseMenuLayout.BaseLayout{ + constructor(menuButton) { + super(menuButton, { + Search: true, + SearchDisplayType: Constants.DisplayType.LIST, + DisplayType: Constants.DisplayType.LIST, + ColumnSpacing: 0, + RowSpacing: 0, + DefaultMenuWidth: 300, + DefaultIconGridStyle: "SmallIconGrid", + VerticalMainBox: false, + DefaultCategoryIconSize: Constants.LARGE_ICON_SIZE, + DefaultApplicationIconSize: Constants.LARGE_ICON_SIZE, + DefaultQuickLinksIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultButtonsIconSize: Constants.EXTRA_SMALL_ICON_SIZE, + DefaultPinnedIconSize: Constants.LARGE_ICON_SIZE, + }); + } + createLayout(){ + super.createLayout(); + this.actionsBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.FILL, + vertical: true + }); + this.actionsBox.style = "margin: 0px 5px 0px 10px; spacing: 10px;"; + this.mainBox.add_child(this.actionsBox); + + this.extrasButton = new MW.ExtrasButton(this); + this.extrasButton.actor.y_expand = true; + this.extrasButton.actor.y_align= Clutter.ActorAlign.START; + this.actionsBox.add_child(this.extrasButton.actor); + let userButton = new MW.UserMenuItem(this, Constants.DisplayType.BUTTON); + this.actionsBox.add_child(userButton.actor); + let path = GLib.get_user_special_dir(imports.gi.GLib.UserDirectory.DIRECTORY_DOCUMENTS); + if (path != null){ + let placeInfo = new MW.PlaceInfo(Gio.File.new_for_path(path), _("Documents")); + let isContainedInCategory = false; + let placeMenuItem = new MW.PlaceMenuItem(this, placeInfo, Constants.DisplayType.BUTTON, isContainedInCategory); + this.actionsBox.add_child(placeMenuItem.actor); + } + let settingsButton = new MW.SettingsButton(this); + this.actionsBox.add_child(settingsButton.actor); + this.leaveButton = new MW.LeaveButton(this); + this.actionsBox.add_child(this.leaveButton.actor); + + this.subMainBox = new St.BoxLayout({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.FILL, + vertical: true, + style_class: 'margin-box' + }); + this.mainBox.add_child(this.subMainBox); + + this.pinnedAppsScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: this.disableFadeEffect ? '' : 'vfade' + }); + + this.pinnedAppsBox = new St.BoxLayout({ + vertical: true, + x_expand: true + }); + this.pinnedAppsScrollBox.add_actor(this.pinnedAppsBox); + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: 10, + row_spacing: 10 + }); + this.pinnedAppsGrid = new St.Widget({ + x_expand: true, + x_align: Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this.pinnedAppsGrid); + + this.searchBox.name = "ArcSearchEntryRound"; + this.searchBox.style = "margin: 15px 10px 0px 10px;"; + + this.applicationsBox = new St.BoxLayout({ + vertical: true + }); + + this.applicationsScrollBox = this._createScrollBox({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + style_class: 'left-panel ' + (this.disableFadeEffect ? '' : 'small-vfade'), + }); + + this.applicationsScrollBox.add_actor(this.applicationsBox); + this.subMainBox.add_child(this.applicationsScrollBox); + this.subMainBox.add_child(this.searchBox.actor); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + + let SOFTWARE_TRANSLATIONS = [_("Software"), _("Settings"), _("Tweaks"), _("Terminal"), _("Activities Overview"), _("ArcMenu Settings")]; + let applicationShortcutsList = this._settings.get_value('application-shortcuts-list').deep_unpack(); + this.applicationShortcuts = []; + for(let i = 0; i < applicationShortcutsList.length; i++){ + let applicationName = applicationShortcutsList[i][0]; + let shortcutMenuItem = new MW.ShortcutMenuItem(this, _(applicationName), applicationShortcutsList[i][1], applicationShortcutsList[i][2], Constants.DisplayType.LIST); + if(shortcutMenuItem.shouldShow) + this.applicationShortcuts.push(shortcutMenuItem.actor); + } + + let directoryShortcutsList = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + this._loadPlaces(directoryShortcutsList); + + this.externalDevicesBox = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true + }); + this._sections = { }; + this.placesManager = new PlaceDisplay.PlacesManager(); + for (let i = 0; i < Constants.SECTIONS.length; i++) { + let id = Constants.SECTIONS[i]; + this._sections[id] = new St.BoxLayout({ + vertical: true + }); + this.placeManagerUpdatedID = this.placesManager.connect(`${id}-updated`, () => { + this._redisplayPlaces(id); + }); + + this._createPlaces(id); + this.externalDevicesBox.add_child(this._sections[id]); + } + + this.updateWidth(); + this.loadCategories(); + this.loadPinnedApps(); + + this._createExtrasMenu(); + this.setDefaultMenuView(); + } + + updateWidth(setDefaultMenuView){ + const widthAdjustment = this._settings.get_int("menu-width-adjustment"); + let menuWidth = this.layoutProperties.DefaultMenuWidth + widthAdjustment; + //Set a 300px minimum limit for the menu width + menuWidth = Math.max(300, menuWidth); + this.pinnedAppsScrollBox.style = `width: ${menuWidth}px;`; + this.layoutProperties.MenuWidth = menuWidth; + if(setDefaultMenuView){ + this.loadPinnedApps(); + this.setDefaultMenuView(); + } + + } + + loadPinnedApps(){ + this.layoutProperties.DisplayType = Constants.DisplayType.GRID; + super.loadPinnedApps(); + this.pinnedAppsGrid.layout_manager.forceGridColumns = this.getColumnsFromGridIconSizeSetting(); + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + } + + _createPlaces(id) { + let places = this.placesManager.get(id); + + if(id === 'bookmarks' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Bookmarks"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'devices' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Devices"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + + if(id === 'network' && places.length > 0){ + this._sections[id].add_child(this.createLabelRow(_("Network"))); + for (let i = 0; i < places.length; i++){ + let item = new PlaceDisplay.PlaceMenuItem(this, places[i], Constants.DisplayType.LIST); + this._sections[id].add_child(item); + } + } + } + + _loadPlaces(directoryShortcutsList) { + this.directoryShortcuts = []; + for (let i = 0; i < directoryShortcutsList.length; i++) { + let directory = directoryShortcutsList[i]; + let isContainedInCategory = false; + let placeMenuItem = this.createMenuItem(directory, Constants.DisplayType.LIST, isContainedInCategory); + this.directoryShortcuts.push(placeMenuItem); + } + } + + _createExtrasMenu(){ + this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyCursor); + this.extrasMenu = new PopupMenu.PopupMenu(this.dummyCursor, 0, St.Side.TOP); + this.section = new PopupMenu.PopupMenuSection(); + this.extrasMenu.addMenuItem(this.section); + + this.leftPanelPopup = new St.BoxLayout({ + vertical: true, + style_class: 'margin-box' + }); + this.leftPanelPopup._delegate = this.leftPanelPopup; + let headerBox = new St.BoxLayout({ + x_expand: false, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.START, + vertical: true + }); + this.leftPanelPopup.add_child(headerBox); + + this.backButton = new MW.BackMenuItem(this); + this.backButton.connect("activate", () => this.toggleExtrasMenu()); + headerBox.add_child(this.backButton.actor); + let separator = new MW.ArcMenuSeparator(Constants.SeparatorStyle.MEDIUM, Constants.SeparatorAlignment.HORIZONTAL); + headerBox.add_child(separator); + + this.computerScrollBox = this._createScrollBox({ + x_expand: true, + y_expand: true, + y_align: Clutter.ActorAlign.START, + overlay_scrollbars: true, + reactive:true, + style_class: this.disableFadeEffect ? '' : 'small-vfade', + }); + + this.leftPanelPopup.add_child(this.computerScrollBox); + + this.computerBox = new St.BoxLayout({ + vertical: true + }); + this.computerScrollBox.add_actor(this.computerBox); + + this.computerBox.add_child(this.createLabelRow(_("Application Shortcuts"))); + for(let i = 0; i < this.applicationShortcuts.length; i++){ + this.computerBox.add_child(this.applicationShortcuts[i]); + } + this.computerBox.add_child(this.createLabelRow(_("Places"))); + for(let i = 0; i < this.directoryShortcuts.length; i++){ + this.computerBox.add_child(this.directoryShortcuts[i]); + } + this.computerBox.add_child(this.externalDevicesBox); + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + let scaleFactor = themeContext.scale_factor; + let height = Math.round(this._settings.get_int('menu-height') / scaleFactor) - 1; + this.leftPanelPopup.style = `height: ${height}px`; + this.section.actor.add_child(this.leftPanelPopup); + this.subMenuManager.addMenu(this.extrasMenu); + this.extrasMenu.actor.hide(); + Main.uiGroup.add_child(this.extrasMenu.actor); + this.extrasMenu.connect('open-state-changed', (menu, open) => { + if(!open){ + this.extrasButton.active = false; + this.extrasButton.sync_hover(); + this.extrasButton.hovered = this.extrasButton.hover; + } + else{ + if(this.menuButton.tooltipShowingID){ + GLib.source_remove(this.menuButton.tooltipShowingID); + this.menuButton.tooltipShowingID = null; + this.menuButton.tooltipShowing = false; + } + if(this.extrasButton.tooltip){ + this.extrasButton.tooltip.hide(); + this.menuButton.tooltipShowing = false; + } + } + }); + } + + toggleExtrasMenu(){ + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + this.extrasMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.extrasMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + this.extrasButton.tooltip.hide(); + + let themeNode = this.arcMenu.actor.get_theme_node(); + let backgroundColor = themeNode.get_color('-arrow-background-color'); + let borderWidth = themeNode.get_length('-arrow-border-width'); + let borderRadius = themeNode.get_length('-arrow-border-radius'); + let monitorIndex = Main.layoutManager.findIndexForActor(this.menuButton); + let scaleFactor = Main.layoutManager.monitors[monitorIndex].geometry_scale; + borderRadius = borderRadius / scaleFactor; + + let drawBoxShadow = true; + if(backgroundColor?.alpha === 0){ + backgroundColor = themeNode.get_color('background-color'); + if(backgroundColor?.alpha === 0){ + drawBoxShadow = false; + } + } + + let styleProperties, shadowColor; + if(drawBoxShadow){ + shadowColor = backgroundColor.shade(.35); + backgroundColor = Utils.clutterColorToRGBA(backgroundColor); + shadowColor = Utils.clutterColorToRGBA(shadowColor); + styleProperties = "box-shadow: 3px 0px 2px " + shadowColor + "; background-color: " + backgroundColor + ";"; + } + + this.extrasMenu.actor.style = "-boxpointer-gap: 0px; -arrow-border-color: transparent; -arrow-border-width: 0px; width: 250px;" + +"-arrow-base:0px; -arrow-rise: 0px; -arrow-background-color: transparent;" + +"border-radius: " + borderRadius + "px;" + styleProperties; + + this.arcMenu.actor.get_allocation_box(); + let [x, y] = this.arcMenu.actor.get_transformed_position(); + let rise = themeNode.get_length('-arrow-rise'); + + if(this.arcMenu._arrowSide === St.Side.TOP) + y += rise + 1; + else + y += 1; + + if(this.arcMenu._arrowSide === St.Side.LEFT) + x = x + (borderRadius * 2) + rise + 1; + else + x = x + (borderRadius * 2); + + this.dummyCursor.set_position(Math.round(x + borderWidth), Math.round(y + borderWidth)); + this.extrasMenu.toggle(); + if(this.extrasMenu.isOpen){ + this.activeMenuItem = this.backButton; + this.backButton.grab_key_focus(); + } + } + + setDefaultMenuView(){ + super.setDefaultMenuView(); + + this.displayAllApps(); + if(!this._settings.get_boolean('windows-disable-pinned-apps')){ + if(!this.mainBox.contains(this.pinnedAppsScrollBox)) + this.mainBox.add_child(this.pinnedAppsScrollBox); + this.displayPinnedApps(); + } + + let appsScrollBoxAdj = this.pinnedAppsScrollBox.get_vscroll_bar().get_adjustment(); + appsScrollBoxAdj.set_value(0); + } + + displayAllApps(){ + this._clearActorsFromBox(); + let label = this._createLabelWithSeparator(_("Frequent")); + this.activeMenuItemSet = false; + + if(!this._settings.get_boolean('windows-disable-frequent-apps')){ + let mostUsed = Shell.AppUsage.get_default().get_most_used(); + this.frequentAppsList = []; + for (let i = 0; i < mostUsed.length; i++) { + if (mostUsed[i] && mostUsed[i].get_app_info().should_show()){ + let item = new MW.ApplicationMenuItem(this, mostUsed[i], Constants.DisplayType.LIST); + this.frequentAppsList.push(item); + } + } + const MaxItems = 8; + if(this.frequentAppsList.length > 0){ + this.applicationsBox.add_child(label.actor); + for (let i = 0; i < this.frequentAppsList.length && i < MaxItems; i++) { + let item = this.frequentAppsList[i]; + if(item.actor.get_parent()) + item.actor.get_parent().remove_child(item.actor); + if (!item.actor.get_parent()) + this.applicationsBox.add_child(item.actor); + if(!this.activeMenuItemSet){ + this._frequentActiveItem = item; + this.activeMenuItemSet = true; + } + } + } + } + + let appList = []; + this.applicationsMap.forEach((value,key,map) => { + appList.push(key); + }); + appList.sort((a, b) => { + return a.get_name().toLowerCase() > b.get_name().toLowerCase(); + }); + this.layoutProperties.DisplayType = Constants.DisplayType.LIST; + this._displayAppList(appList, Constants.CategoryType.ALL_PROGRAMS, this.applicationsGrid); + + if(this.activeMenuItemSet) + this.activeMenuItem = this._frequentActiveItem; + } + + loadCategories() { + this.categoryDirectories = null; + this.categoryDirectories = new Map(); + this.hasPinnedApps = true; + super.loadCategories(); + } + + _clearActorsFromBox(box){ + super._clearActorsFromBox(box); + this.activeCategoryType = Constants.CategoryType.HOME_SCREEN; + } + + displayPinnedApps() { + super._clearActorsFromBox(this.pinnedAppsBox); + this.pinnedAppsGrid.remove_all_children(); + let label = this.createLabelRow(_("Pinned Apps")); + label.remove_child(label._ornamentLabel); + this.pinnedAppsBox.add_child(label); + this._displayAppList(this.pinnedAppsArray, Constants.CategoryType.HOME_SCREEN, this.pinnedAppsGrid); + if(!this.pinnedAppsBox.contains(this.pinnedAppsGrid)) + this.pinnedAppsBox.add_child(this.pinnedAppsGrid); + + if(this.activeMenuItemSet) + this.activeMenuItem = this._frequentActiveItem; + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/metadata.json b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/metadata.json new file mode 100644 index 0000000..f6d4800 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/metadata.json @@ -0,0 +1,15 @@ +{ + "_generated": "Generated by SweetTooth, do not edit", + "description": "Application menu for GNOME Shell\n\nFeatures include: various menu layouts, built in GNOME search, quick access to system shortcuts, and much more!\n\nCommon solutions for ERROR message:\n - Restart your GNOME session after updating ArcMenu.\n - Install one of the following packages: 'gir1.2-gmenu-3.0' or 'gnome-menus'\n\nGeneral Help:\n - Visit https://gitlab.com/arcmenu/ArcMenu/-/wikis/home\n\nPlease report all bugs or issues at https://gitlab.com/arcmenu/ArcMenu", + "extension-id": "arcmenu", + "gettext-domain": "arcmenu", + "name": "ArcMenu", + "settings-schema": "org.gnome.shell.extensions.arcmenu", + "shell-version": [ + "40", + "41" + ], + "url": "https://gitlab.com/arcmenu/ArcMenu", + "uuid": "arcmenu@arcmenu.com", + "version": 27 +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js new file mode 100644 index 0000000..4e58333 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/placeDisplay.js @@ -0,0 +1,764 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: This file leverages the work from places-menu extension + * (https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/tree/master/extensions/places-menu) + * and Dash to Dock extension 'location.js' file to implement a trash shortcut + * (https://github.com/micheleg/dash-to-dock/blob/master/locations.js) + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {St, Gio, GLib, Shell } = imports.gi; +const Clutter = imports.gi.Clutter; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const GObject = imports.gi.GObject; +const Main = imports.ui.main; +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const ShellMountOperation = imports.ui.shellMountOperation; +const Signals = imports.signals; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; +const Hostname1Iface = ' \ + \ + \ + \ +'; +const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface); + +var PlaceMenuItem = GObject.registerClass(class Arc_Menu_PlaceMenuItem2 extends MW.ArcMenuPopupBaseMenuItem{ + _init(menuLayout, info) { + super._init(menuLayout); + this._info = info; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this._iconBin = new St.Bin(); + this.add_child(this._iconBin); + + this._updateIcon(); + + this.label = new St.Label({ text: info.name, + x_expand: true, + y_expand: false, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.CENTER }); + + this.add_child(this.label); + + if (info.isRemovable()) { + this.style = "padding-right: 15px;"; + this._ejectButton = new MW.ArcMenuButtonItem(this._menuLayout, null, 'media-eject-symbolic'); + this._ejectButton.add_style_class_name("arcmenu-small-button") + this._ejectButton.setIconSize(14); + this._ejectButton.x_align = Clutter.ActorAlign.END; + this._ejectButton.x_expand = true; + this._ejectButton.connect('activate', info.eject.bind(info)); + this.add_child(this._ejectButton); + } + + this._changedId = info.connect('changed', + this._propertiesChanged.bind(this)); + this.actor.connect('destroy',()=>{ + if (this._changedId) { + this._info.disconnect(this._changedId); + this._changedId = 0; + } + }); + + } + + createIcon(){ + const IconSizeEnum = this._settings.get_enum('quicklinks-item-icon-size'); + let defaultIconSize = this._menuLayout.layoutProperties.DefaultQuickLinksIconSize; + let iconSize = Utils.getIconSize(IconSizeEnum, defaultIconSize); + + return new St.Icon({ + gicon: this._info.icon, + icon_size: iconSize + }); + } + + activate(event) { + this._info.launch(event.get_time()); + this._menuLayout.arcMenu.toggle(); + super.activate(event); + } + + _propertiesChanged(info) { + this._info = info; + this._iconBin.set_child(this.createIcon()); + this.label.text = info.name; + } +}); + +var PlaceInfo = class Arc_Menu_PlaceInfo2 { + constructor() { + this._init.apply(this, arguments); + } + + _init(kind, file, name, icon) { + this.kind = kind; + this.file = file; + this.name = name || this._getFileName(); + this.icon = icon ? new Gio.ThemedIcon({ name: icon }) : this.getIcon(); + } + + destroy() { + } + + isRemovable() { + return false; + } + + async _ensureMountAndLaunch(context, tryMount) { + try { + await this._launchDefaultForUri(this.file.get_uri(), context, null); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) { + Main.notifyError(_('Failed to launch “%s”').format(this.name), e.message); + return; + } + + let source = { + get_icon: () => this.icon + }; + let op = new ShellMountOperation.ShellMountOperation(source); + try { + await this._mountEnclosingVolume(0, op.mountOp, null); + + if (tryMount) + this._ensureMountAndLaunch(context, false); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED)) + Main.notifyError(_('Failed to mount volume for “%s”').format(this.name), e.message); + } finally { + op.close(); + } + } + } + + launch(timestamp) { + let launchContext = global.create_app_launch_context(timestamp, -1); + this._ensureMountAndLaunch(launchContext, true); + } + + getIcon() { + this.file.query_info_async('standard::symbolic-icon', 0, 0, null, + (file, result) => { + try { + let info = file.query_info_finish(result); + this.icon = info.get_symbolic_icon(); + this.emit('changed'); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) + return; + throw e; + } + }); + + // return a generic icon for this kind for now, until we have the + // icon from the query info above + switch (this.kind) { + case 'network': + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + case 'devices': + return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); + case 'special': + case 'bookmarks': + default: + if (!this.file.is_native()) + return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + else + return new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + + _getFileName() { + try { + let info = this.file.query_info('standard::display-name', 0, null); + return info.get_display_name(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) + return this.file.get_basename(); + throw e; + } + } + + _launchDefaultForUri(uri, context, cancel) { + return new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(uri, context, cancel, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + } + + _mountEnclosingVolume(flags, mountOp, cancel) { + return new Promise((resolve, reject) => { + this.file.mount_enclosing_volume(flags, mountOp, cancel, (o, res) => { + try { + this.file.mount_enclosing_volume_finish(res); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + } +} +Signals.addSignalMethods(PlaceInfo.prototype); + +var RootInfo = class Arc_Menu_RootInfo extends PlaceInfo { + _init() { + super._init('devices', Gio.File.new_for_path('/'), _('Computer')); + + let busName = 'org.freedesktop.hostname1'; + let objPath = '/org/freedesktop/hostname1'; + new Hostname1(Gio.DBus.system, busName, objPath, (obj, error) => { + if (error) + return; + + this._proxy = obj; + this._proxyID = this._proxy.connect('g-properties-changed', + this._propertiesChanged.bind(this)); + this._propertiesChanged(obj); + }); + + } + + getIcon() { + return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); + } + + _propertiesChanged(proxy) { + // GDBusProxy will emit a g-properties-changed when hostname1 goes down + // ignore it + if (proxy.g_name_owner) { + this.name = proxy.PrettyHostname || _('Computer'); + this.emit('changed'); + } + } + + destroy() { + if (this._proxyID) { + this._proxy.disconnect(this._proxyID); + this._proxy = 0; + } + if (this._proxy) { + this._proxy.run_dispose(); + this._proxy = null; + } + super.destroy(); + } +}; + + +var PlaceDeviceInfo = class Arc_Menu_PlaceDeviceInfo extends PlaceInfo { + _init(kind, mount) { + this._mount = mount; + super._init(kind, mount.get_root(), mount.get_name()); + } + + getIcon() { + return this._mount.get_symbolic_icon(); + } + + isRemovable() { + return this._mount.can_eject(); + } + + eject() { + let unmountArgs = [ + Gio.MountUnmountFlags.NONE, + (new ShellMountOperation.ShellMountOperation(this._mount)).mountOp, + null // Gio.Cancellable + ]; + + if (this._mount.can_eject()) + this._mount.eject_with_operation(...unmountArgs, + this._ejectFinish.bind(this)); + else + this._mount.unmount_with_operation(...unmountArgs, + this._unmountFinish.bind(this)); + } + + _ejectFinish(mount, result) { + try { + mount.eject_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } + } + + _unmountFinish(mount, result) { + try { + mount.unmount_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } + } + + _reportFailure(exception) { + let msg = _('Ejecting drive “%s” failed:').format(this._mount.get_name()); + Main.notifyError(msg, exception.message); + } +}; + +var PlaceVolumeInfo = class Arc_Menu_PlaceVolumeInfo extends PlaceInfo { + _init(kind, volume) { + this._volume = volume; + super._init(kind, volume.get_activation_root(), volume.get_name()); + } + + launch(timestamp) { + if (this.file) { + super.launch(timestamp); + return; + } + + this._volume.mount(0, null, null, (volume, result) => { + volume.mount_finish(result); + + let mount = volume.get_mount(); + this.file = mount.get_root(); + super.launch(timestamp); + }); + } + + getIcon() { + return this._volume.get_symbolic_icon(); + } +}; + +const DefaultDirectories = [ + GLib.UserDirectory.DIRECTORY_DOCUMENTS, + GLib.UserDirectory.DIRECTORY_PICTURES, + GLib.UserDirectory.DIRECTORY_MUSIC, + GLib.UserDirectory.DIRECTORY_DOWNLOAD, + GLib.UserDirectory.DIRECTORY_VIDEOS, +]; + +var PlacesManager = class Arc_Menu_PlacesManager { + constructor() { + this._places = { + special: [], + devices: [], + bookmarks: [], + network: [], + }; + + this._settings = new Gio.Settings({ schema_id: BACKGROUND_SCHEMA }); + this._showDesktopIconsChangedId = + this._settings.connect('changed::show-desktop-icons', + this._updateSpecials.bind(this)); + this._updateSpecials(); + + /* + * Show devices, code more or less ported from nautilus-places-sidebar.c + */ + this._volumeMonitor = Gio.VolumeMonitor.get(); + this._connectVolumeMonitorSignals(); + this._updateMounts(); + + this._bookmarksFile = this._findBookmarksFile(); + this._bookmarkTimeoutId = 0; + this._monitor = null; + + if (this._bookmarksFile) { + this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null); + this._monitor.connect('changed', () => { + if (this._bookmarkTimeoutId > 0) + return; + /* Defensive event compression */ + this._bookmarkTimeoutId = GLib.timeout_add( + GLib.PRIORITY_DEFAULT, 100, () => { + this._bookmarkTimeoutId = 0; + this._reloadBookmarks(); + return false; + }); + }); + + this._reloadBookmarks(); + } + } + + _connectVolumeMonitorSignals() { + const signals = [ + 'volume-added', + 'volume-removed', + 'volume-changed', + 'mount-added', + 'mount-removed', + 'mount-changed', + 'drive-connected', + 'drive-disconnected', + 'drive-changed' + ]; + + this._volumeMonitorSignals = []; + let func = this._updateMounts.bind(this); + for (let i = 0; i < signals.length; i++) { + let id = this._volumeMonitor.connect(signals[i], func); + this._volumeMonitorSignals.push(id); + } + } + + destroy() { + if (this._settings) + this._settings.disconnect(this._showDesktopIconsChangedId); + this._settings = null; + + for (let i = 0; i < this._volumeMonitorSignals.length; i++) + this._volumeMonitor.disconnect(this._volumeMonitorSignals[i]); + + if (this._monitor) + this._monitor.cancel(); + if (this._bookmarkTimeoutId) + GLib.source_remove(this._bookmarkTimeoutId); + } + + _updateSpecials() { + this._places.special.forEach(p => p.destroy()); + this._places.special = []; + + let homePath = GLib.get_home_dir(); + + this._places.special.push(new PlaceInfo('special', + Gio.File.new_for_path(homePath), + _('Home'))); + + let specials = []; + let dirs = DefaultDirectories.slice(); + + if (this._settings.get_boolean('show-desktop-icons')) + dirs.push(GLib.UserDirectory.DIRECTORY_DESKTOP); + + for (let i = 0; i < dirs.length; i++) { + let specialPath = GLib.get_user_special_dir(dirs[i]); + if (specialPath == null || specialPath == homePath) + continue; + + let file = Gio.File.new_for_path(specialPath), info; + try { + info = new PlaceInfo('special', file); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + continue; + throw e; + } + + specials.push(info); + } + + specials.sort((a, b) => GLib.utf8_collate(a.name, b.name)); + this._places.special = this._places.special.concat(specials); + + this.emit('special-updated'); + } + + _updateMounts() { + let networkMounts = []; + let networkVolumes = []; + + this._places.devices.forEach(p => p.destroy()); + this._places.devices = []; + this._places.network.forEach(p => p.destroy()); + this._places.network = []; + + /* Add standard places */ + // this._places.devices.push(new RootInfo()); + /* this._places.network.push(new PlaceInfo('network', + Gio.File.new_for_uri('network:///'), + _('Network'), + 'network-workgroup-symbolic'));*/ + + /* first go through all connected drives */ + let drives = this._volumeMonitor.get_connected_drives(); + for (let i = 0; i < drives.length; i++) { + let volumes = drives[i].get_volumes(); + + for (let j = 0; j < volumes.length; j++) { + let identifier = volumes[j].get_identifier('class'); + if (identifier && identifier.includes('network')) { + networkVolumes.push(volumes[j]); + } else { + let mount = volumes[j].get_mount(); + if (mount != null) + this._addMount('devices', mount); + } + } + } + + /* add all volumes that is not associated with a drive */ + let volumes = this._volumeMonitor.get_volumes(); + for (let i = 0; i < volumes.length; i++) { + if (volumes[i].get_drive() != null) + continue; + + let identifier = volumes[i].get_identifier('class'); + if (identifier && identifier.includes('network')) { + networkVolumes.push(volumes[i]); + } else { + let mount = volumes[i].get_mount(); + if (mount != null) + this._addMount('devices', mount); + } + } + + /* add mounts that have no volume (/etc/mtab mounts, ftp, sftp,...) */ + let mounts = this._volumeMonitor.get_mounts(); + for (let i = 0; i < mounts.length; i++) { + if (mounts[i].is_shadowed()) + continue; + + if (mounts[i].get_volume()) + continue; + + let root = mounts[i].get_default_location(); + if (!root.is_native()) { + networkMounts.push(mounts[i]); + continue; + } + this._addMount('devices', mounts[i]); + } + + for (let i = 0; i < networkVolumes.length; i++) { + let mount = networkVolumes[i].get_mount(); + if (mount) { + networkMounts.push(mount); + continue; + } + this._addVolume('network', networkVolumes[i]); + } + + for (let i = 0; i < networkMounts.length; i++) { + this._addMount('network', networkMounts[i]); + } + + this.emit('devices-updated'); + this.emit('network-updated'); + } + + _findBookmarksFile() { + let paths = [ + GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']), + GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']), + ]; + + for (let i = 0; i < paths.length; i++) { + if (GLib.file_test(paths[i], GLib.FileTest.EXISTS)) + return Gio.File.new_for_path(paths[i]); + } + + return null; + } + + _reloadBookmarks() { + + this._bookmarks = []; + + let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path()); + let lines = content.split('\n'); + + let bookmarks = []; + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; + let components = line.split(' '); + let bookmark = components[0]; + + if (!bookmark) + continue; + + let file = Gio.File.new_for_uri(bookmark); + if (file.is_native() && !file.query_exists(null)) + continue; + + let duplicate = false; + for (let i = 0; i < this._places.special.length; i++) { + if (file.equal(this._places.special[i].file)) { + duplicate = true; + break; + } + } + if (duplicate) + continue; + for (let i = 0; i < bookmarks.length; i++) { + if (file.equal(bookmarks[i].file)) { + duplicate = true; + break; + } + } + if (duplicate) + continue; + + let label = null; + if (components.length > 1) + label = components.slice(1).join(' '); + + bookmarks.push(new PlaceInfo('bookmarks', file, label)); + } + + this._places.bookmarks = bookmarks; + + this.emit('bookmarks-updated'); + } + + _addMount(kind, mount) { + let devItem; + + try { + devItem = new PlaceDeviceInfo(kind, mount); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + return; + throw e; + } + + this._places[kind].push(devItem); + } + + _addVolume(kind, volume) { + let volItem; + + try { + volItem = new PlaceVolumeInfo(kind, volume); + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + return; + throw e; + } + + this._places[kind].push(volItem); + } + + get(kind) { + return this._places[kind]; + } +}; +Signals.addSignalMethods(PlacesManager.prototype); + +//Trash can class implemented from Dash to Dock https://github.com/micheleg/dash-to-dock/blob/master/locations.js +var Trash = class Arc_Menu_Trash { + constructor(menuItem) { + this._menuItem = menuItem; + let trashPath = GLib.get_home_dir() + '/.local/share/Trash/files/'; + this._file = Gio.file_new_for_path(trashPath); + try { + this._monitor = this._file.monitor_directory(0, null); + this._signalId = this._monitor.connect( + 'changed', + this._onTrashChange.bind(this) + ); + } catch (e) { + log(`Impossible to monitor trash: ${e}`); + } + this._lastEmpty = true; + this._empty = true; + this._schedUpdateId = 0; + this._updateTrash(); + } + + destroy() { + if (this._monitor) { + this._monitor.disconnect(this._signalId); + this._monitor.run_dispose(); + } + this._file.run_dispose(); + } + + _onTrashChange() { + if (this._schedUpdateId) { + GLib.source_remove(this._schedUpdateId); + } + this._schedUpdateId = GLib.timeout_add( + GLib.PRIORITY_DEFAULT, 500, () => { + this._schedUpdateId = 0; + this._updateTrash(); + return GLib.SOURCE_REMOVE; + }); + } + + _updateTrash() { + try { + let children = this._file.enumerate_children('*', 0, null); + this._empty = children.next_file(null) == null; + children.close(null); + } catch (e) { + log(`Impossible to enumerate trash children: ${e}`) + return; + } + + this._ensureApp(); + } + + _ensureApp() { + if (this._trashApp == null || + this._lastEmpty != this._empty) { + let trashKeys = new GLib.KeyFile(); + trashKeys.set_string('Desktop Entry', 'Name', _('Trash')); + trashKeys.set_string('Desktop Entry', 'Id', 'ArcMenu_Trash'); + trashKeys.set_string('Desktop Entry', 'Icon', + this._empty ? 'user-trash-symbolic' : 'user-trash-full-symbolic'); + trashKeys.set_string('Desktop Entry', 'Type', 'Application'); + trashKeys.set_string('Desktop Entry', 'Exec', 'gio open trash:///'); + trashKeys.set_string('Desktop Entry', 'StartupNotify', 'false'); + trashKeys.set_string('Desktop Entry', 'XdtdUri', 'trash:///'); + if (!this._empty) { + trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash;'); + trashKeys.set_string('Desktop Action empty-trash', 'Name', _('Empty Trash')); + trashKeys.set_string('Desktop Action empty-trash', 'Exec', + 'dbus-send --print-reply --dest=org.gnome.Nautilus /org/gnome/Nautilus org.gnome.Nautilus.FileOperations.EmptyTrash'); + } + else{ + trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash-inactive;'); + trashKeys.set_string('Desktop Action empty-trash-inactive', 'Name', _('Empty Trash')); + } + + let trashAppInfo = Gio.DesktopAppInfo.new_from_keyfile(trashKeys); + this._trashApp = new Shell.App({appInfo: trashAppInfo}); + this._lastEmpty = this._empty; + + this._menuItem._app = this._trashApp; + if(this._menuItem.contextMenu) + this._menuItem.contextMenu._app = this._trashApp; + let trashIcon = this._trashApp.create_icon_texture(Constants.MEDIUM_ICON_SIZE); + if(this._menuItem._iconBin && trashIcon) + this._menuItem.iconName = trashIcon.gicon.to_string(); + this._menuItem._updateIcon(); + this.emit('changed'); + } + } + + getApp() { + this._ensureApp(); + return this._trashApp; + } +} +Signals.addSignalMethods(Trash.prototype); diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefs.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefs.js new file mode 100644 index 0000000..916491b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefs.js @@ -0,0 +1,6786 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const ByteArray = imports.byteArray; +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const LayoutTweaks = Me.imports.menulayouts.tweaks; +const PW = Me.imports.prefsWidgets; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const SCHEMA_PATH = '/org/gnome/shell/extensions/arcmenu/'; +const GSET = 'gnome-shell-extension-tool'; + +var MenuSettingsPinnedAppsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsPinnedAppsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + + this.pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.pinnedAppsScrollWindow.set_min_content_height(300); + this.pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + this.frame = new PW.FrameBox(); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + halign: Gtk.Align.END, + vexpand: false, + valign: Gtk.Align.END + }); + this._loadPinnedApps(this._settings.get_strv('pinned-app-list')); + this.pinnedAppsScrollWindow.set_child(this.frame); + this.mainBox.append(this.pinnedAppsScrollWindow); + + let addPinnedAppsFrame = new PW.FrameBox(); + let addPinnedAppsFrameRow = new PW.FrameBoxRow(); + let addPinnedAppsFrameLabel = new Gtk.Label({ + label: _("Add More Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addPinnedAppsButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addPinnedAppsButton.connect('clicked', ()=> { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.DEFAULT); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array = []; + for(let i = 0; i < newPinnedApps.length; i++){ + array.push(newPinnedApps[i]._name); + array.push(newPinnedApps[i]._icon); + array.push(newPinnedApps[i]._cmd); + } + this._loadPinnedApps(array); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addPinnedAppsFrameRow.add(addPinnedAppsFrameLabel); + addPinnedAppsFrameRow.add(addPinnedAppsButton); + addPinnedAppsFrame.add(addPinnedAppsFrameRow); + this.mainBox.append(addPinnedAppsFrame); + + let addCustomAppFrame = new PW.FrameBox(); + let addCustomAppFrameRow = new PW.FrameBoxRow(); + let addCustomAppFrameLabel = new Gtk.Label({ + label: _("Add Custom Shortcut"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addCustomAppButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addCustomAppButton.connect('clicked', ()=> { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DEFAULT); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps(newPinnedApps); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let x = 0; x < this.frame.count; x++) { + array.push(this.frame.get_index(x)._name); + array.push(this.frame.get_index(x)._icon); + array.push(this.frame.get_index(x)._cmd); + } + this._settings.set_strv('pinned-app-list',array); + this.saveButton.set_sensitive(false); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + _loadPinnedApps(array) { + for(let i = 0; i < array.length; i += 3) { + let frameRow = new PW.FrameBoxDragRow(this.pinnedAppsScrollWindow); + let iconString; + frameRow._name = array[i]; + frameRow._icon = array[i + 1]; + frameRow._cmd = array[i + 2]; + frameRow.saveButton = this.saveButton; + if(frameRow._icon === "ArcMenu_ArcMenuIcon"){ + frameRow._icon = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + } + iconString = frameRow._icon; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString); + let arcMenuImage = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + + let arcMenuImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + arcMenuImageBox.append(dragImage); + arcMenuImageBox.append(arcMenuImage); + frameRow.add(arcMenuImageBox); + + let frameLabel = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true + }); + + frameLabel.label = _(frameRow._name); + + checkIfValidShortcut(frameRow, frameLabel, arcMenuImage); + + frameRow.add(frameLabel); + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.frame, + buttons: [this.saveButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DEFAULT, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + frameRow._name = newPinnedApps[0]; + frameRow._icon = newPinnedApps[1]; + frameRow._cmd = newPinnedApps[2]; + frameLabel.label = _(frameRow._name); + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)) + arcMenuImage.gicon = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon(); + else + arcMenuImage.gicon = Gio.icon_new_for_string(frameRow._icon); + dialog.destroy(); + this.frame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + frameRow.add(buttonBox); + this.frame.add(frameRow); + } + } +}); + +var AddAppsToPinnedListWindow = GObject.registerClass( + class Arc_Menu_AddAppsToPinnedListWindow extends PW.DialogWindow { + _init(settings, parent, dialogType) { + this._settings = settings; + this._dialogType = dialogType; + if(this._dialogType == Constants.DiaglogType.DEFAULT) + super._init(_('Add to your Pinned Apps'), parent); + else if(this._dialogType == Constants.DiaglogType.OTHER) + super._init(_('Change Selected Pinned App'), parent); + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS) + super._init(_('Select Application Shortcuts'), parent); + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + super._init(_('Select Directory Shortcuts'), parent); + this.newPinnedAppsArray=[]; + this.addResponse = false; + } + + _createLayout(vbox) { + let searchBar = new Gtk.SearchEntry({ + placeholder_text: _("Search…") + }); + searchBar.connect('search-changed', ()=> { + this._loadCategories(); + let applist = Gio.app_info_get_all(); + + let pattern = searchBar.text; + let searchResults = []; + let res = []; + for (let i in applist) { + let app = applist[i]; + let match; + + match = app.get_name().toLowerCase() + " "; + let info = Gio.DesktopAppInfo.new(app.get_id()); + + if (info.get_display_name()) + match += info.get_display_name().toLowerCase() + " "; + if (info.get_executable()) + match += info.get_executable().toLowerCase() + " "; + if (info.get_keywords()) + match += info.get_keywords().toString().toLowerCase() + " "; + if (app.get_description()) + match += app.get_description().toLowerCase(); + + + let index = match.indexOf(pattern); + if (index != -1) { + searchResults.push([index, app]); + } + } + let arcMenuSettings = _("ArcMenu Settings").toLowerCase(); + let index = arcMenuSettings.indexOf(pattern); + let showArcMenuSettings = false; + if (index != -1) { + showArcMenuSettings = true; + } + + searchResults.sort(function(a,b) { + return a[0] > b[0]; + }); + res = searchResults.map(function(value,index) { return value[1]; }); + this.appsFrame.remove_all_children(); + this._loadCategories(res, showArcMenuSettings); + this.appsFrame.show(); + + }); + + let pinnedAppsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + pinnedAppsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + pinnedAppsScrollWindow.set_min_content_height(400); + pinnedAppsScrollWindow.set_min_content_width(650); + this.appsFrame = new PW.FrameBox(); + let addAppsButton; + if(this._dialogType == Constants.DiaglogType.DEFAULT || this._dialogType == Constants.DiaglogType.APPLICATIONS + || this._dialogType == Constants.DiaglogType.DIRECTORIES){ + addAppsButton = new Gtk.Button({ + label: _("Add") + }); + + addAppsButton.connect('clicked', ()=> { + this.addResponse = true; + this.response(-10); + }); + addAppsButton.set_halign(Gtk.Align.END); + } + + pinnedAppsScrollWindow.set_child(this.appsFrame); + vbox.append(pinnedAppsScrollWindow); + if(this._dialogType == Constants.DiaglogType.DEFAULT){ + this._loadCategories(); + vbox.append(addAppsButton); + vbox.prepend(searchBar); + } + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES){ + let defaultApplicationShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"]); + defaultApplicationShortcuts.push([_("Network"), "ArcMenu_Network", "ArcMenu_Network"]); + defaultApplicationShortcuts.push([_("Trash"), "user-trash-symbolic", "ArcMenu_Trash"]); + defaultApplicationShortcuts.push([_("Recent"), "document-open-recent-symbolic", "ArcMenu_Recent"]); + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(getIconPath(defaultApplicationShortcuts[i])), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) + this.newPinnedAppsArray.push(frameRow); + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + this.appsFrame.add(frameRow); + } + vbox.append(addAppsButton); + } + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS){ + this._loadCategories(); + let defaultApplicationShortcutsFrame = new PW.FrameBox(); + let defaultApplicationShortcuts = this._settings.get_default_value('application-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("ArcMenu Settings"), Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg', Constants.ArcMenuSettingsCommand]); + defaultApplicationShortcuts.push([_("Run Command..."), "system-run-symbolic", "ArcMenu_RunCommand"]); + defaultApplicationShortcuts.push([_("Show All Applications"), "view-fullscreen-symbolic", "ArcMenu_ShowAllApplications"]); + + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(frameRow._icon), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) { + this.newPinnedAppsArray.push(frameRow); + } + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + + defaultApplicationShortcutsFrame.add(frameRow); + + } + let notebook = new PW.Notebook(); + + let defaultAppsPage = new PW.NotebookPage(_("Default Apps")); + notebook.append_page(defaultAppsPage); + defaultAppsPage.append(defaultApplicationShortcutsFrame); + vbox.remove(pinnedAppsScrollWindow); + let systemAppsPage = new PW.NotebookPage(_("System Apps")); + notebook.append_page(systemAppsPage); + systemAppsPage.append(pinnedAppsScrollWindow); + systemAppsPage.prepend(searchBar); + + vbox.append(notebook); + vbox.append(addAppsButton); + } + else{ + this._loadCategories(); + let defaultAppsWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + defaultAppsWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + defaultAppsWindow.set_min_content_width(500); + defaultAppsWindow.set_min_content_width(500); + + let defaultApplicationShortcutsFrame = new PW.FrameBox(); + defaultAppsWindow.set_child(defaultApplicationShortcutsFrame); + let defaultApplicationShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + defaultApplicationShortcuts.push([_("Computer"), "ArcMenu_Computer", "ArcMenu_Computer"]); + defaultApplicationShortcuts.push([_("Network"), "ArcMenu_Network", "ArcMenu_Network"]); + defaultApplicationShortcuts.push([_("Trash"), "user-trash-symbolic", "ArcMenu_Trash"]); + defaultApplicationShortcuts.push([_("Lock"), "changes-prevent-symbolic", "ArcMenu_Lock"]); + defaultApplicationShortcuts.push([_("Log Out"), "application-exit-symbolic", "ArcMenu_LogOut"]); + defaultApplicationShortcuts.push([_("Power Off"), "system-shutdown-symbolic", "ArcMenu_PowerOff"]); + defaultApplicationShortcuts.push([_("Restart"), 'system-reboot-symbolic', "ArcMenu_Restart"]); + defaultApplicationShortcuts.push([_("Suspend"), "media-playback-pause-symbolic", "ArcMenu_Suspend"]); + defaultApplicationShortcuts.push([_("Hybrid Sleep"), Me.path + Constants.SleepIcon.PATH, "ArcMenu_HybridSleep"]); + defaultApplicationShortcuts.push([_("Hibernate"), "document-save-symbolic", "ArcMenu_Hibernate"]); + for(let i = 0;i < defaultApplicationShortcuts.length; i++) { + let frameRow = new PW.FrameBoxRow(); + + frameRow._name = _(defaultApplicationShortcuts[i][0]); + frameRow._icon = defaultApplicationShortcuts[i][1]; + frameRow._cmd = defaultApplicationShortcuts[i][2]; + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(getIconPath(defaultApplicationShortcuts[i])), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + + + let checkButton = new PW.Button({ + icon_name: 'list-add-symbolic' + }); + checkButton.margin_end = 20; + checkButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(frameRow._name, frameRow._icon, frameRow._cmd); + this.addResponse = true; + this.response(-10); + }); + frameRow.add(checkButton); + + defaultApplicationShortcutsFrame.add(frameRow); + + } + let notebook = new PW.Notebook(); + + let defaultAppsPage = new PW.NotebookPage(_("Presets")); + notebook.append_page(defaultAppsPage); + defaultAppsPage.append(defaultAppsWindow); + vbox.remove(pinnedAppsScrollWindow); + let systemAppsPage = new PW.NotebookPage(_("System Apps")); + notebook.append_page(systemAppsPage); + systemAppsPage.append(pinnedAppsScrollWindow); + systemAppsPage.prepend(searchBar); + + vbox.append(notebook); + } + } + + get_newPinnedAppsArray() { + return this.newPinnedAppsArray; + } + + get_response() { + return this.addResponse; + } + + _loadCategories(searchResults, showArcMenuSettings) { + let allApps = searchResults ? searchResults : Gio.app_info_get_all(); + allApps.sort((a, b) => { + let _a = a.get_display_name(); + let _b = b.get_display_name(); + return GLib.strcmp0(_a, _b); + }); + + let iter = -1; + if(searchResults) + iter = 0; + if(showArcMenuSettings) + iter = -1; + for(let i = iter; i < allApps.length; i++) { + if(i == -1 ? true : allApps[i].should_show()) { + let frameRow = new PW.FrameBoxRow(); + let icon; + if(i == -1){ + frameRow._name = _("ArcMenu Settings"); + icon = frameRow._icon = Me.path + '/media/icons/menu_icons/arc-menu-symbolic.svg'; + frameRow._cmd = Constants.ArcMenuSettingsCommand; + } + else{ + frameRow._app = allApps[i]; + frameRow._name = allApps[i].get_display_name(); + frameRow._icon = ''; + if(allApps[i].get_icon()) + icon = allApps[i].get_icon().to_string(); + else + icon = "dialog-information"; + + frameRow._cmd = allApps[i].get_id(); + } + + let iconImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string(icon), + pixel_size: 22 + }); + + let iconImageBox = new Gtk.Box( { + margin_start: 5, + hexpand: false, + vexpand: false + }); + iconImageBox.append(iconImage); + frameRow.add(iconImageBox); + + let frameLabel = new Gtk.Label( { + use_markup: false, + xalign: 0, + hexpand: true + }); + frameLabel.label = frameRow._name; + frameRow.add(frameLabel); + if(this._dialogType == Constants.DiaglogType.DEFAULT || this._dialogType == Constants.DiaglogType.APPLICATIONS|| + this._dialogType == Constants.DiaglogType.DIRECTORIES){ + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', ()=> { + if(checkButton.get_active()) + this.newPinnedAppsArray.push(frameRow); + else { + let index= this.newPinnedAppsArray.indexOf(frameRow); + this.newPinnedAppsArray.splice(index,1); + } + }); + frameRow.add(checkButton); + } + else{ + let checkButton = new PW.Button({ + icon_name: 'list-add-symbolic' + }); + checkButton.margin_end = 20; + checkButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(frameRow._name, frameRow._icon, frameRow._cmd); + this.addResponse = true; + this.response(-10); + }); + frameRow.add(checkButton); + } + + this.appsFrame.add(frameRow); + } + } + } +}); + +var AddCustomLinkDialogWindow = GObject.registerClass( + class Arc_Menu_AddCustomLinkDialogWindow extends PW.DialogWindow { + _init(settings, parent, dialogType, isAppEdit=false, appArray=null) { + this._settings = settings; + this.newPinnedAppsArray=[]; + this.addResponse = false; + this.isAppEdit = isAppEdit; + this._dialogType = dialogType; + this.appArray = appArray; + if(this._dialogType == Constants.DiaglogType.DEFAULT) + super._init(isAppEdit?_('Edit Pinned App'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.OTHER) + super._init(isAppEdit?_('Edit Pinned App'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.APPLICATIONS) + super._init(isAppEdit?_('Edit Shortcut'):_('Add a Custom Shortcut'), parent); + else if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + super._init(isAppEdit?_('Edit Custom Shortcut'):_('Add a Custom Shortcut'), parent); + } + + _createLayout(vbox) { + let mainFrame = new PW.FrameBox(); + let nameFrameRow = new PW.FrameBoxRow(); + let nameFrameLabel = new Gtk.Label({ + label: _('Shortcut Name:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let nameEntry = new Gtk.Entry(); + nameEntry.set_width_chars(35); + nameFrameRow.add(nameFrameLabel); + nameFrameRow.add(nameEntry); + nameEntry.grab_focus(); + mainFrame.add(nameFrameRow); + + let iconFrameRow = new PW.FrameBoxRow(); + let iconFrameLabel = new Gtk.Label({ + label: _("Icon:"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let iconEntry = new Gtk.Entry(); + iconEntry.set_width_chars(35); + + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + let fileChooserButton = new Gtk.Button({ + label: _('Browse...') + }); + + fileChooserButton.connect('clicked', (widget) => { + let dialog = new Gtk.FileChooserDialog({ + title: _('Select an Icon'), + transient_for: this.get_root(), + modal: true, + action: Gtk.FileChooserAction.OPEN, + }); + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button("_Open", Gtk.ResponseType.ACCEPT); + + dialog.set_filter(fileFilter); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + let iconFilepath = dialog.get_file().get_path(); + iconEntry.set_text(iconFilepath); + dialog.destroy(); + } + else if(response === Gtk.ResponseType.CANCEL) + dialog.destroy(); + }) + + dialog.show(); + }); + + iconFrameRow.add(iconFrameLabel); + iconFrameRow.add(fileChooserButton); + iconFrameRow.add(iconEntry); + mainFrame.add(iconFrameRow); + if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + iconEntry.set_text("ArcMenu_Folder"); + + let cmdFrameRow = new PW.FrameBoxRow(); + let cmdFrameLabel = new Gtk.Label({ + label: _('Terminal Command:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + if(this._dialogType == Constants.DiaglogType.DIRECTORIES) + cmdFrameLabel.label = _("Shortcut Path:"); + let cmdEntry = new Gtk.Entry(); + cmdEntry.set_width_chars(35); + cmdFrameRow.add(cmdFrameLabel); + cmdFrameRow.add(cmdEntry); + mainFrame.add(cmdFrameRow); + + let addButton = new Gtk.Button({ + label: this.isAppEdit ?_("Apply") :_("Add") + }); + + if(this.appArray!=null) { + nameEntry.text=this.appArray[0]; + iconEntry.text=this.appArray[1]; + cmdEntry.text=this.appArray[2]; + } + addButton.connect('clicked', ()=> { + this.newPinnedAppsArray.push(nameEntry.get_text()); + this.newPinnedAppsArray.push(iconEntry.get_text()); + this.newPinnedAppsArray.push(cmdEntry.get_text()); + this.addResponse = true; + this.response(-10); + }); + addButton.set_halign(Gtk.Align.END); + + vbox.append(mainFrame); + vbox.append(addButton); + } + + get_newPinnedAppsArray(){ + return this.newPinnedAppsArray; + } + + get_response(){ + return this.addResponse; + } +}); + +var GeneralPage = GObject.registerClass( + class Arc_Menu_GeneralPage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let arcMenuPlacementHeader = new Gtk.Label({ + label: "" + _("Display Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(arcMenuPlacementHeader); + let menuPlacementFrame = new PW.FrameBox(); + this._createDisplayOnFrame(menuPlacementFrame, true); + this._settings.connect('changed::available-placement', ()=>{ + menuPlacementFrame.remove_all_children(); + this._createDisplayOnFrame(menuPlacementFrame, false); + menuPlacementFrame.show(); + }) + + this.mainBox.append(menuPlacementFrame); + + let hotCornerHeader = new Gtk.Label({ + label: "" + _("Hot Corner Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(hotCornerHeader); + + let modifyHotCornerFrame = new PW.FrameBox(); + let modifyHotCornerRow = new PW.FrameBoxRow(); + let modifyHotCornerLabel = new Gtk.Label({ + label: _("Modify Hot Corner"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let modifyHotCornerButton = new PW.Button({ + icon_name: 'emblem-system-symbolic', + }); + modifyHotCornerButton.connect('clicked', ()=> { + let dialog = new ModifyHotCornerDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', ()=> { + dialog.destroy(); + }); + }); + let modifyHotCornerSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + modifyHotCornerSwitch.set_active(this._settings.get_boolean('override-hot-corners')); + modifyHotCornerButton.set_sensitive(this._settings.get_boolean('override-hot-corners')); + modifyHotCornerSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('override-hot-corners',widget.get_active()); + modifyHotCornerButton.set_sensitive(widget.get_active()); + if(!widget.get_active()){ + this._settings.set_enum('hot-corners',Constants.HotCornerAction.DEFAULT); + } + }); + modifyHotCornerRow.add(modifyHotCornerLabel); + modifyHotCornerRow.add(modifyHotCornerButton); + modifyHotCornerRow.add(modifyHotCornerSwitch); + modifyHotCornerFrame.add(modifyHotCornerRow); + this.mainBox.append(modifyHotCornerFrame); + + let menuHotkeyHeader = new Gtk.Label({ + label: "" + _("Hotkey Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuHotkeyHeader); + + let menuHotKeyFrame = this._createHotkeyFrame(true); + this.mainBox.append(menuHotKeyFrame); + + let runnerHeaderLabel = new Gtk.Label({ + label: "" + _("Standalone Runner Menu") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(runnerHeaderLabel); + + let runnerHotkeyFrame = this._createHotkeyFrame(false); + this.mainBox.append(runnerHotkeyFrame); + } + + _createHotkeyFrame(isMenuHotkey){ + let hotkeyFrame = new PW.FrameBox(); + let enableRunnerMenuSwitch, hotkeyEnumSetting, customHotkeySetting, primaryMonitorSetting; + if(isMenuHotkey){ + hotkeyEnumSetting = 'menu-hotkey'; + customHotkeySetting = 'toggle-arcmenu'; + primaryMonitorSetting = 'hotkey-open-primary-monitor'; + } + else{ + hotkeyEnumSetting = 'runner-menu-hotkey'; + customHotkeySetting = 'toggle-runner-menu'; + primaryMonitorSetting = 'runner-hotkey-open-primary-monitor'; + let enableRunnerMenuRow = new PW.FrameBoxRow(); + let enableRunnerMenuLabel = new Gtk.Label({ + label: _("Enable a standalone Runner menu"), + use_markup: true, + xalign: 0, + hexpand: true + }); + enableRunnerMenuSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + enableRunnerMenuSwitch.set_active(this._settings.get_boolean('enable-standlone-runner-menu')); + enableRunnerMenuSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-standlone-runner-menu', widget.get_active()); + if(!widget.get_active()){ + hotkeyFrame.removeChildrenAfterIndex(0); + } + else{ + hotkeyFrame.add(hotkeyRow); + if(this._settings.get_enum(hotkeyEnumSetting) === 0) + hotkeyFrame.add(primaryMonitorRow); + if(this._settings.get_enum(hotkeyEnumSetting) === 1){ + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + } + } + }); + enableRunnerMenuRow.add(enableRunnerMenuLabel); + enableRunnerMenuRow.add(enableRunnerMenuSwitch); + hotkeyFrame.add(enableRunnerMenuRow); + } + + let hotkeyActivationRow = new PW.FrameBoxRow(); + let hotkeyActivationLabel = new Gtk.Label({ + label: _("Hotkey Activation"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotkeyActivationCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + hotkeyActivationCombo.append_text(_("Key Release")); + hotkeyActivationCombo.append_text(_("Key Press")); + if(this._settings.get_boolean('disable-hotkey-onkeyrelease')) + hotkeyActivationCombo.set_active(1); + else + hotkeyActivationCombo.set_active(0); + hotkeyActivationCombo.connect('changed', (widget) => { + if(widget.get_active() === 0) + this._settings.set_boolean('disable-hotkey-onkeyrelease',false); + if(widget.get_active() === 1) + this._settings.set_boolean('disable-hotkey-onkeyrelease',true); + }); + + hotkeyActivationRow.add(hotkeyActivationLabel); + hotkeyActivationRow.add(hotkeyActivationCombo); + + let primaryMonitorRow = new PW.FrameBoxRow(); + let primaryMonitorLabel = new Gtk.Label({ + label: _("Open on Primary Monitor"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let primaryMonitorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + primaryMonitorSwitch.set_active(this._settings.get_boolean(primaryMonitorSetting)); + primaryMonitorSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean(primaryMonitorSetting, widget.get_active()); + }); + primaryMonitorRow.add(primaryMonitorLabel); + primaryMonitorRow.add(primaryMonitorSwitch); + + + let hotkeyRow = new PW.FrameBoxRow(); + let hotkeyLabel = new Gtk.Label({ + label: isMenuHotkey ? _("Menu Hotkey") : _("Runner Hotkey"), + use_markup: true, + xalign: 0, + hexpand: true + }); + hotkeyRow.add(hotkeyLabel); + + let hotkeyCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + if(isMenuHotkey) + hotkeyCombo.append("NONE", _("None")); + hotkeyCombo.append("SUPER_L", _("Left Super Key")); + hotkeyCombo.append("CUSTOM", _("Custom Hotkey")); + hotkeyCombo.set_active(this._settings.get_enum(hotkeyEnumSetting)); + hotkeyCombo.connect('changed', (widget) => { + let removeIndex = isMenuHotkey ? 0 : 1; + if(widget.get_active_id() === "NONE"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + } + else if(widget.get_active_id() === "SUPER_L"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + hotkeyFrame.add(primaryMonitorRow); + } + else if(widget.get_active_id() === "CUSTOM"){ + if(hotkeyFrame.count > removeIndex + 1) + hotkeyFrame.removeChildrenAfterIndex(removeIndex); + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + hotkeyFrame.show(); + } + this._settings.set_enum(hotkeyEnumSetting, widget.get_active()); + }); + hotkeyRow.add(hotkeyCombo); + + hotkeyFrame.add(hotkeyRow); + + let customHotkeyRow = new PW.FrameBoxRow(); + let currentHotkeyLabel = new Gtk.Label( { + label: _("Current Hotkey"), + use_markup: true, + xalign: 0, + hexpand: false + }); + + let shortcutCell = new Gtk.ShortcutsShortcut({ + halign: Gtk.Align.START, + hexpand: true, + }); + shortcutCell.accelerator = this._settings.get_strv(customHotkeySetting).toString(); + + let modifyHotkeyButton = new Gtk.Button({ + label: _("Modify Hotkey"), + halign: Gtk.Align.END, + hexpand: false, + }); + customHotkeyRow.add(currentHotkeyLabel); + customHotkeyRow.add(shortcutCell); + customHotkeyRow.add(modifyHotkeyButton); + modifyHotkeyButton.connect('clicked', () => { + let dialog = new CustomHotkeyDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', () => { + let customHotKeyEnum = isMenuHotkey ? 2 : 1; + if(dialog.addResponse) { + this._settings.set_enum(hotkeyEnumSetting, 0); + this._settings.set_strv(customHotkeySetting, [dialog.resultsText]); + this._settings.set_enum(hotkeyEnumSetting, customHotKeyEnum); + shortcutCell.accelerator = dialog.resultsText; + dialog.destroy(); + } + else { + shortcutCell.accelerator = this._settings.get_strv(customHotkeySetting).toString(); + this._settings.set_enum(hotkeyEnumSetting, customHotKeyEnum); + dialog.destroy(); + } + }); + }); + + if(hotkeyCombo.get_active_id() === "SUPER_L"){ + hotkeyFrame.add(primaryMonitorRow); + } + else if(hotkeyCombo.get_active_id() === "CUSTOM"){ + hotkeyFrame.add(customHotkeyRow); + hotkeyFrame.add(hotkeyActivationRow); + hotkeyFrame.add(primaryMonitorRow); + } + + if(!isMenuHotkey && !enableRunnerMenuSwitch.get_active()) + hotkeyFrame.removeChildrenAfterIndex(0); + return hotkeyFrame; + } + + _createDisplayOnFrame(menuPlacementFrame, setComboBox){ + let menuPlacementRow = new PW.FrameBoxRow(); + let menuPlacementLabel = new Gtk.Label({ + label: _("Display ArcMenu On"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuPlacementCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + + let avaliablePlacement = this._settings.get_value('available-placement').deep_unpack(); + let dashExtensionName = _("Dash to Dock"); + let gnomeSettings = Gio.Settings.new("org.gnome.shell"); + let enabledExtensions = gnomeSettings.get_strv('enabled-extensions'); + if (enabledExtensions.includes('ubuntu-dock@ubuntu.com')) { + dashExtensionName = _("Ubuntu Dock"); + } + + menuPlacementCombo.append_text(_("Main Panel")); + menuPlacementCombo.append_text(_("Dash to Panel")); + menuPlacementCombo.append_text(dashExtensionName); + + menuPlacementRow.add(menuPlacementLabel); + menuPlacementRow.add(menuPlacementCombo); + menuPlacementFrame.add(menuPlacementRow); + + let dashToDockWarningRow = new PW.FrameBoxRow(); + let dashToDockWarningLabel = new Gtk.Label({ + label: _("Dash to Dock extension not running!") + "\n" + _("Enable Dash to Dock for this feature to work."), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let showActivitiesRow = new PW.FrameBoxRow(); + let showActivitiesLabel = new Gtk.Label({ + label: _("Show Activities Button"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let showActivitiesSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + showActivitiesSwitch.set_active(this._settings.get_boolean('show-activities-button')); + showActivitiesSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('show-activities-button', widget.get_active()); + }); + showActivitiesRow.add(showActivitiesLabel); + showActivitiesRow.add(showActivitiesSwitch); + + let warningImage = new Gtk.Image({ + icon_name: 'warning-symbolic', + pixel_size: 24 + }); + let warningImageBox = new Gtk.Box({ + margin_top: 0, + margin_bottom: 0, + margin_start: 10 + }); + warningImageBox.append(warningImage); + + if(!avaliablePlacement[Constants.ArcMenuPlacement.DASH]){ + dashToDockWarningRow.add(warningImageBox); + } + dashToDockWarningRow.add(dashToDockWarningLabel); + + let panelWarningRow = new PW.FrameBoxRow(); + let panelWarningLabel = new Gtk.Label({ + label: avaliablePlacement[Constants.ArcMenuPlacement.DTP] ? _("Main Panel not found!") : + _("Dash to Panel extension not running!") + "\n" + _("Enable Dash to Panel for this feature to work."), + use_markup: true, + xalign: 0, + hexpand: true + }); + let panelWarningImage = new Gtk.Image({ + icon_name: 'warning-symbolic', + pixel_size: 24 + }); + let panelWarningImageBox = new Gtk.Box({ + margin_top: 0, + margin_bottom: 0, + margin_start: 10 + }); + panelWarningImageBox.append(panelWarningImage); + panelWarningRow.add(panelWarningImageBox); + panelWarningRow.add(panelWarningLabel); + + let menuPositionRow = new PW.FrameBoxRow(); + let menuPositionBoxLabel = new Gtk.Label({ + label: _("Position in Panel"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let menuPositionCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + + menuPositionCombo.append_text(_('Left')); + menuPositionCombo.append_text(_('Center')); + menuPositionCombo.append_text(_('Right')); + menuPositionCombo.set_active(this._settings.get_enum('position-in-panel')); + menuPositionCombo.connect('changed', (widget) => { + if(widget.get_active() === Constants.MenuPosition.LEFT){ + if(menuPlacementFrame.get_index(2) === menuPositionAdjustmentRow) + menuPlacementFrame.remove(menuPositionAdjustmentRow); + } + else if(widget.get_active() === Constants.MenuPosition.CENTER){ + if(menuPlacementFrame.get_index(2) != menuPositionAdjustmentRow){ + menuPlacementFrame.insert(menuPositionAdjustmentRow, 2); + menuPlacementFrame.show(); + } + } + else if(widget.get_active() === Constants.MenuPosition.RIGHT){ + if(menuPlacementFrame.get_index(2) === menuPositionAdjustmentRow) + menuPlacementFrame.remove(menuPositionAdjustmentRow); + } + this._settings.set_enum('position-in-panel', widget.get_active()); + }); + + menuPositionRow.add(menuPositionBoxLabel); + menuPositionRow.add(menuPositionCombo); + + let menuPositionAdjustmentRow = new PW.FrameBoxRow(); + let menuPositionAdjustmentLabel = new Gtk.Label({ + label: _("Menu Alignment"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let alignmentScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 100, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + }); + alignmentScale.add_mark(0, Gtk.PositionType.BOTTOM, _("Left")); + alignmentScale.add_mark(50, Gtk.PositionType.BOTTOM, _("Center")); + alignmentScale.add_mark(100, Gtk.PositionType.BOTTOM, _("Right")); + + alignmentScale.set_value(this._settings.get_int('menu-position-alignment')); + alignmentScale.connect('value-changed', (widget) => { + this._settings.set_int('menu-position-alignment', widget.get_value()); + }); + menuPositionAdjustmentRow.add(menuPositionAdjustmentLabel); + menuPositionAdjustmentRow.add(alignmentScale); + + let multiMonitorRow = new PW.FrameBoxRow(); + let multiMonitorLabel = new Gtk.Label({ + label: _("Display ArcMenu on all monitors"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let multiMonitorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + multiMonitorSwitch.set_active(this._settings.get_boolean('multi-monitor')); + multiMonitorSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('multi-monitor', widget.get_active()); + }); + + multiMonitorRow.add(multiMonitorLabel); + multiMonitorRow.add(multiMonitorSwitch); + + menuPlacementCombo.connect('changed', (widget) => { + let placement = widget.get_active(); + this._settings.set_enum('arc-menu-placement', placement); + menuPlacementFrame.remove_all_children(); + menuPlacementFrame.add(menuPlacementRow); + if(menuPlacementCombo.get_active() == Constants.ArcMenuPlacement.PANEL){ + if(avaliablePlacement[Constants.ArcMenuPlacement.PANEL] === false){ + menuPlacementFrame.add(panelWarningRow); + } + else{ + menuPlacementFrame.add(menuPositionRow); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER) + menuPlacementFrame.add(menuPositionAdjustmentRow); + if(avaliablePlacement[Constants.ArcMenuPlacement.DTP]) + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + menuPlacementFrame.show(); + } + else if(menuPlacementCombo.get_active() == Constants.ArcMenuPlacement.DTP){ + if(avaliablePlacement[Constants.ArcMenuPlacement.DTP]){ + menuPlacementFrame.add(menuPositionRow); + if(this._settings.get_enum('position-in-panel') == Constants.MenuPosition.CENTER) + menuPlacementFrame.add(menuPositionAdjustmentRow); + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + else + menuPlacementFrame.add(panelWarningRow); + + menuPlacementFrame.show(); + } + else{ + if(avaliablePlacement[Constants.ArcMenuPlacement.DASH]){ + menuPlacementFrame.add(multiMonitorRow); + menuPlacementFrame.add(showActivitiesRow); + } + else + menuPlacementFrame.add(dashToDockWarningRow); + + menuPlacementFrame.show(); + } + }); + let placement = this._settings.get_enum('arc-menu-placement'); + if(setComboBox){ + if(placement == Constants.ArcMenuPlacement.PANEL && !avaliablePlacement[Constants.ArcMenuPlacement.PANEL]) + menuPlacementCombo.set_active(Constants.ArcMenuPlacement.DTP); + else if(placement == Constants.ArcMenuPlacement.DTP && !avaliablePlacement[Constants.ArcMenuPlacement.DTP]) + menuPlacementCombo.set_active(Constants.ArcMenuPlacement.PANEL); + else + menuPlacementCombo.set_active(placement); + } + else + menuPlacementCombo.set_active(placement); + } +}); + +var ModifyHotCornerDialogWindow = GObject.registerClass( + class Arc_Menu_ModifyHotCornerDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + super._init(_('Modify Hot Corner'), parent); + this.set_default_size(600,250); + } + + _createLayout(vbox) { + let modifyHotCornerFrame = new PW.FrameBox(); + let modifyHotCornerRow = new PW.FrameBoxRow(); + let modifyHotCornerLabel = new Gtk.Label({ + label: _("Hot Corner Action"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotCornerActionCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + hotCornerActionCombo.append_text(_("GNOME Default")); + hotCornerActionCombo.append_text(_("Disabled")); + hotCornerActionCombo.append_text(_("Open ArcMenu")); + hotCornerActionCombo.append_text(_("Custom")); + + let customHotCornerFrame = new PW.FrameBox(); + let customHeaderHotCornerRow = new PW.FrameBoxRow(); + + let customHeaderHotCornerLabel = new Gtk.Label({ + label: ""+_("Custom Hot Corner Action") + "\n" + _("Choose from a list of preset commands or use your own terminal command"), + use_markup: true, + xalign: 0, + hexpand: true + }); + customHeaderHotCornerRow.add(customHeaderHotCornerLabel); + + let presetCustomHotCornerRow = new PW.FrameBoxRow(); + let presetCustomHotCornerLabel = new Gtk.Label({ + label: _("Preset commands"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let hotCornerPresetsCombo = new Gtk.ComboBoxText({ + hexpand: true + }); + + hotCornerPresetsCombo.append_text(_("Show all Applications")); + hotCornerPresetsCombo.append_text(_("GNOME Terminal")); + hotCornerPresetsCombo.append_text(_("GNOME System Monitor")); + hotCornerPresetsCombo.append_text(_("GNOME Calculator")); + hotCornerPresetsCombo.append_text(_("GNOME gedit")); + hotCornerPresetsCombo.append_text(_("GNOME Screenshot")); + hotCornerPresetsCombo.append_text(_("GNOME Weather")); + hotCornerPresetsCombo.append_text(_("Run Command...")); + hotCornerPresetsCombo.connect('changed', (widget) => { + if(widget.get_active() === 0) + customHotCornerEntry.set_text("ArcMenu_ShowAllApplications"); + else if(widget.get_active() === 1) + customHotCornerEntry.set_text("gnome-terminal"); + else if(widget.get_active() === 2) + customHotCornerEntry.set_text("gnome-system-monitor"); + else if(widget.get_active() === 3) + customHotCornerEntry.set_text("gnome-calculator"); + else if(widget.get_active() === 4) + customHotCornerEntry.set_text("gedit"); + else if(widget.get_active() === 5) + customHotCornerEntry.set_text("gnome-screenshot"); + else if(widget.get_active() === 6) + customHotCornerEntry.set_text("gnome-weather"); + else if(widget.get_active() === 7) + customHotCornerEntry.set_text("ArcMenu_RunCommand"); + }); + presetCustomHotCornerRow.add(presetCustomHotCornerLabel); + presetCustomHotCornerRow.add(hotCornerPresetsCombo); + + let customHotCornerRow = new PW.FrameBoxRow(); + let customHotCornerLabel = new Gtk.Label({ + label: _("Terminal Command"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let customHotCornerEntry = new Gtk.Entry({ + }); + customHotCornerEntry.set_text(this._settings.get_string('custom-hot-corner-cmd')); + customHotCornerEntry.connect('changed', (widget) => { + applyButton.set_sensitive(true); + let index = this.checkIfMatch(customHotCornerEntry.get_text()); + hotCornerPresetsCombo.set_active(index) + }); + customHotCornerEntry.set_width_chars(40); + + let index = this.checkIfMatch(customHotCornerEntry.get_text()); + hotCornerPresetsCombo.set_active(index) + customHotCornerRow.add(customHotCornerLabel); + customHotCornerRow.add(customHotCornerEntry); + + customHotCornerFrame.add(customHeaderHotCornerRow); + customHotCornerFrame.add(presetCustomHotCornerRow); + customHotCornerFrame.add(customHotCornerRow); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + }); + applyButton.connect('clicked', () => { + this._settings.set_string('custom-hot-corner-cmd',customHotCornerEntry.get_text()); + this._settings.set_enum('hot-corners',hotCornerActionCombo.get_active()); + applyButton.set_sensitive(false); + this.addResponse = true; + this.response(-10); + }); + applyButton.set_halign(Gtk.Align.END); + applyButton.set_sensitive(false); + + + let hotCornerAction = this._settings.get_enum('hot-corners'); + hotCornerActionCombo.set_active(hotCornerAction); + hotCornerActionCombo.connect('changed', (widget) => { + applyButton.set_sensitive(true); + if(widget.get_active()==Constants.HotCornerAction.CUSTOM){ + customHotCornerFrame.set_sensitive(true); + } + else{ + customHotCornerFrame.set_sensitive(false); + } + }); + + modifyHotCornerRow.add(modifyHotCornerLabel); + modifyHotCornerRow.add(hotCornerActionCombo); + modifyHotCornerFrame.add(modifyHotCornerRow); + if(hotCornerActionCombo.get_active() == Constants.HotCornerAction.CUSTOM) + customHotCornerFrame.set_sensitive(true); + else + customHotCornerFrame.set_sensitive(false); + vbox.append(modifyHotCornerFrame); + vbox.append(customHotCornerFrame); + vbox.append(applyButton); + } + checkIfMatch(text){ + if(text === "ArcMenu_ShowAllApplications") + return 0; + else if(text === "gnome-terminal") + return 1; + else if(text === "gnome-system-monitor") + return 2; + else if(text === "gnome-calculator") + return 3; + else if(text === "gedit") + return 4; + else if(text === "gnome-screenshot") + return 5; + else if(text === "gnome-weather") + return 6; + else if(text === "ArcMenu_RunCommand") + return 7; + else + return -1; + } +}); + +var CustomHotkeyDialogWindow = GObject.registerClass({ + Signals: { + 'response': { param_types: [GObject.TYPE_INT] }, + }, +}, + class Arc_Menu_CustomHotkeyDialogWindow extends Gtk.Window { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + this.keyEventController = new Gtk.EventControllerKey(); + + super._init({ + modal: true, + title: _("Set Custom Hotkey"), + transient_for: parent.get_root() + }); + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + hexpand: true, + halign: Gtk.Align.FILL + }); + this.set_child(vbox); + this._createLayout(vbox); + this.add_controller(this.keyEventController); + this.set_size_request(500, 250); + } + + _createLayout(vbox) { + let hotkeyKey = ''; + + let modLabel = new Gtk.Label({ + label:_("Choose Modifiers"), + use_markup: true, + hexpand: true, + halign: Gtk.Align.START + }); + let modFrame = new PW.FrameBox(); + let modRow = new PW.FrameBoxRow(); + modRow.add(modLabel); + + let buttonBox = new Gtk.Box({ + hexpand: true, + halign: Gtk.Align.END, + spacing: 5 + }); + modRow.add(buttonBox); + let ctrlButton = new Gtk.ToggleButton({ + label: _("Ctrl") + }); + let superButton = new Gtk.ToggleButton({ + label: _("Super") + }); + let shiftButton = new Gtk.ToggleButton({ + label: _("Shift") + }); + let altButton = new Gtk.ToggleButton({ + label: _("Alt") + }); + ctrlButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + superButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + shiftButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + altButton.connect('toggled', () => { + this.resultsText=""; + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += hotkeyKey; + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + buttonBox.append(ctrlButton); + buttonBox.append(superButton); + buttonBox.append(shiftButton); + buttonBox.append(altButton); + modFrame.add(modRow); + vbox.append(modFrame); + + let keyFrame = new PW.FrameBox(); + let keyLabel = new Gtk.Label({ + label: _("Press any key"), + use_markup: true, + xalign: .5, + hexpand: true, + halign: Gtk.Align.CENTER + }); + vbox.append(keyLabel); + let pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/keyboard-symbolic.svg', 256, 72); + let keyboardImage = Gtk.Picture.new_for_pixbuf(pixbuf); + keyboardImage.hexpand = true; + keyboardImage.vexpand = true; + keyboardImage.halign = Gtk.Align.CENTER; + keyboardImage.valign = Gtk.Align.CENTER; + vbox.append(keyboardImage) + + let resultsRow = new PW.FrameBoxRow(); + let resultsLabel = new Gtk.Label({ + label: _("New Hotkey"), + use_markup: true, + xalign: .5, + hexpand: false, + halign: Gtk.Align.START + }); + let resultsWidget = new Gtk.ShortcutsShortcut({ + hexpand: true, + halign: Gtk.Align.END + }); + resultsRow.add(resultsLabel); + resultsRow.add(resultsWidget); + keyFrame.add(resultsRow); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + halign: Gtk.Align.END + }); + applyButton.connect('clicked', () => { + this.addResponse = true; + this.emit("response", -10); + }); + applyButton.set_sensitive(false); + + this.keyEventController.connect('key-released', (controller, keyval, keycode, state) => { + this.resultsText = ""; + let key = keyval; + hotkeyKey = Gtk.accelerator_name(key, 0); + if(ctrlButton.get_active()) this.resultsText += ""; + if(superButton.get_active()) this.resultsText += ""; + if(shiftButton.get_active()) this.resultsText += ""; + if(altButton.get_active()) this.resultsText += ""; + this.resultsText += Gtk.accelerator_name(key,0); + resultsWidget.accelerator = this.resultsText; + applyButton.set_sensitive(true); + }); + + vbox.append(keyFrame); + vbox.append(applyButton); + } +}); + +function getIconPixbuf(filePath){ + if (GLib.file_test(filePath, GLib.FileTest.EXISTS)) + return GdkPixbuf.Pixbuf.new_from_file_at_size(filePath, 25, 25); + else + return null; +} + +var ButtonAppearancePage = GObject.registerClass( + class Arc_Menu_ButtonAppearancePage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + this.menuButtonColor = this._settings.get_string('menu-button-color'); + this.menuButtonHoverColor = this._settings.get_string('menu-button-hover-color'); + this.menuButtonActiveColor = this._settings.get_string('menu-button-active-color'); + this.menuButtonHoverBackgroundcolor = this._settings.get_string('menu-button-hover-backgroundcolor'); + this.menuButtonActiveBackgroundcolor = this._settings.get_string('menu-button-active-backgroundcolor'); + this._createLayout(this.mainBox); + } + + _createLayout(vbox) { + this.arcMenuPlacement = this._settings.get_enum('arc-menu-placement'); + let menuButtonAppearanceHeaderLabel = new Gtk.Label({ + label: "" + _('Menu Button Appearance') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonAppearanceHeaderLabel); + + let menuButtonAppearanceFrame = new PW.FrameBox(); + let menuButtonAppearanceRow = new PW.FrameBoxRow(); + let menuButtonAppearanceLabel = new Gtk.Label({ + label: _('Appearance'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonAppearanceCombo = new Gtk.ComboBoxText({ halign: Gtk.Align.END }); + menuButtonAppearanceCombo.append_text(_("Icon")); + menuButtonAppearanceCombo.append_text(_("Text")); + menuButtonAppearanceCombo.append_text(_("Icon and Text")); + menuButtonAppearanceCombo.append_text(_("Text and Icon")); + menuButtonAppearanceCombo.append_text(_("Hidden")); + menuButtonAppearanceCombo.set_active(this._settings.get_enum('menu-button-appearance')); + menuButtonAppearanceCombo.connect('changed', (widget) => { + this.resetButton.set_sensitive(true); + menuButtonAppearanceFrame.removeChildrenAfterIndex(0); + if(widget.get_active() === Constants.MenuButtonAppearance.NONE){ + menuButtonAppearanceFrame.show(); + } + else if(widget.get_active() === Constants.MenuButtonAppearance.ICON){ + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + if (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + menuButtonAppearanceFrame.show(); + } + else if(widget.get_active() === Constants.MenuButtonAppearance.ICON_TEXT || widget.get_active() === Constants.MenuButtonAppearance.TEXT_ICON || + widget.get_active() === Constants.MenuButtonAppearance.TEXT){ + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + if (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + menuButtonAppearanceFrame.add(menuButtonCustomTextBoxRow); + menuButtonAppearanceFrame.show(); + } + this._settings.set_enum('menu-button-appearance', widget.get_active()); + }); + + menuButtonAppearanceRow.add(menuButtonAppearanceLabel); + menuButtonAppearanceRow.add(menuButtonAppearanceCombo); + menuButtonAppearanceFrame.add(menuButtonAppearanceRow); + + let menuButtonArrowIconBoxRow = new PW.FrameBoxRow(); + let menuButtonArrowIconLabel = new Gtk.Label({ + label: _('Show Arrow'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let enableArrowIconSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + enableArrowIconSwitch.set_active(this._settings.get_boolean('enable-menu-button-arrow')); + enableArrowIconSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-menu-button-arrow', widget.get_active()); + this.resetButton.set_sensitive(true); + }); + + menuButtonArrowIconBoxRow.add(menuButtonArrowIconLabel); + menuButtonArrowIconBoxRow.add(enableArrowIconSwitch); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonArrowIconBoxRow); + + let menuButtonPaddingRow = new PW.FrameBoxRow(); + let menuButtonPadding = this._settings.get_int('button-padding'); + let menuButtonPaddingLabel = new Gtk.Label({ + label: _('Menu Button Padding'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let paddingScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -1, + upper: 25, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + paddingScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + paddingScale.add_mark(-1, Gtk.PositionType.TOP, _("Default")); + paddingScale.set_value(menuButtonPadding); + paddingScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('button-padding', paddingScale.get_value()); + this._settings.set_boolean('reload-theme', true); + }); + + menuButtonPaddingRow.add(menuButtonPaddingLabel); + menuButtonPaddingRow.add(paddingScale); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonPaddingRow); + + ///// Row for menu button offset ///// + let menuButtonOffsetRow = new PW.FrameBoxRow(); + let menuButtonOffset = this._settings.get_int('menu-button-position-offset'); + let menuButtonOffsetLabel = new Gtk.Label({ + label: _('Menu Button Position'), + use_markup: true, + xalign: 0, + hexpand: true, + }); + let offsetScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 10, // arbitrary value + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + offsetScale.add_mark(0, Gtk.PositionType.TOP, _("Default")); // offset 0 is default + offsetScale.add_mark(1, Gtk.PositionType.TOP, null); + offsetScale.add_mark(2, Gtk.PositionType.TOP, null); + offsetScale.set_value(menuButtonOffset); + offsetScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('menu-button-position-offset', offsetScale.get_value()); + }); + menuButtonOffsetRow.add(menuButtonOffsetLabel); + menuButtonOffsetRow.add(offsetScale); + if(menuButtonAppearanceCombo.get_active() !== Constants.MenuButtonAppearance.NONE && + (this.arcMenuPlacement === Constants.ArcMenuPlacement.PANEL || this.arcMenuPlacement === Constants.ArcMenuPlacement.DTP)) + menuButtonAppearanceFrame.add(menuButtonOffsetRow); + //////////////////// + + let menuButtonCustomTextBoxRow = new PW.FrameBoxRow(); + let menuButtonCustomTextLabel = new Gtk.Label({ + label: _('Text'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonCustomTextEntry = new Gtk.Entry({ halign: Gtk.Align.END }); + menuButtonCustomTextEntry.set_width_chars(30); + menuButtonCustomTextEntry.set_text(this._settings.get_string('custom-menu-button-text')); + menuButtonCustomTextEntry.connect('changed', (widget) => { + this.resetButton.set_sensitive(true); + let customMenuButtonText = widget.get_text(); + this._settings.set_string('custom-menu-button-text', customMenuButtonText); + }); + + menuButtonCustomTextBoxRow.add(menuButtonCustomTextLabel); + menuButtonCustomTextBoxRow.add(menuButtonCustomTextEntry); + if(this._settings.get_enum('menu-button-appearance') != Constants.MenuButtonAppearance.ICON && this._settings.get_enum('menu-button-appearance') != Constants.MenuButtonAppearance.NONE) + menuButtonAppearanceFrame.add(menuButtonCustomTextBoxRow); + vbox.append(menuButtonAppearanceFrame); + + let menuButtonIconHeaderLabel = new Gtk.Label({ + label: "" + _('Icon Appearance') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonIconHeaderLabel); + + let menuButtonIconFrame = new PW.FrameBox(); + let menuButtonIconRow = new PW.FrameBoxRow(); + let menuButtonIconLabel = new Gtk.Label({ + label: _('Icon'), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let menuButtonIconButton = new PW.Button({ + title: _("Browse Icons") + " ", + icon_name: 'icon-preview-symbolic', + hexpand: false, + }); + menuButtonIconButton.connect('clicked', () => { + let dialog = new ArcMenuIconsDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', ()=> { + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + dialog.destroy(); + }); + }); + + menuButtonIconRow.add(menuButtonIconLabel); + menuButtonIconRow.add(menuButtonIconButton); + menuButtonIconFrame.add(menuButtonIconRow); + + let menuButtonIconSizeRow = new PW.FrameBoxRow(); + let iconSize = this._settings.get_double('custom-menu-button-icon-size'); + let menuButtonIconSizeLabel = new Gtk.Label({ + label: _('Icon Size'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonIconSizeScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 14, + upper: 64, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuButtonIconSizeScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + menuButtonIconSizeScale.set_value(iconSize); + menuButtonIconSizeScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_double('custom-menu-button-icon-size', menuButtonIconSizeScale.get_value()); + }); + + menuButtonIconSizeRow.add(menuButtonIconSizeLabel); + menuButtonIconSizeRow.add(menuButtonIconSizeScale); + menuButtonIconFrame.add(menuButtonIconSizeRow); + + vbox.append(menuButtonIconFrame); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + halign: Gtk.Align.START, + hexpand: true, + valign: Gtk.Align.END, + vexpand: true + }); + + let menuButtonColorHeaderLabel = new Gtk.Label({ + label: "" + _('Menu Button Styling') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(menuButtonColorHeaderLabel); + + this.menuButtonIconColorFrame = new PW.FrameBox(); + + let[menuButtonColorSwitch, menuButtonColorChooser] = this.newColorChooserRow({ + color: this.menuButtonColor, + label: _("Color"), + settingColorName: 'menu-button-color', + settingOverrideName: 'override-menu-button-color', + }); + + let[menuButtonHoverColorSwitch, menuButtonHoverColorChooser] = this.newColorChooserRow({ + color: this.menuButtonHoverColor, + label: _("Hover Color"), + settingColorName: 'menu-button-hover-color', + settingOverrideName: 'override-menu-button-hover-color', + }); + + let[menuButtonActiveColorSwitch, menuButtonActiveColorChooser] = this.newColorChooserRow({ + color: this.menuButtonActiveColor, + label: _("Active Color"), + settingColorName: 'menu-button-active-color', + settingOverrideName: 'override-menu-button-active-color', + }); + + let[menuButtonHoverBackgroundcolorSwitch, menuButtonHoverBackgroundcolorChooser] = this.newColorChooserRow({ + color: this.menuButtonHoverBackgroundcolor, + label: _("Hover Background Color"), + settingColorName: 'menu-button-hover-backgroundcolor', + settingOverrideName: 'override-menu-button-hover-background-color', + }); + + let[menuButtonActiveBackgroundcolorSwitch, menuButtonActiveBackgroundcolorChooser] = this.newColorChooserRow({ + color: this.menuButtonActiveBackgroundcolor, + label: _("Active Background Color"), + settingColorName: 'menu-button-active-backgroundcolor', + settingOverrideName: 'override-menu-button-active-background-color', + }); + + let roundedCornersRow = new PW.FrameBoxRow(); + + let roundedCornersLabel = new Gtk.Label({ + label: _("Override Border Radius"), + xalign:0, + hexpand: true, + }); + let roundedCornersSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + active: this._settings.get_boolean('menu-button-override-border-radius') + }); + roundedCornersSwitch.connect("notify::active", (widget)=> { + this.resetButton.set_sensitive(true); + this._settings.set_boolean('menu-button-override-border-radius', widget.get_active()) + this._settings.set_boolean('reload-theme', true); + menuButtonBorderRadiusRow.set_sensitive(widget.get_active()); + }); + + roundedCornersRow.add(roundedCornersLabel); + roundedCornersRow.add(roundedCornersSwitch); + + this.menuButtonIconColorFrame.add(roundedCornersRow); + + let menuButtonBorderRadiusRow = new PW.FrameBoxRow(); + let borderRadius = this._settings.get_int('menu-button-border-radius'); + let menuButtonBorderRadiusLabel = new Gtk.Label({ + label: _('Border Radius'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let menuButtonBorderRadiusScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 0, + upper: 20, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuButtonBorderRadiusScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + menuButtonBorderRadiusScale.set_value(borderRadius); + menuButtonBorderRadiusScale.connect('value-changed', () => { + this.resetButton.set_sensitive(true); + this._settings.set_int('menu-button-border-radius', menuButtonBorderRadiusScale.get_value()); + this._settings.set_boolean('reload-theme', true); + }); + + menuButtonBorderRadiusRow.add(menuButtonBorderRadiusLabel); + menuButtonBorderRadiusRow.add(menuButtonBorderRadiusScale); + menuButtonBorderRadiusRow.set_sensitive(this._settings.get_boolean('menu-button-override-border-radius')); + this.menuButtonIconColorFrame.add(menuButtonBorderRadiusRow); + + vbox.append(this.menuButtonIconColorFrame); + + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + menuButtonAppearanceCombo.set_active(0); + menuButtonCustomTextEntry.set_text('Applications'); + paddingScale.set_value(-1); + menuButtonIconSizeScale.set_value(20); + let colorParse = new Gdk.RGBA(); + colorParse.parse('rgb(240,240,240)'); + menuButtonActiveColorChooser.set_rgba(colorParse); + menuButtonColorChooser.set_rgba(colorParse); + colorParse.parse('rgb(214,214,214)'); + menuButtonHoverColorChooser.set_rgba(colorParse); + colorParse.parse('rgba(238,238,236,0.1)'); + menuButtonHoverBackgroundcolorChooser.set_rgba(colorParse); + colorParse.parse('rgba(238,238,236,0.18)'); + menuButtonActiveBackgroundcolorChooser.set_rgba(colorParse); + enableArrowIconSwitch.set_active(false); + menuButtonColorSwitch.set_active(false); + menuButtonHoverColorSwitch.set_active(false); + menuButtonActiveColorSwitch.set_active(false); + menuButtonHoverBackgroundcolorSwitch.set_active(false); + menuButtonActiveBackgroundcolorSwitch.set_active(false); + roundedCornersSwitch.set_active(false); + menuButtonBorderRadiusScale.set_value(0); + offsetScale.set_value(0); + this._settings.reset('menu-button-icon'); + this._settings.reset('arc-menu-icon'); + this._settings.reset('distro-icon'); + this._settings.reset('custom-menu-button-icon'); + this._settings.reset('menu-button-hover-color'); + this._settings.reset('menu-button-active-color'); + this._settings.reset('menu-button-hover-backgroundcolor'); + this._settings.reset('menu-button-active-backgroundcolor'); + this._settings.reset('menu-button-color'); + this._settings.reset('override-menu-button-hover-color'); + this._settings.reset('override-menu-button-active-color'); + this._settings.reset('override-menu-button-hover-background-color'); + this._settings.reset('override-menu-button-active-background-color'); + this._settings.reset('override-menu-button-color'); + this._settings.reset('menu-button-override-border-radius'); + this._settings.reset('menu-button-border-radius'); + this._settings.reset('menu-button-position-offset'); + this._settings.set_boolean('reload-theme', true); + + this.resetButton.set_sensitive(false); + }); + vbox.append(this.resetButton); + } + + newColorChooserRow(params){ + let colorParse = new Gdk.RGBA(); + let colorRow = new PW.FrameBoxRow(); + let buttonsGrid = new Gtk.Grid({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }); + + let colorLabel = new Gtk.Label({ + label: params.label, + xalign:0, + hexpand: true, + }); + let colorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + active: this._settings.get_boolean(params.settingOverrideName) + }); + colorSwitch.connect("notify::active", (widget)=> { + this.resetButton.set_sensitive(true); + this._settings.set_boolean(params.settingOverrideName, widget.get_active()) + colorChooser.sensitive = widget.get_active(); + this._settings.set_boolean('reload-theme', true); + }); + + let colorChooser = new Gtk.ColorButton({ + use_alpha: true, + sensitive: colorSwitch.get_active() + }); + + colorParse.parse(params.color); + colorChooser.set_rgba(colorParse); + + colorChooser.connect('color-set', ()=>{ + this.resetButton.set_sensitive(true); + params.color = colorChooser.get_rgba().to_string(); + this._settings.set_string(params.settingColorName, params.color); + this._settings.set_boolean('reload-theme', true); + }); + + colorRow.add(colorLabel); + buttonsGrid.attach(colorSwitch, 0, 0, 1, 1); + buttonsGrid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 1, 0, 1, 1); + buttonsGrid.attach(colorChooser, 2, 0, 1, 1); + colorRow.add(buttonsGrid); + this.menuButtonIconColorFrame.add(colorRow); + return [colorSwitch, colorChooser]; + } + + checkIfResetButtonSensitive(){ + if( this._settings.get_string('menu-button-hover-backgroundcolor') != 'rgba(238,238,236,0.1)' || + this._settings.get_string('menu-button-active-backgroundcolor') != 'rgba(238,238,236,0.18)' || + this._settings.get_string('menu-button-active-color') != 'rgb(240,240,240)' || + this._settings.get_string('menu-button-hover-color') != 'rgb(214,214,214)' || + this._settings.get_string('menu-button-color') != 'rgb(240,240,240)' || + this._settings.get_double('custom-menu-button-icon-size') != 20 || + this._settings.get_int('button-padding') != -1 || + this._settings.get_enum('menu-button-icon') != 0 || + this._settings.get_int('arc-menu-icon') != 0 || + this._settings.get_string('custom-menu-button-text') != 'Applications' || + this._settings.get_enum('menu-button-appearance') != 0 || + this._settings.get_boolean('enable-menu-button-arrow') || + this._settings.get_boolean('override-menu-button-color') || + this._settings.get_boolean('override-menu-button-hover-color') || + this._settings.get_boolean('override-menu-button-active-color') || + this._settings.get_boolean('override-menu-button-hover-background-color') || + this._settings.get_boolean('override-menu-button-active-background-color') || + this._settings.get_boolean('menu-button-override-border-radius') || + this._settings.get_int('menu-button-border-radius') != 0 || + this._settings.get_int('menu-button-position-offset') != 0 ) + return true; + else + return false; + } +}); + +var ArcMenuIconsDialogWindow = GObject.registerClass( + class Arc_Menu_ArcMenuIconsDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + super._init(_('ArcMenu Icons'), parent); + this.set_default_size(550, 400); + } + + _createLayout(vbox){ + this.stack = new Gtk.Stack({ + halign: Gtk.Align.FILL, + hexpand: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + + let arcMenuIconsBox = new Gtk.ScrolledWindow(); + + let arcMenuIconsFlowBox = new PW.IconGrid(); + arcMenuIconsFlowBox.connect('child-activated', ()=> { + distroIconsBox.unselect_all(); + customIconFlowBox.unselect_all(); + let selectedChild = arcMenuIconsFlowBox.get_selected_children(); + let selectedChildIndex = selectedChild[0].get_index(); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.ARC_MENU); + this._settings.set_int('arc-menu-icon', selectedChildIndex); + }); + arcMenuIconsBox.set_child(arcMenuIconsFlowBox); + Constants.MenuIcons.forEach((icon)=>{ + let iconName = icon.PATH.replace("/media/icons/menu_button_icons/icons/", ''); + iconName = iconName.replace(".svg", ''); + let iconImage = new Gtk.Image({ + icon_name: iconName, + pixel_size: 36 + }); + arcMenuIconsFlowBox.add(iconImage); + }); + + let distroIconsBox = new PW.IconGrid(); + distroIconsBox.connect('child-activated', ()=> { + arcMenuIconsFlowBox.unselect_all(); + customIconFlowBox.unselect_all(); + let selectedChild = distroIconsBox.get_selected_children(); + let selectedChildIndex = selectedChild[0].get_index(); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.DISTRO_ICON); + this._settings.set_int('distro-icon', selectedChildIndex); + }); + Constants.DistroIcons.forEach((icon)=>{ + let iconImage; + if(icon.PATH === 'start-here-symbolic'){ + iconImage = new Gtk.Image({ + icon_name: 'start-here-symbolic', + pixel_size: 36 + }); + } + else{ + let iconName1 = icon.PATH.replace("/media/icons/menu_button_icons/distro_icons/", ''); + iconName1 = iconName1.replace(".svg", ''); + iconImage = new Gtk.Image({ + icon_name: iconName1, + pixel_size: 36 + }); + } + distroIconsBox.add(iconImage); + }); + + let customIconBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL + }); + let customIconFlowBox = new PW.IconGrid(); + customIconFlowBox.vexpand = false; + customIconFlowBox.homogeneous = false; + customIconFlowBox.connect('child-activated', ()=> { + arcMenuIconsFlowBox.unselect_all(); + distroIconsBox.unselect_all(); + let customIconPath = this._settings.get_string('custom-menu-button-icon'); + this._settings.set_string('custom-menu-button-icon', customIconPath) + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.CUSTOM); + }); + customIconBox.append(customIconFlowBox); + let customIconImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string(this._settings.get_string('custom-menu-button-icon')), + pixel_size: 36 + }); + customIconFlowBox.add(customIconImage); + + let fileChooserFrame = new PW.FrameBox(); + fileChooserFrame.margin_top = 20; + fileChooserFrame.margin_bottom = 20; + fileChooserFrame.margin_start = 20; + fileChooserFrame.margin_end = 20; + let fileChooserRow = new PW.FrameBoxRow(); + let fileChooserLabel = new Gtk.Label({ + label: _('Browse for a Custom Icon'), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + let fileChooserButton = new Gtk.Button({ + label: _('Select an Icon') + }); + fileChooserButton.connect('clicked', (widget) => { + let dialog = new Gtk.FileChooserDialog({ + title: _('Select an Icon'), + transient_for: this.get_root(), + modal: true, + action: Gtk.FileChooserAction.OPEN, + }); + + if(dialog.get_parent()) + dialog.unparent(); + dialog.set_filter(fileFilter); + + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button("_Open", Gtk.ResponseType.ACCEPT); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + arcMenuIconsFlowBox.unselect_all(); + distroIconsBox.unselect_all(); + customIconImage.gicon = Gio.icon_new_for_string(dialog.get_file().get_path()); + this._settings.set_string('custom-menu-button-icon', dialog.get_file().get_path()); + this._settings.set_enum('menu-button-icon', Constants.MenuIcon.CUSTOM); + customIconFlowBox.select_child(customIconFlowBox.get_child_at_index(0)); + dialog.destroy(); + } + else + dialog.destroy(); + }) + + dialog.show(); + }); + + fileChooserRow.add(fileChooserLabel); + fileChooserRow.add(fileChooserButton); + fileChooserFrame.add(fileChooserRow); + customIconBox.append(fileChooserFrame); + + this.stack.add_titled(arcMenuIconsBox, 'ArcMenu Icons', _('ArcMenu Icons')); + this.stack.add_titled(distroIconsBox, 'Distro Icons', _('Distro Icons')); + this.stack.add_titled(customIconBox, 'Custom Icon', _('Custom Icon')); + + let stackSwitcher = new Gtk.StackSwitcher({ + stack: this.stack, + halign: Gtk.Align.CENTER + }); + + vbox.append(stackSwitcher); + vbox.append(this.stack); + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU) + this.stack.set_visible_child_name('ArcMenu Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON) + this.stack.set_visible_child_name('Distro Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM) + this.stack.set_visible_child_name('Custom Icon'); + + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU){ + let children = arcMenuIconsFlowBox.childrenCount; + for(let i = 0; i < children; i++){ + if(i === this._settings.get_int('arc-menu-icon')){ + arcMenuIconsFlowBox.select_child(arcMenuIconsFlowBox.get_child_at_index(i)); + break; + } + } + } + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON){ + let children = distroIconsBox.childrenCount; + for(let i = 0; i < children; i++){ + if(i === this._settings.get_int('distro-icon')){ + distroIconsBox.select_child(distroIconsBox.get_child_at_index(i)); + break; + } + } + } + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM){ + customIconFlowBox.select_child(customIconFlowBox.get_child_at_index(0)); + } + + let distroInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + distroInfoButton.halign = Gtk.Align.START; + distroInfoButton.connect('clicked', ()=> { + let dialog = new DistroIconsDisclaimerWindow(this._settings, this); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + vbox.append(distroInfoButton); + } + + setVisibleChild(){ + if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.ARC_MENU) + this.stack.set_visible_child_name('ArcMenu Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.DISTRO_ICON) + this.stack.set_visible_child_name('Distro Icons'); + else if(this._settings.get_enum('menu-button-icon') === Constants.MenuIcon.CUSTOM) + this.stack.set_visible_child_name('Custom Icon'); + } +}); + +var DistroIconsDisclaimerWindow = GObject.registerClass( + class Arc_Menu_DistroIconsDisclaimerWindow extends Gtk.MessageDialog { + _init(settings, parent) { + this._settings = settings; + super._init({ + text: "" + _("Legal disclaimer for Distro Icons...") + "", + use_markup: true, + message_type: Gtk.MessageType.OTHER, + transient_for: parent.get_root(), + modal: true, + buttons: Gtk.ButtonsType.OK + }); + + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + }); + this.get_content_area().append(vbox); + this._createLayout(vbox); + } + + _createLayout(vbox) { + let scrollWindow = new Gtk.ScrolledWindow({ + min_content_width: 500, + max_content_width: 500, + min_content_height: 400, + max_content_height: 400, + hexpand: false, + halign: Gtk.Align.START, + }); + scrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + let frame = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + hexpand: false, + halign: Gtk.Align.START + }); + + let bodyLabel = new Gtk.Label({ + label: Constants.DistroIconsDisclaimer, + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true + }); + bodyLabel.set_size_request(500,-1); + + frame.append(bodyLabel); + scrollWindow.set_child(frame); + vbox.append(scrollWindow); + } +}); + +var MenuLayoutPage = GObject.registerClass( + class Arc_Menu_MenuLayoutPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + this._settings = settings; + + this.scrollBox = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + vexpand: true, + valign: Gtk.Align.FILL + }); + this.scrollBox.set_child(this.mainBox); + + let currentLayoutLabel = new Gtk.Label({ + label: "" + _("Current Menu Layout") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + let chooseNewLayoutLabel = new Gtk.Label({ + label: "" + _("Available Menu Layouts") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(currentLayoutLabel); + + let currentLayoutFrame = new PW.FrameBox(); + + let currentLayoutBoxLabel = new Gtk.Label({ + label: "" + this.getMenuLayoutName(this._settings.get_enum('menu-layout')) + "", + use_markup: true, + hexpand: true, + vexpand: true, + halign: Gtk.Align.CENTER, + valign: Gtk.Align.CENTER + }); + let currentLayoutBoxRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + currentLayoutBoxRow.activatable = true; + currentLayoutBoxRow._grid.row_spacing = 0; + currentLayoutBoxRow._grid.column_spacing = 0; + + let goNextImage = new Gtk.Image({ + icon_name: 'go-next-symbolic', + halign: Gtk.Align.END + }); + + currentLayoutFrame._listBox.connect('row-activated', () => { + this.displayLayoutTweaksPage(); + }); + + this.layoutsTweaksPage = new LayoutTweaks.tweaks.TweaksPage(this._settings, this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout'))); + this.layoutsTweaksPage.connect("response", (page, response) => { + if(response === -20) + this.stack.set_visible_child_name("LayoutsBox"); + }); + + let currentLayoutImagePath = this.getMenuLayoutImagePath(this._settings.get_enum('menu-layout')); + + let currentLayoutImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string(currentLayoutImagePath), + pixel_size: 155, + hexpand: false, + halign: Gtk.Align.START, + valign: Gtk.Align.CENTER, + }); + let tweaksLabel = new Gtk.Label({ + label: this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout')), + use_markup: true, + halign: Gtk.Align.END, + vexpand: true, + hexpand: true + }); + currentLayoutBoxRow._grid.attach(currentLayoutImage, 0, 0, 1, 1); + currentLayoutBoxRow._grid.attach(currentLayoutBoxLabel, 0, 0, 1, 1); + currentLayoutBoxRow._grid.attach(goNextImage, 0, 0, 1, 1); + currentLayoutFrame.add(currentLayoutBoxRow); + + this.mainBox.append(currentLayoutFrame); + this.mainBox.append(chooseNewLayoutLabel); + + this.stack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + this.layoutTilesBox = new Gtk.Grid({ + column_homogeneous: true, + column_spacing: 14, + row_spacing: 6, + hexpand: true, + halign: Gtk.Align.FILL, + vexpand: true, + valign: Gtk.Align.FILL + }); + this.mainBox.append(this.layoutTilesBox); + this.stack.add_named(this.scrollBox, "LayoutsBox"); + this.stack.add_named(this.layoutsTweaksPage, "LayoutsTweaks") + let gridY = 0; + Constants.MenuStyles.STYLES.forEach((style) => { + let tile = new PW.LayoutTile(style.TITLE, style.IMAGE, style); + this.layoutTilesBox.attach(tile, 0, gridY, 1, 1); + let menuLayoutsBox = new MenuLayoutCategoryPage(this._settings, this, tile, style.TITLE); + gridY++; + menuLayoutsBox.connect('menu-layout-response', (dialog, response) => { + if(response === -10) { + this._settings.set_enum('menu-layout', dialog.index); + this._settings.set_boolean('reload-theme', true); + currentLayoutBoxLabel.label = "" + this.getMenuLayoutName(dialog.index) + ""; + tweaksLabel.label = this.getMenuLayoutTweaksName(dialog.index); + currentLayoutImage.gicon = Gio.icon_new_for_string(this.getMenuLayoutImagePath(dialog.index)); + this.stack.set_visible_child_name("LayoutsBox"); + this.scrollBox.vadjustment.set_value(this.scrollBox.vadjustment.get_lower()); + } + if(response === -20){ + this.stack.set_visible_child_name("LayoutsBox"); + } + }); + this.stack.add_named(menuLayoutsBox, "Layout_" + style.TITLE); + tile._listBox.connect('row-activated', ()=> { + this.stack.set_visible_child_name("Layout_" + style.TITLE); + menuLayoutsBox.enableSelectionMode(); + }); + }); + + this.append(this.stack); + } + + displayLayoutTweaksPage(){ + let layoutName = this.getMenuLayoutTweaksName(this._settings.get_enum('menu-layout')); + this.layoutsTweaksPage.setActiveLayout(this._settings.get_enum('menu-layout'), layoutName); + this.stack.set_visible_child_name("LayoutsTweaks"); + } + + displayRunnerTweaksPage(){ + if(!this.runnerTweaksPage){ + let activeLayoutName = this.getMenuLayoutTweaksName(Constants.MenuLayout.RUNNER); + this.runnerTweaksPage = new LayoutTweaks.tweaks.TweaksPage(this._settings, activeLayoutName); + this.stack.add_named(this.runnerTweaksPage, "RunnerTweaks") + this.runnerTweaksPage.connect("response", (page, response) => { + if(response === -20) + this.stack.set_visible_child_name("LayoutsBox"); + }); + this.runnerTweaksPage.setActiveLayout(Constants.MenuLayout.RUNNER); + } + this.stack.set_visible_child_name("RunnerTweaks"); + } + + getMenuLayoutName(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return _(style.TITLE); + } + } + } + } + + getMenuLayoutTweaksName(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return _("%s Layout Tweaks", style.TITLE).format(style.TITLE); + } + } + } + } + + getMenuLayoutImagePath(index){ + for(let styles of Constants.MenuStyles.STYLES){ + for(let style of styles.MENU_TYPE){ + if(style.LAYOUT == index){ + return style.IMAGE; + } + } + } + } + +}); + +var MenuThemePage = GObject.registerClass( + class Arc_Menu_MenuThemePage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.customArcMenu = this._settings.get_boolean('enable-custom-arc-menu'); + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.checkIfPresetMatch(); + + let overrideArcMenuHeaderLabel = new Gtk.Label({ + label: "" + _('Enable Custom Menu Theme') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(overrideArcMenuHeaderLabel); + + let overrideArcMenuFrame = new PW.FrameBox(); + let overrideArcMenuRow = new PW.FrameBoxRow(); + let overrideArcMenuLabel = new Gtk.Label({ + label: _("Override Menu Theme"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let overrideArcMenuSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + }); + overrideArcMenuSwitch.set_active(this._settings.get_boolean('enable-custom-arc-menu')); + overrideArcMenuSwitch.connect('notify::active', (widget) => { + this._settings.set_boolean('enable-custom-arc-menu',widget.get_active()); + this._settings.set_boolean('reload-theme', true); + if(widget.get_active()){ + this.mainBox.append(this.menuThemeCustomizationBox); + this.menuThemeCustomizationBox.show(); + this.append(this.buttonRow); + this.buttonRow.show(); + } + else{ + this.mainBox.remove(this.menuThemeCustomizationBox); + this.remove(this.buttonRow); + } + this.mainBox.show(); + }); + + this.menuThemeCustomizationBox = new OverrideArcMenuThemeWindow(this._settings, this.mainBox, this); + this.menuThemeCustomizationBox.connect('menu-theme-response', (dialog, response) => { + if(response === -10) { + this._settings.set_string('separator-color', dialog.separatorColor); + this._settings.set_boolean('vert-separator', dialog.verticalSeparator); + this._settings.set_string('menu-color', dialog.menuColor); + this._settings.set_string('menu-foreground-color', dialog.menuForegroundColor); + this._settings.set_string('border-color', dialog.borderColor); + this._settings.set_string('highlight-color', dialog.highlightColor ); + this._settings.set_string('highlight-foreground-color', dialog.highlightForegroundColor); + this._settings.set_int('menu-font-size', dialog.fontSize); + this._settings.set_int('menu-border-size', dialog.borderSize); + this._settings.set_int('menu-corner-radius', dialog.cornerRadius); + this._settings.set_int('menu-margin', dialog.menuMargin); + this._settings.set_int('menu-arrow-size', dialog.menuArrowSize); + this._settings.set_boolean('reload-theme', true); + this.presetName = dialog.presetName; + } + else{ + this.checkIfPresetMatch(); + } + }); + + overrideArcMenuRow.add(overrideArcMenuLabel); + overrideArcMenuRow.add(overrideArcMenuSwitch); + overrideArcMenuFrame.add(overrideArcMenuRow); + + this.mainBox.append(overrideArcMenuFrame); + if(overrideArcMenuSwitch.get_active()) + this.mainBox.append(this.menuThemeCustomizationBox); + else + this.remove(this.buttonRow); + } + + checkIfPresetMatch(){ + this.presetName = "Custom Theme"; + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.currentSettingsArray = [this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + let all_color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < all_color_themes.length; i++){ + this.isEqual = true; + for(let l = 0; l < this.currentSettingsArray.length; l++){ + if(this.currentSettingsArray[l] !== all_color_themes[i][l + 1]){ + this.isEqual=false; + break; + } + } + if(this.isEqual){ + this.presetName = all_color_themes[i][0]; + break; + } + } + } +}); + +var MenuLayoutCategoryPage = GObject.registerClass({ + Signals: { + 'menu-layout-response': { param_types: [GObject.TYPE_INT] }, + }, +}, class Arc_Menu_MenuLayoutCategoryPage extends Gtk.ScrolledWindow { + _init(settings, parent, tile, title) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this.title = title; + this._parent = parent; + this._settings = settings; + this.index = this._settings.get_enum('menu-layout'); + this.layoutStyle = tile.layout; + + this._params = { + maxColumns: tile.layout.length > 3 ? 3 : tile.layout.length, + imageHeight: 155, + imageWidth: 155, + styles: tile.layout + }; + let layoutsFrame = new PW.FrameBox(); + let layoutsRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false, + }) + layoutsRow._grid.orientation = Gtk.Orientation.VERTICAL; + layoutsFrame.add(layoutsRow); + let buttonBox = new Gtk.Box({ + spacing: 10 + }); + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: false, + halign: Gtk.Align.END + }); + applyButton.connect('clicked', ()=> { + let selectedBox = this._tileGrid.get_selected_children(); + this.index = selectedBox[0].get_child().layout; + this._tileGrid.unselect_all(); + applyButton.set_sensitive(false); + this.emit('menu-layout-response', -10); + }); + let backButton = new PW.Button({ + icon_name: 'go-previous-symbolic', + title: _("Back"), + icon_first: true, + halign: Gtk.Align.START + }); + backButton.connect('clicked', ()=> { + this.emit('menu-layout-response', -20); + }); + buttonBox.append(backButton); + let chooseNewLayoutLabel = new Gtk.Label({ + label: "" + _("%s Menu Layouts", this.title).format(this.title) + "", + use_markup: true, + halign: Gtk.Align.CENTER, + hexpand: true + }); + buttonBox.append(chooseNewLayoutLabel); + buttonBox.append(applyButton); + applyButton.set_sensitive(false); + + this.mainBox.append(buttonBox); + this.mainBox.append(layoutsFrame); + this._tileGrid = new PW.TileGrid(this._params.maxColumns); + + this._params.styles.forEach((style) => { + this._addTile(style.TITLE, style.IMAGE, style.LAYOUT); + }); + + layoutsRow.add(this._tileGrid); + + this._tileGrid.connect('selected-children-changed', () => { + applyButton.set_sensitive(true); + }); + + this._tileGrid.set_selection_mode(Gtk.SelectionMode.NONE); + } + + + enableSelectionMode(){ + this._tileGrid.set_selection_mode(Gtk.SelectionMode.SINGLE); + } + + _addTile(name, image, layout) { + let tile = new PW.Tile(name, image, this._params.imageWidth, this._params.imageHeight, layout); + this._tileGrid.insert(tile, -1); + } +}); + +var MenuSettingsGeneralPage = GObject.registerClass( + class Arc_Menu_MenuSettingsGeneralPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.heightValue = this._settings.get_int('menu-height'); + this.widthValue = this._settings.get_int('menu-width-adjustment'); + this.rightPanelWidth = this._settings.get_int('right-panel-width'); + this.menuWidth = this._settings.get_int('menu-width'); + this.forcedMenuLocation = this._settings.get_enum('force-menu-location'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.appDescriptions = this._settings.get_boolean('apps-show-extra-details'); + this.categoryIconType = this._settings.get_enum('category-icon-type'); + this.shortcutsIconType = this._settings.get_enum('shortcut-icon-type'); + + let menuSizeFrame = new PW.FrameBox(); + //find the greatest screen height of all monitors + //use that value to set Menu Height cap + let display = Gdk.Display.get_default(); + let monitors = display.get_monitors(); + let nMonitors = monitors.get_n_items(); + let greatestHeight = 0; + let scaleFactor = 1; + for (let i = 0; i < nMonitors; i++) { + let monitor = monitors.get_item(i); + let monitorHeight = monitor.get_geometry().height; + if(monitorHeight > greatestHeight){ + scaleFactor = monitor.get_scale_factor(); + greatestHeight = monitorHeight; + } + } + let monitorHeight = greatestHeight * scaleFactor; + monitorHeight = Math.round((monitorHeight * 8) / 10); + + let menuSizeHeaderLabel = new Gtk.Label({ + label: "" + _("Menu Size") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(menuSizeHeaderLabel); + + this.mainBox.append(menuSizeFrame); + let heightRow = new PW.FrameBoxRow(); + let heightLabel = new Gtk.Label({ + label: _('Height'), + use_markup: true, + xalign: 0, + hexpand: false, + selectable: false + }); + let hscale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 300, + upper: monitorHeight, + step_increment: 10, + page_increment: 10, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + hscale.set_value(this.heightValue); + hscale.connect('value-changed', () => { + this.heightValue = hscale.get_value(); + if(hSpinButton.value !== this.heightValue) + hSpinButton.set_value(this.heightValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let hSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 300, upper: monitorHeight, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + hSpinButton.set_value(this.heightValue); + hSpinButton.connect('value-changed', () => { + this.heightValue = hSpinButton.get_value(); + if(hscale.value !== this.heightValue) + hscale.set_value(this.heightValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + heightRow.add(heightLabel); + heightRow.add(hscale); + heightRow.add(hSpinButton); + menuSizeFrame.add(heightRow); + + let menuWidthTwoPanelsHeaderRow = new PW.FrameBoxRow(); + let menuWidthTwoPanelsHeaderLabel = new Gtk.Label({ + label: _("Traditional Layouts Width"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false, + sensitive: false + }); + menuWidthTwoPanelsHeaderRow.add(menuWidthTwoPanelsHeaderLabel) + menuSizeFrame.add(menuWidthTwoPanelsHeaderRow); + + let menuWidthRow = new PW.FrameBoxRow(); + menuWidthRow._grid.margin_start = 25; + let menuWidthLabel = new Gtk.Label({ + label: _('Left-Panel'), + xalign:0, + hexpand: false, + }); + let menuWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 175, upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + menuWidthScale.set_value(this.menuWidth); + menuWidthScale.connect('value-changed', () => { + this.menuWidth = menuWidthScale.get_value(); + if(menuWidthSpinButton.value !== this.menuWidth) + menuWidthSpinButton.set_value(this.menuWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let menuWidthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 175, upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + menuWidthSpinButton.set_value(this.menuWidth); + menuWidthSpinButton.connect('value-changed', () => { + this.menuWidth = menuWidthSpinButton.get_value(); + if(menuWidthScale.value !== this.menuWidth) + menuWidthScale.set_value(this.menuWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + menuWidthRow.add(menuWidthLabel); + menuWidthRow.add(menuWidthScale); + menuWidthRow.add( menuWidthSpinButton); + menuSizeFrame.add(menuWidthRow); + + let rightPanelWidthRow = new PW.FrameBoxRow(); + rightPanelWidthRow._grid.margin_start = 25; + let rightPanelWidthLabel = new Gtk.Label({ + label: _('Right-Panel'), + xalign:0, + hexpand: false, + }); + let rightPanelWidthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 200,upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + rightPanelWidthScale.set_value(this.rightPanelWidth); + rightPanelWidthScale.connect('value-changed', () => { + this.rightPanelWidth = rightPanelWidthScale.get_value(); + if(rightPanelWidthSpinButton.value !== this.rightPanelWidth) + rightPanelWidthSpinButton.set_value(this.rightPanelWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let rightPanelWidthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 200,upper: 500, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + }); + rightPanelWidthSpinButton.set_value(this.rightPanelWidth); + rightPanelWidthSpinButton.connect('value-changed', () => { + this.rightPanelWidth = rightPanelWidthSpinButton.get_value(); + if(rightPanelWidthScale.value !== this.rightPanelWidth) + rightPanelWidthScale.set_value(this.rightPanelWidth); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + rightPanelWidthRow.add(rightPanelWidthLabel); + rightPanelWidthRow.add(rightPanelWidthScale); + rightPanelWidthRow.add(rightPanelWidthSpinButton); + menuSizeFrame.add(rightPanelWidthRow); + + let otherWidthHeaderRow = new PW.FrameBoxRow(); + let otherWidthHeaderLabel = new Gtk.Label({ + label: _("Non-Traditional Layouts Width"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false, + sensitive: false + }); + otherWidthHeaderRow.add(otherWidthHeaderLabel) + menuSizeFrame.add(otherWidthHeaderRow); + + let widthRow = new PW.FrameBoxRow(); + widthRow._grid.margin_start = 25; + let widthLabel = new Gtk.Label({ + label: _('Width Offset'), + use_markup: true, + xalign: 0, + hexpand: false, + selectable: false + }); + let widthScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -350, + upper: 600, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + value_pos: Gtk.PositionType.RIGHT + }); + widthScale.add_mark(0, Gtk.PositionType.BOTTOM, _("Default")); + widthScale.set_value(this.widthValue); + widthScale.connect('value-changed', (widget) => { + this.widthValue = widget.get_value(); + if(widthSpinButton.value !== this.widthValue) + widthSpinButton.set_value(this.widthValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let widthSpinButton = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: -350, upper: 600, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + valign: Gtk.Align.START + }); + widthSpinButton.set_value(this.widthValue); + widthSpinButton.connect('value-changed', () => { + this.widthValue = widthSpinButton.get_value(); + if(widthScale.value !== this.widthValue) + widthScale.set_value(this.widthValue); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + widthRow.add(widthLabel); + widthRow.add(widthScale); + widthRow.add(widthSpinButton); + menuSizeFrame.add(widthRow); + + let iconsSizeFrame = new PW.FrameBox(); + let menuItemSizeHeaderLabel = new Gtk.Label({ + label: "" + _("Menu Items Icon Size") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(menuItemSizeHeaderLabel); + + let gridIconsSizeRow = new PW.FrameBoxRow(); + let gridIconsSizeLabel = new Gtk.Label({ + label: _("Grid Icons"), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.gridIconsSizeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + this.gridIconsSizeCombo.append("Default", _("Default")); + this.gridIconsSizeCombo.append("Small", _("Small") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Medium", _("Medium") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Large", _("Large") + " - " + _("Square")); + this.gridIconsSizeCombo.append("Small Rect", _("Small") + " - " + _("Wide")); + this.gridIconsSizeCombo.append("Medium Rect", _("Medium") + " - " + _("Wide")); + this.gridIconsSizeCombo.append("Large Rect", _("Large") + " - " + _("Wide")); + this.gridIconsSizeCombo.set_active(this._settings.get_enum('menu-item-grid-icon-size')); + this.gridIconsSizeCombo.connect('changed', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + gridIconsSizeRow.add(gridIconsSizeLabel); + gridIconsSizeRow.add(this.gridIconsSizeCombo); + iconsSizeFrame.add(gridIconsSizeRow); + + [this.menuItemIconSizeCombo, this.menuItemIconSizeRow] = this.createIconSizeRow(_("Categories & Applications"), this._settings.get_enum('menu-item-icon-size')); + iconsSizeFrame.add(this.menuItemIconSizeRow); + [this.buttonIconSizeCombo, this.buttonIconSizeRow] = this.createIconSizeRow(_("Buttons"), this._settings.get_enum('button-item-icon-size')); + iconsSizeFrame.add(this.buttonIconSizeRow); + [this.quicklinksIconSizeCombo, this.quicklinksIconSizeRow] = this.createIconSizeRow(_("Quick Links"), this._settings.get_enum('quicklinks-item-icon-size')); + iconsSizeFrame.add(this.quicklinksIconSizeRow); + [this.miscIconSizeCombo, this.miscIconSizeRow] = this.createIconSizeRow(_("Misc"), this._settings.get_enum('misc-item-icon-size')); + iconsSizeFrame.add(this.miscIconSizeRow); + + this.mainBox.append(iconsSizeFrame); + + let generalHeaderLabel = new Gtk.Label({ + label: "" + _("General Settings") + "", + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + this.mainBox.append(generalHeaderLabel); + + let generalSettingsFrame = new PW.FrameBox(); + let menuLocationRow = new PW.FrameBoxRow(); + let menuLocationLabel = new Gtk.Label({ + label: _('Override Menu Location'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let menuLocationCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + menuLocationCombo.append_text(_("Off")); + menuLocationCombo.append_text(_("Top Centered")); + menuLocationCombo.append_text(_("Bottom Centered")); + menuLocationCombo.set_active(this._settings.get_enum('force-menu-location')); + menuLocationCombo.connect('changed', (widget) => { + this.forcedMenuLocation = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + menuLocationRow.add(menuLocationLabel); + menuLocationRow.add(menuLocationCombo); + generalSettingsFrame.add(menuLocationRow); + this.mainBox.append(generalSettingsFrame); + + let appDescriptionsRow = new PW.FrameBoxRow(); + let appDescriptionsLabel = new Gtk.Label({ + label: _("Show Application Descriptions"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let appDescriptionsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + appDescriptionsSwitch.set_active(this.appDescriptions); + appDescriptionsSwitch.connect('notify::active', (widget) => { + this.appDescriptions = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appDescriptionsRow.add(appDescriptionsLabel); + appDescriptionsRow.add(appDescriptionsSwitch); + generalSettingsFrame.add(appDescriptionsRow); + + let categoryIconTypeRow = new PW.FrameBoxRow(); + let categoryIconTypeLabel = new Gtk.Label({ + label: _('Category Icon Type'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let categoryIconTypeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + categoryIconTypeCombo.append_text(_("Full Color")); + categoryIconTypeCombo.append_text(_("Symbolic")); + categoryIconTypeCombo.set_active(this.categoryIconType); + categoryIconTypeCombo.connect('changed', (widget) => { + this.categoryIconType = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + categoryIconTypeRow.add(categoryIconTypeLabel); + categoryIconTypeRow.add(categoryIconTypeCombo); + generalSettingsFrame.add(categoryIconTypeRow); + + let shortcutsIconTypeRow = new PW.FrameBoxRow(); + let shortcutsIconTypeLabel = new Gtk.Label({ + label: _('Shortcuts Icon Type'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let shortcutsIconTypeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + shortcutsIconTypeCombo.append_text(_("Full Color")); + shortcutsIconTypeCombo.append_text(_("Symbolic")); + shortcutsIconTypeCombo.set_active(this.shortcutsIconType); + shortcutsIconTypeCombo.connect('changed', (widget) => { + this.shortcutsIconType = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + shortcutsIconTypeRow.add(shortcutsIconTypeLabel); + shortcutsIconTypeRow.add(shortcutsIconTypeCombo); + generalSettingsFrame.add(shortcutsIconTypeRow); + + let vertSeparatorRow = new PW.FrameBoxRow(); + let vertSeparatorLabel = new Gtk.Label({ + label: _('Enable Vertical Separator'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let vertSeparatorSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + vertSeparatorSwitch.set_active(this.verticalSeparator); + vertSeparatorSwitch.connect('notify::active', (widget) => { + this.verticalSeparator = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + vertSeparatorRow.add(vertSeparatorLabel); + vertSeparatorRow.add(vertSeparatorSwitch); + generalSettingsFrame.add(vertSeparatorRow); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.heightValue = this._settings.get_default_value('menu-height').unpack(); + this.widthValue = this._settings.get_default_value('menu-width-adjustment').unpack(); + this.rightPanelWidth = this._settings.get_default_value('right-panel-width').unpack(); + this.menuWidth = this._settings.get_default_value('menu-width').unpack(); + this.verticalSeparator = this._settings.get_default_value('vert-separator').unpack(); + this.appDescriptions = this._settings.get_default_value('apps-show-extra-details').unpack(); + this.categoryIconType = 0; + this.shortcutsIconType = 1; + this.forcedMenuLocation = 0; + hscale.set_value(this.heightValue); + widthScale.set_value(this.widthValue); + menuWidthScale.set_value(this.menuWidth); + rightPanelWidthScale.set_value(this.rightPanelWidth); + vertSeparatorSwitch.set_active(this.verticalSeparator); + this.gridIconsSizeCombo.set_active(0); + this.menuItemIconSizeCombo.set_active(0); + this.buttonIconSizeCombo.set_active(0); + this.quicklinksIconSizeCombo.set_active(0); + this.miscIconSizeCombo.set_active(0); + appDescriptionsSwitch.set_active(this.appDescriptions); + menuLocationCombo.set_active(this.forcedMenuLocation); + categoryIconTypeCombo.set_active(0); + shortcutsIconTypeCombo.set_active(1); + + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_int('menu-height', this.heightValue); + this._settings.set_int('menu-width-adjustment', this.widthValue); + this._settings.set_int('right-panel-width', this.rightPanelWidth); + this._settings.set_int('menu-width', this.menuWidth); + this._settings.set_enum('force-menu-location', this.forcedMenuLocation); + this._settings.set_boolean('vert-separator', this.verticalSeparator); + this._settings.set_enum('menu-item-icon-size', this.menuItemIconSizeCombo.get_active()); + this._settings.set_enum('menu-item-grid-icon-size', this.gridIconsSizeCombo.get_active()); + this._settings.set_enum('button-item-icon-size', this.buttonIconSizeCombo.get_active()); + this._settings.set_enum('quicklinks-item-icon-size', this.quicklinksIconSizeCombo.get_active()); + this._settings.set_enum('misc-item-icon-size', this.miscIconSizeCombo.get_active()); + this._settings.set_boolean('reload-theme', true); + this._settings.set_boolean('apps-show-extra-details', this.appDescriptions); + this._settings.set_enum('category-icon-type', this.categoryIconType); + this._settings.set_enum('shortcut-icon-type', this.shortcutsIconType); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + createIconSizeRow(title, iconSizeEnum){ + let iconsSizeRow = new PW.FrameBoxRow(); + let iconsSizeLabel = new Gtk.Label({ + label: _(title), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let iconSizeCombo = new Gtk.ComboBoxText({ + halign: Gtk.Align.END, + }); + iconSizeCombo.append("Default", _("Default")); + iconSizeCombo.append("ExtraSmall", _("Extra Small")); + iconSizeCombo.append("Small", _("Small")); + iconSizeCombo.append("Medium", _("Medium")); + iconSizeCombo.append("Large", _("Large")); + iconSizeCombo.append("ExtraLarge", _("Extra Large")); + iconSizeCombo.set_active(iconSizeEnum); + iconSizeCombo.connect('changed', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + iconsSizeRow.add(iconsSizeLabel); + iconsSizeRow.add(iconSizeCombo); + return [iconSizeCombo, iconsSizeRow]; + } + + checkIfResetButtonSensitive(){ + return ( + this.heightValue !== this._settings.get_default_value('menu-height').unpack() || + this.widthValue !== this._settings.get_default_value('menu-width-adjustment').unpack() || + this.rightPanelWidth !== this._settings.get_default_value('right-panel-width').unpack() || + this.menuWidth !== this._settings.get_default_value('menu-width').unpack() || + this.forcedMenuLocation !== 0 || + this.verticalSeparator !== this._settings.get_default_value('vert-separator').unpack() || + this.gridIconsSizeCombo.get_active() !== 0 || + this.menuItemIconSizeCombo.get_active() !== 0 || + this.buttonIconSizeCombo.get_active() !== 0 || + this.quicklinksIconSizeCombo.get_active() !== 0 || + this.miscIconSizeCombo.get_active() !== 0 || + this.appDescriptions !== this._settings.get_default_value('apps-show-extra-details').unpack() || + this.categoryIconType !== 0 || + this.shortcutsIconType !== 1 ) ? true : false + } +}); + +var MenuSettingsFineTunePage = GObject.registerClass( + class Arc_Menu_MenuSettingsFineTunePage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.disableFadeEffect = this._settings.get_boolean('disable-scrollview-fade-effect'); + this.gapAdjustment = this._settings.get_int('gap-adjustment'); + this.removeMenuArrow = this._settings.get_boolean('remove-menu-arrow'); + this.disableSearchStyle = this._settings.get_boolean('disable-searchbox-border'); + this.alphabetizeAllPrograms = this._settings.get_boolean('alphabetize-all-programs') + this.multiLinedLabels = this._settings.get_boolean('multi-lined-labels'); + this.disableTooltips = this._settings.get_boolean('disable-tooltips'); + this.subMenus = this._settings.get_boolean('enable-sub-menus'); + this.showHiddenRecentFiles = this._settings.get_boolean('show-hidden-recent-files'); + + let searchStyleFrame = new PW.FrameBox(); + let searchStyleRow = new PW.FrameBoxRow(); + let searchStyleLabel = new Gtk.Label({ + label: _("Disable Searchbox Border"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let searchStyleSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + searchStyleSwitch.set_active(this._settings.get_boolean('disable-searchbox-border')); + searchStyleSwitch.connect('notify::active', (widget) => { + this.disableSearchStyle = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + searchStyleRow.add(searchStyleLabel); + searchStyleRow.add(searchStyleSwitch); + searchStyleFrame.add(searchStyleRow); + this.mainBox.append(searchStyleFrame); + + let tweakStyleFrame = new PW.FrameBox(); + let tweakStyleRow = new PW.FrameBoxRow(); + let tweakStyleLabel = new Gtk.Label({ + label: _("Disable Menu Arrow"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let tweakStyleSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + tweakStyleSwitch.set_active(this._settings.get_boolean('remove-menu-arrow')); + tweakStyleSwitch.connect('notify::active', (widget) => { + this.removeMenuArrow = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + tweakStyleRow.add(tweakStyleLabel); + tweakStyleRow.add(tweakStyleSwitch); + tweakStyleFrame.add(tweakStyleRow); + this.mainBox.append(tweakStyleFrame); + + let fadeEffectFrame = new PW.FrameBox(); + let fadeEffectRow = new PW.FrameBoxRow(); + let fadeEffectLabel = new Gtk.Label({ + label: _("Disable ScrollView Fade Effects"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let fadeEffectSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + fadeEffectSwitch.set_active(this._settings.get_boolean('disable-scrollview-fade-effect')); + fadeEffectSwitch.connect('notify::active', (widget) => { + this.disableFadeEffect = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + fadeEffectRow.add(fadeEffectLabel); + fadeEffectRow.add(fadeEffectSwitch); + fadeEffectFrame.add(fadeEffectRow); + this.mainBox.append(fadeEffectFrame); + + let tooltipFrame = new PW.FrameBox(); + let tooltipRow = new PW.FrameBoxRow(); + let tooltipLabel = new Gtk.Label({ + label: _("Disable Tooltips"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let tooltipSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + tooltipSwitch.set_active(this.disableTooltips); + tooltipSwitch.connect('notify::active', (widget) => { + this.disableTooltips = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + tooltipRow.add(tooltipLabel); + tooltipRow.add(tooltipSwitch); + tooltipFrame.add(tooltipRow); + this.mainBox.append(tooltipFrame); + + let alphabetizeAllProgramsFrame = new PW.FrameBox(); + let alphabetizeAllProgramsRow = new PW.FrameBoxRow(); + let alphabetizeAllProgramsLabel = new Gtk.Label({ + label: _("Alphabetize 'All Programs' Category"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let alphabetizeAllProgramsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + alphabetizeAllProgramsSwitch.set_active(this._settings.get_boolean('alphabetize-all-programs')); + alphabetizeAllProgramsSwitch.connect('notify::active', (widget) => { + this.alphabetizeAllPrograms = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + alphabetizeAllProgramsRow.add(alphabetizeAllProgramsLabel); + alphabetizeAllProgramsRow.add(alphabetizeAllProgramsSwitch); + alphabetizeAllProgramsFrame.add(alphabetizeAllProgramsRow); + this.mainBox.append(alphabetizeAllProgramsFrame); + + let subMenusFrame = new PW.FrameBox(); + let subMenusRow = new PW.FrameBoxRow(); + let subMenusLabel = new Gtk.Label({ + label: _('Category Sub Menus'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let subMenusSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + subMenusSwitch.set_active(this.subMenus); + subMenusSwitch.connect('notify::active', (widget) => { + this.subMenus = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + subMenusRow.add(subMenusLabel); + subMenusRow.add(subMenusSwitch); + subMenusFrame.add(subMenusRow); + this.mainBox.append(subMenusFrame); + + let hiddenFilesFrame = new PW.FrameBox(); + let hiddenFilesRow = new PW.FrameBoxRow(); + let hiddenFilesLabel = new Gtk.Label({ + label: _('Show Hidden Recent Files'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let hiddenFilesSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + hiddenFilesSwitch.set_active(this.showHiddenRecentFiles); + hiddenFilesSwitch.connect('notify::active', (widget) => { + this.showHiddenRecentFiles = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + hiddenFilesRow.add(hiddenFilesLabel); + hiddenFilesRow.add(hiddenFilesSwitch); + hiddenFilesFrame.add(hiddenFilesRow); + this.mainBox.append(hiddenFilesFrame); + + let multiLinedLabelFrame = new PW.FrameBox(); + let multiLinedLabelRow = new PW.FrameBoxRow(); + let multiLinedLabelLabel = new Gtk.Label({ + label: _("Multi-Lined Labels"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let multiLinedLabelSwitch = new Gtk.Switch({ halign: Gtk.Align.END, vexpand: false, valign: Gtk.Align.CENTER }); + multiLinedLabelSwitch.set_active(this._settings.get_boolean('multi-lined-labels')); + multiLinedLabelSwitch.connect('notify::active', (widget) => { + this.multiLinedLabels = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + let multiLinedLabelInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + multiLinedLabelInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Multi-Lined Labels"), + secondaryText: _('Enable/Disable multi-lined labels on large application icon layouts.'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + multiLinedLabelRow.add(multiLinedLabelLabel); + multiLinedLabelRow.add(multiLinedLabelSwitch); + multiLinedLabelRow.add(multiLinedLabelInfoButton); + multiLinedLabelFrame.add(multiLinedLabelRow); + this.mainBox.append(multiLinedLabelFrame); + + let gapAdjustmentFrame = new PW.FrameBox(); + let gapAdjustmentRow = new PW.FrameBoxRow(); + let gapAdjustmentLabel = new Gtk.Label({ + label: _('Gap Adjustment'), + xalign:0, + hexpand: false, + }); + let gapAdjustmentScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: -1, upper: 20, step_increment: 1, page_increment: 1, page_size: 0 + }), + digits: 0,round_digits: 0,hexpand: true, + value_pos: Gtk.PositionType.RIGHT, + draw_value: true, + }); + gapAdjustmentScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + gapAdjustmentScale.set_value(this.gapAdjustment); + gapAdjustmentScale.connect('value-changed', () => { + this.gapAdjustment = gapAdjustmentScale.get_value(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + let gapAdjustmentInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + gapAdjustmentInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Adjust the gap between the ArcMenu button and the menu."), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + gapAdjustmentRow.add(gapAdjustmentLabel); + gapAdjustmentRow.add(gapAdjustmentScale); + gapAdjustmentRow.add(gapAdjustmentInfoButton); + gapAdjustmentFrame.add(gapAdjustmentRow); + this.mainBox.append(gapAdjustmentFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.gapAdjustment = this._settings.get_default_value('gap-adjustment').unpack(); + this.removeMenuArrow = this._settings.get_default_value('remove-menu-arrow').unpack(); + this.disableSearchStyle = this._settings.get_default_value('disable-searchbox-border').unpack(); + this.alphabetizeAllPrograms = this._settings.get_default_value('alphabetize-all-programs').unpack(); + this.multiLinedLabels = this._settings.get_default_value('multi-lined-labels').unpack(); + this.subMenus = this._settings.get_default_value('enable-sub-menus').unpack(); + this.showHiddenRecentFiles = this._settings.get_default_value('show-hidden-recent-files').unpack(); + this.disableTooltips = this._settings.get_default_value('disable-tooltips').unpack(); + this.disableFadeEffect = this._settings.get_default_value('disable-scrollview-fade-effect').unpack(); + alphabetizeAllProgramsSwitch.set_active(this.alphabetizeAllPrograms); + gapAdjustmentScale.set_value(this.gapAdjustment); + searchStyleSwitch.set_active(this.disableSearchStyle); + tweakStyleSwitch.set_active(this.removeMenuArrow); + multiLinedLabelSwitch.set_active(this.multiLinedLabels); + tooltipSwitch.set_active(this.disableTooltips); + subMenusSwitch.set_active(this.subMenus); + hiddenFilesSwitch.set_active(this.showHiddenRecentFiles); + fadeEffectSwitch.set_active(this.disableFadeEffect); + + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_int('gap-adjustment', this.gapAdjustment); + this._settings.set_boolean('remove-menu-arrow', this.removeMenuArrow); + this._settings.set_boolean('disable-searchbox-border', this.disableSearchStyle); + this._settings.set_boolean('alphabetize-all-programs', this.alphabetizeAllPrograms); + this._settings.set_boolean('multi-lined-labels', this.multiLinedLabels); + this._settings.set_boolean('disable-scrollview-fade-effect', this.disableFadeEffect); + this._settings.set_boolean('disable-tooltips', this.disableTooltips); + this._settings.set_boolean('enable-sub-menus', this.subMenus); + this._settings.set_boolean('show-hidden-recent-files', this.showHiddenRecentFiles); + this._settings.set_boolean('reload-theme', true); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.subMenus !== this._settings.get_default_value('enable-sub-menus').unpack() || + this.disableTooltips !== this._settings.get_default_value('disable-tooltips').unpack() || + this.gapAdjustment !== this._settings.get_default_value('gap-adjustment').unpack() || + this.removeMenuArrow !== this._settings.get_default_value('remove-menu-arrow').unpack() || + this.disableSearchStyle !== this._settings.get_default_value('disable-searchbox-border').unpack()|| + this.alphabetizeAllPrograms !== this._settings.get_default_value('alphabetize-all-programs').unpack()|| + this.multiLinedLabels !== this._settings.get_default_value('multi-lined-labels').unpack() || + this.disableFadeEffect !== this._settings.get_default_value('disable-scrollview-fade-effect').unpack() || + this.showHiddenRecentFiles !== this._settings.get_default_value('show-hidden-recent-files').unpack()) ? true : false; + } +}); + +var MenuSettingsNewAppsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsNewAppsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.disableRecentApps = this._settings.get_boolean('disable-recently-installed-apps'); + this.indicatorColor = this._settings.get_string('indicator-color'); + this.indicatorTextColor = this._settings.get_string('indicator-text-color'); + + let recentAppsFrame = new PW.FrameBox(); + let recentAppsRow = new PW.FrameBoxRow(); + let recentAppsLabel = new Gtk.Label({ + label: _("Disable New Apps Tracker"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let recentAppsSwitch = new Gtk.Switch({ + halign: Gtk.Align.END, + }); + + recentAppsSwitch.connect('notify::active', (widget) => { + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + this.disableRecentApps = widget.get_active(); + + if(widget.get_active()){ + appIndicatorColorFrame.hide(); + recentlyInstalledInfoLabel.hide(); + clearRecentAppsFrame.hide(); + } + else{ + appIndicatorColorFrame.show(); + recentlyInstalledInfoLabel.show(); + clearRecentAppsFrame.show(); + this.mainBox.show(); + } + this._settings.set_boolean('disable-recently-installed-apps', widget.get_active()); + }); + + recentAppsSwitch.set_active(this._settings.get_boolean('disable-recently-installed-apps')); + + recentAppsRow.add(recentAppsLabel); + recentAppsRow.add(recentAppsSwitch); + recentAppsFrame.add(recentAppsRow); + this.mainBox.append(recentAppsFrame); + + let appIndicatorColorFrame = new PW.FrameBox(); + let recentlyInstalledInfoLabel = new Gtk.Label({ + label: "" + _("Customize New Apps Indicator") + "", + use_markup: true, + xalign: 0, + hexpand: true, + }); + this.mainBox.append(recentlyInstalledInfoLabel); + let appIndicatorColorRow = new PW.FrameBoxRow(); + let appIndicatorColorLabel = new Gtk.Label({ + label: _('Category Indicator Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let appIndicatorColorChooser = new Gtk.ColorButton({ + use_alpha: true, + }); + let color = new Gdk.RGBA(); + color.parse(this.indicatorColor); + appIndicatorColorChooser.set_rgba(color); + appIndicatorColorChooser.connect('color-set', ()=>{ + this.indicatorColor = appIndicatorColorChooser.get_rgba().to_string(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appIndicatorColorRow.add(appIndicatorColorLabel); + appIndicatorColorRow.add(appIndicatorColorChooser); + appIndicatorColorFrame.add(appIndicatorColorRow); + + let appIndicatorTextColorRow = new PW.FrameBoxRow(); + let appIndicatorTextColorLabel = new Gtk.Label({ + label: _('App Indicator Label Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let appIndicatorTextColorChooser = new Gtk.ColorButton({ + use_alpha: true, + }); + color = new Gdk.RGBA(); + color.parse(this.indicatorTextColor); + appIndicatorTextColorChooser.set_rgba(color); + appIndicatorTextColorChooser.connect('color-set', ()=>{ + this.indicatorTextColor = appIndicatorTextColorChooser.get_rgba().to_string(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + appIndicatorTextColorRow.add(appIndicatorTextColorLabel); + appIndicatorTextColorRow.add(appIndicatorTextColorChooser); + appIndicatorColorFrame.add(appIndicatorTextColorRow); + this.mainBox.append(appIndicatorColorFrame); + + let clearRecentAppsFrame = new PW.FrameBox(); + let clearRecentAppsRow = new PW.FrameBoxRow(); + let clearRecentAppsLabel = new Gtk.Label({ + label: _("Clear Apps Marked 'New'"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let clearRecentAppsButton = new Gtk.Button({ + halign: Gtk.Align.END, + label: _("Clear All"), + }); + let sensitive = this._settings.get_strv('recently-installed-apps').length > 0; + clearRecentAppsButton.set_sensitive(sensitive); + clearRecentAppsButton.connect('clicked', (widget) => { + clearRecentAppsButton.set_sensitive(false); + this._settings.reset('recently-installed-apps'); + }); + clearRecentAppsRow.add(clearRecentAppsLabel); + clearRecentAppsRow.add(clearRecentAppsButton); + clearRecentAppsFrame.add(clearRecentAppsRow); + this.mainBox.append(clearRecentAppsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.disableRecentApps = this._settings.get_default_value('disable-recently-installed-apps').unpack(); + this.indicatorColor = this._settings.get_default_value('indicator-color').unpack(); + this.indicatorTextColor = this._settings.get_default_value('indicator-text-color').unpack(); + recentAppsSwitch.set_active(this.disableRecentApps); + let color = new Gdk.RGBA(); + color.parse(this.indicatorColor); + appIndicatorColorChooser.set_rgba(color); + color.parse(this.indicatorTextColor); + appIndicatorTextColorChooser.set_rgba(color); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_boolean('disable-recently-installed-apps', this.disableRecentApps); + this._settings.set_string('indicator-color', this.indicatorColor); + this._settings.set_string('indicator-text-color', this.indicatorTextColor); + this._settings.set_boolean('reload-theme', true); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.disableRecentApps !== this._settings.get_default_value('disable-recently-installed-apps').unpack() || + this.indicatorColor !== this._settings.get_default_value('indicator-color').unpack() || + this.indicatorTextColor !== this._settings.get_default_value('indicator-text-color').unpack() + ) ? true : false; + } +}); + +var MenuSettingsSearchOptionsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsSearchOptionsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.searchResultsDetails = this._settings.get_boolean('show-search-result-details'); + this.openWindowsSearchProvider = this._settings.get_boolean('search-provider-open-windows'); + this.recentFilesSearchProvider = this._settings.get_boolean('search-provider-recent-files'); + this.highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + this.maxSearchResults = this._settings.get_int('max-search-results'); + + let searchProvidersFrame = new PW.FrameBox(); + let searchProvidersLabel = new Gtk.Label({ + label: "" + _("Search Providers") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(searchProvidersLabel); + let openWindowsRow = new PW.FrameBoxRow(); + let openWindowsLabel = new Gtk.Label({ + label: _("Search for open windows across all workspaces"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let openWindowsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + openWindowsSwitch.set_active(this.openWindowsSearchProvider); + openWindowsSwitch.connect('notify::active', (widget) => { + this.openWindowsSearchProvider = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + openWindowsRow.add(openWindowsLabel); + openWindowsRow.add(openWindowsSwitch); + searchProvidersFrame.add(openWindowsRow); + + let recentFilesRow = new PW.FrameBoxRow(); + let recentFilesLabel = new Gtk.Label({ + label: _("Search for recent files"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let recentFilesSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + recentFilesSwitch.set_active(this.recentFilesSearchProvider); + recentFilesSwitch.connect('notify::active', (widget) => { + this.recentFilesSearchProvider = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + recentFilesRow.add(recentFilesLabel); + recentFilesRow.add(recentFilesSwitch); + searchProvidersFrame.add(recentFilesRow); + this.mainBox.append(searchProvidersFrame); + + let searchOptionsFrame = new PW.FrameBox(); + let searchOptionsLabel = new Gtk.Label({ + label: "" + _("Search Options") + "", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(searchOptionsLabel); + let descriptionsRow = new PW.FrameBoxRow(); + let descriptionsLabel = new Gtk.Label({ + label: _("Show descriptions of search results"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let descriptionsSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + descriptionsSwitch.set_active(this.searchResultsDetails); + descriptionsSwitch.connect('notify::active', (widget) => { + this.searchResultsDetails = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + descriptionsRow.add(descriptionsLabel); + descriptionsRow.add(descriptionsSwitch); + searchOptionsFrame.add(descriptionsRow); + + let highlightSearchResultRow = new PW.FrameBoxRow(); + let highlightSearchResultLabel = new Gtk.Label({ + label: _("Highlight search result terms"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let highlightSearchResultSwitch = new Gtk.Switch({ halign: Gtk.Align.END }); + highlightSearchResultSwitch.set_active(this.highlightSearchResultTerms); + highlightSearchResultSwitch.connect('notify::active', (widget) => { + this.highlightSearchResultTerms = widget.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + highlightSearchResultRow.add(highlightSearchResultLabel); + highlightSearchResultRow.add(highlightSearchResultSwitch); + searchOptionsFrame.add(highlightSearchResultRow); + + let maxSearchResultsRow = new PW.FrameBoxRow(); + let maxSearchResultsLabel = new Gtk.Label({ + label: _('Max Search Results'), + use_markup: true, + xalign: 0, + hexpand: true + }); + let maxSearchResultsScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ + lower: 2, + upper: 10, + step_increment: 1, + page_increment: 1, + page_size: 0 + }), + digits: 0, + round_digits: 0, + hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + maxSearchResultsScale.set_value(this.maxSearchResults); + maxSearchResultsScale.connect('value-changed', (widget) => { + this.maxSearchResults = widget.get_value(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + + maxSearchResultsRow.add(maxSearchResultsLabel); + maxSearchResultsRow.add(maxSearchResultsScale); + searchOptionsFrame.add( maxSearchResultsRow); + this.mainBox.append(searchOptionsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + this.resetButton.connect('clicked', ()=> { + this.searchResultsDetails = this._settings.get_default_value('show-search-result-details').unpack(); + this.openWindowsSearchProvider = this._settings.get_default_value('search-provider-open-windows').unpack(); + this.recentFilesSearchProvider = this._settings.get_default_value('search-provider-recent-files').unpack(); + this.highlightSearchResultTerms = this._settings.get_default_value('highlight-search-result-terms').unpack(); + this.maxSearchResults = this._settings.get_default_value('max-search-results').unpack(); + descriptionsSwitch.set_active(this.searchResultsDetails); + openWindowsSwitch.set_active(this.openWindowsSearchProvider); + highlightSearchResultSwitch.set_active(this.highlightSearchResultTerms); + maxSearchResultsScale.set_value(this.maxSearchResults); + recentFilesSwitch.set_active(this.recentFilesSearchProvider); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(false); + }); + + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + this.saveButton.connect('clicked', ()=> { + this._settings.set_boolean('show-search-result-details', this.searchResultsDetails); + this._settings.set_boolean('search-provider-open-windows', this.openWindowsSearchProvider); + this._settings.set_boolean('search-provider-recent-files', this.recentFilesSearchProvider); + this._settings.set_boolean('highlight-search-result-terms', this.highlightSearchResultTerms); + this._settings.set_int('max-search-results', this.maxSearchResults); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + checkIfResetButtonSensitive(){ + return ( + this.searchResultsDetails !== this._settings.get_default_value('show-search-result-details').unpack() || + this.openWindowsSearchProvider !== this._settings.get_default_value('search-provider-open-windows').unpack() || + this.recentFilesSearchProvider !== this._settings.get_default_value('search-provider-recent-files').unpack() || + this.highlightSearchResultTerms !== this._settings.get_default_value('highlight-search-result-terms').unpack() || + this.maxSearchResults !== this._settings.get_default_value('max-search-results').unpack()) ? true : false; + } +}); + +var MenuSettingsCategoriesPage = GObject.registerClass( + class Arc_Menu_MenuSettingsCategoriesPage extends Gtk.Box { + _init(settings, settingType) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.settingType = settingType; + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.categoriesFrame = new PW.FrameBox(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._createFrame(this._settings.get_value(this.settingType).deep_unpack()); + this.mainBox.append(this.categoriesFrame); + + this.buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + this.categoriesFrame.remove_all_children(); + this._createFrame(this._settings.get_default_value(this.settingType).deep_unpack()); + this.categoriesFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < this.categoriesFrame.count; i++) { + let frame = this.categoriesFrame.get_index(i); + array.push([frame._enum, frame._shouldShow]); + } + this._settings.set_value(this.settingType, new GLib.Variant('a(ib)', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + this.buttonRow.append(this.resetButton); + this.buttonRow.append(this.saveButton); + this.append(this.buttonRow); + } + + getSensitive(){ + let defaultExtraCategories = this._settings.get_default_value(this.settingType).deep_unpack(); + let currentExtraCategories = this._settings.get_value(this.settingType).deep_unpack(); + return !Utils.getArraysEqual(defaultExtraCategories, currentExtraCategories); + } + + _createFrame(extraCategories){ + for(let i = 0; i < extraCategories.length; i++){ + let categoryEnum = extraCategories[i][0]; + let name = Constants.Categories[categoryEnum].NAME; + + let frameRow = new PW.FrameBoxDragRow(this); + frameRow._enum = extraCategories[i][0]; + frameRow._shouldShow = extraCategories[i][1]; + frameRow._name = Constants.Categories[categoryEnum].NAME; + frameRow._gicon = Gio.icon_new_for_string(Constants.Categories[categoryEnum].ICON); + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + frameRow.hasSwitch = true; + frameRow.switchActive = frameRow._shouldShow; + + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(name), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.categoriesFrame, + buttons: [this.saveButton, this.resetButton], + }); + + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + }); + + modifyButton.set_active(frameRow._shouldShow); + modifyButton.connect('notify::active', ()=> { + frameRow._shouldShow = modifyButton.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + buttonBox.insert_column(0); + buttonBox.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + buttonBox.insert_column(0); + buttonBox.attach(modifyButton, 0, 0, 1, 1); + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + this.categoriesFrame.add(frameRow); + } + } +}); + +var ColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ColorThemeDialogWindow extends PW.DialogWindow { + _init(settings, parent, themeName="") { + this._settings = settings; + this.addResponse = false; + this.themeName = themeName; + super._init(_('Color Theme Name'), parent); + } + + _createLayout(vbox) { + let nameFrameRow = new PW.FrameBoxRow(); + let nameFrameLabel = new Gtk.Label({ + label: _('Name:'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + nameFrameRow.add(nameFrameLabel); + this.nameEntry = new Gtk.Entry(); + this.nameEntry.set_width_chars(35); + + nameFrameRow.add(this.nameEntry); + this.nameEntry.grab_focus(); + if(this.themeName!=""){ + this.nameEntry.set_text(this.themeName); + } + this.nameEntry.connect('changed',()=>{ + if(this.nameEntry.get_text().length > 0) + saveButton.set_sensitive(true); + else + saveButton.set_sensitive(false); + }); + + vbox.append(nameFrameRow); + let saveButton = new Gtk.Button({ + label: _("Save Theme"), + halign: Gtk.Align.END + }); + saveButton.set_sensitive(false); + saveButton.connect('clicked', ()=> { + this.themeName = this.nameEntry.get_text(); + this.addResponse=true; + this.response(-10); + }); + vbox.append(saveButton); + } + get_response(){ + return this.addResponse; + } +}); + +var ExportColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ExportColorThemeDialogWindow extends PW.DialogWindow { + + _init(settings, parent, themes=null) { + this._settings = settings; + this._themes = themes; + this.addResponse = false; + this.selectedThemes = []; + super._init(this._themes ? _('Select Themes to Import'): _('Select Themes to Export'), parent); + } + + _createLayout(vbox) { + vbox.spacing = 0; + this.checkButtonArray = []; + this.shouldToggle =true; + let themesListScrollWindow = new Gtk.ScrolledWindow(); + themesListScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themesListScrollWindow.set_max_content_height(300); + themesListScrollWindow.set_min_content_height(300); + themesListScrollWindow.set_min_content_width(500); + themesListScrollWindow.set_min_content_width(500); + this.mainFrame = new PW.FrameBox(); + + let themesListButton = new Gtk.Button({ + label: this._themes ?_("Import"): _("Export"), + }); + + themesListButton.connect('clicked', () => { + this.addResponse = true; + this.response(-10); + }); + themesListButton.set_halign(Gtk.Align.END); + + themesListScrollWindow.set_child(this.mainFrame); + this.checkAllButton = new Gtk.CheckButton({ + margin_end: 23 + }); + + this.checkAllButton.set_halign(Gtk.Align.END); + this.checkAllButton.set_active(true); + this.checkAllButton.connect('toggled', () => { + let isActive = this.checkAllButton.get_active(); + if(this.shouldToggle){ + for(let i = 0; i< this.checkButtonArray.length; i++){ + this.checkButtonArray[i].set_active(isActive); + } + } + }); + let checkAllRow = new PW.FrameBoxRow(); + let checkAllLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + hexpand: true, + label: _("Select All"), + halign: Gtk.Align.END + }); + checkAllRow.add(checkAllLabel); + checkAllRow.add(this.checkAllButton); + vbox.append(checkAllRow); + vbox.append(themesListScrollWindow); + vbox.append(new PW.FrameBoxRow()); + vbox.append(themesListButton); + + this.color_themes = this._themes ? this._themes : this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i< this.color_themes.length; i++) { + let theme = this.color_themes[i]; + let frameRow = new PW.FrameBoxRow(); + + let themeBox = new Gtk.Box(); + + let frameLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + label: theme[0], + hexpand: true + }); + + let xpm = Utils.createXpmImage(theme[1], theme[2], theme[4], theme[5]); + let presetPreview = new Gtk.Image({ + hexpand: false, + margin_end: 5, + pixel_size: 42 + }); + presetPreview.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_xpm_data(xpm)); + themeBox.append(presetPreview); + themeBox.append(frameLabel); + frameRow.add(themeBox); + + let checkButton = new Gtk.CheckButton({ + margin_end: 20 + }); + checkButton.connect('toggled', () => { + if(checkButton.get_active()){ + this.selectedThemes.push(theme); + } + else{ + this.shouldToggle = false; + this.checkAllButton.set_active(false); + this.shouldToggle = true; + let index= this.selectedThemes.indexOf(theme); + this.selectedThemes.splice(index,1); + } + }); + this.checkButtonArray.push(checkButton); + frameRow.add(checkButton); + this.mainFrame.add(frameRow); + checkButton.set_active(true); + } + } + get_response(){ + return this.addResponse; + } +}); + +var ManageColorThemeDialogWindow = GObject.registerClass( + class Arc_Menu_ManageColorThemeDialogWindow extends PW.DialogWindow { + _init(settings, parent) { + this._settings = settings; + this.addResponse = false; + this.selectedThemes = []; + super._init( _('Manage Presets'), parent); + } + + _createLayout(vbox) { + let themesListScrollWindow = new Gtk.ScrolledWindow(); + themesListScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themesListScrollWindow.set_max_content_height(300); + themesListScrollWindow.set_min_content_height(300); + themesListScrollWindow.set_min_content_width(500); + themesListScrollWindow.set_min_content_width(500); + this.mainFrame = new PW.FrameBox(); + let buttonRow = new PW.FrameBoxRow(); + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + applyButton.set_sensitive(false); + applyButton.connect('clicked', () => { + this.addResponse = true; + this.response(-10); + }); + applyButton.set_halign(Gtk.Align.END); + + themesListScrollWindow.set_child(this.mainFrame); + vbox.append(themesListScrollWindow); + buttonRow.add(applyButton); + vbox.append(buttonRow); + + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i< this.color_themes.length; i++) { + let theme = this.color_themes[i]; + let frameRow = new PW.FrameBoxRow(); + let themeBox = new Gtk.Box(); + + let frameLabel = new Gtk.Label({ + use_markup: false, + xalign: 0, + label: theme[0], + hexpand: true + }); + let xpm = Utils.createXpmImage(theme[1], theme[2], theme[4], theme[5]); + let presetPreview = new Gtk.Image({ + hexpand: false, + margin_end: 5, + pixel_size: 42 + }); + presetPreview.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_xpm_data(xpm)); + + themeBox.append(presetPreview); + themeBox.append(frameLabel); + frameRow.add(themeBox); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.mainFrame, + buttons: [applyButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', () => { + let dialog = new ColorThemeDialogWindow(this._settings, this, theme[0]); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()) { + let index = frameRow.get_index(); + let array = [dialog.themeName, theme[1], theme[2], theme[3], theme[4], theme[5], + theme[6], theme[7], theme[8], theme[9], theme[10], theme[11], theme[12]]; + this.color_themes.splice(index,1,array); + theme = array; + frameLabel.label = dialog.themeName; + dialog.destroy(); + } + else + dialog.destroy(); + }); + applyButton.set_sensitive(true); + }); + buttonBox.connect('move-up', () => { + let index = frameRow.get_index(); + if(index > 0){ + this.color_themes.splice(index, 1); + this.color_themes.splice(index - 1, 0, theme); + } + }); + + buttonBox.connect('move-down', () => { + let index = frameRow.get_index(); + if(index + 1 < this.mainFrame.count){ + this.color_themes.splice(index, 1); + this.color_themes.splice(index + 1, 0, theme); + } + }); + + buttonBox.connect('delete', () => { + let index = frameRow.get_index(); + this.color_themes.splice(index, 1); + }); + + frameRow.add(buttonBox); + this.mainFrame.add(frameRow); + } + } + get_response(){ + return this.addResponse; + } +}); + +var OverrideArcMenuThemeWindow = GObject.registerClass({ + Signals: { + 'menu-theme-response': { param_types: [GObject.TYPE_INT] }, + }, +}, + class Arc_Menu_OverrideArcMenuThemeWindow extends Gtk.Box { + _init(settings, parentBox, parentMainBox) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + }); + this.parentBox = parentBox; + this._parentMainBox = parentMainBox; + this._settings = settings; + this.addResponse = false; + this.heightValue = this._settings.get_int('menu-height'); + this.rightPanelWidth = this._settings.get_int('right-panel-width'); + this.separatorColor = this._settings.get_string('separator-color'); + this.verticalSeparator = this._settings.get_boolean('vert-separator'); + this.customArcMenu = this._settings.get_boolean('enable-custom-arc-menu'); + + this.menuColor = this._settings.get_string('menu-color'); + this.menuForegroundColor = this._settings.get_string('menu-foreground-color'); + this.borderColor = this._settings.get_string('border-color'); + this.highlightColor = this._settings.get_string('highlight-color'); + this.highlightForegroundColor = this._settings.get_string('highlight-foreground-color'); + this.fontSize = this._settings.get_int('menu-font-size'); + this.borderSize = this._settings.get_int('menu-border-size'); + this.cornerRadius = this._settings.get_int('menu-corner-radius'); + this.menuMargin = this._settings.get_int('menu-margin'); + this.menuArrowSize = this._settings.get_int('menu-arrow-size'); + this.menuWidth = this._settings.get_int('menu-width'); + this.updatePresetComboBox = true; + this.shouldDeselect = true; + this._createLayout(this); + } + createIconList(store){ + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i= 0; i" + _('Menu Theme Presets') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + vbox.append(colorPresetHeaderLabel); + + this.colorPresetFrame = new PW.FrameBox(); + let colorPresetRow = new PW.FrameBoxRow(); + let colorPresetLabel = new Gtk.Label({ + label: _('Current Menu Theme Preset'), + xalign:0, + hexpand: true, + }); + let store = new Gtk.ListStore(); + store.set_column_types([GdkPixbuf.Pixbuf, GObject.TYPE_STRING]); + this.colorPresetCombo = new Gtk.ComboBox({ + model: store, + }); + + this.createIconList(store); + + let renderer = new Gtk.CellRendererPixbuf({xpad: 5}); + this.colorPresetCombo.pack_start(renderer, false); + this.colorPresetCombo.add_attribute(renderer, "pixbuf", 0); + renderer = new Gtk.CellRendererText(); + this.colorPresetCombo.pack_start(renderer, true); + this.colorPresetCombo.add_attribute(renderer, "text", 1); + + this.saveButton = new Gtk.Button({ + label: _("Save as Preset"), + hexpand: true, + halign: Gtk.Align.END + }); + this.checkIfPresetMatch(); + this.colorPresetCombo.connect('changed', (widget) => { + if(this.updatePresetComboBox){ + let index = widget.get_active(); + /*let defaultArray = ["Theme Name","Background Color", "Foreground Color","Border Color", "Highlight Color", "Hightlight Foreground Color", "Separator Color" + , "Font Size", "Border Size", "Corner Radius", "Arrow Size", "Menu Displacement", "Vertical Separator"];*/ + if(index>=0){ + this.menuColor = this.color_themes[index][1]; + this.menuForegroundColor = this.color_themes[index][2]; + this.borderColor = this.color_themes[index][3]; + this.highlightColor = this.color_themes[index][4]; + this.highlightForegroundColor = this.color_themes[index][5]; + this.separatorColor = this.color_themes[index][6]; + this.fontSize = parseInt(this.color_themes[index][7]); + this.borderSize = parseInt(this.color_themes[index][8]); + this.cornerRadius = parseInt(this.color_themes[index][9]); + this.menuArrowSize = parseInt(this.color_themes[index][10]); + this.menuMargin = parseInt(this.color_themes[index][11]); + this.verticalSeparator = (this.color_themes[index][12] === 'true'); + + this.shouldDeselect = false; + this.presetName=this.color_themes[index][0]; + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + + fontScale.set_value(this.fontSize); + + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + + borderScale.set_value(this.borderSize); + + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + + cornerScale.set_value(this.cornerRadius); + marginScale.set_value(this.menuMargin); + arrowScale.set_value(this.menuArrowSize); + + vertSeparatorSwitch.set_active(this.verticalSeparator); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + this.saveButton.set_sensitive(false); + applyButton.set_sensitive(true); + this.shouldDeselect = true; + resetButton.set_sensitive(this.checkIfResetButtonSensitive()); + } + } + }); + colorPresetRow.add(colorPresetLabel); + colorPresetRow.add(this.colorPresetCombo); + this.colorPresetFrame.add(colorPresetRow); + + let presetsButtonRow = new PW.FrameBoxRow(); + + this.saveButton.connect('clicked', () => { + /*let defaultArray = ["Theme Name","Background Color", "Foreground Color","Border Color", "Highlight Color", "Separator Color" + , "Font Size", "Border Size", "Corner Radius", "Arrow Size", "Menu Displacement", "Vertical Separator"];*/ + let dialog = new ColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let array = [dialog.themeName, this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + this.color_themes.push(array); + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + + let manageButton = new Gtk.Button({ + label: _("Manage Presets") + }); + manageButton.connect('clicked', ()=> { + let dialog = new ManageColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response)=>{ + if(dialog.get_response()){ + this.color_themes = dialog.color_themes; + this._settings.set_value('color-themes',new GLib.Variant('aas',dialog.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + let addButton = new PW.Button({ + title: _("Browse Presets"), + icon_name: "browse-presets-symbolic", + hexpand: false + }); + addButton.connect('clicked', () => { + let settingsFile = Gio.File.new_for_path(Me.path + '/media/misc/ArcMenuDefaultPresets'); + let [ success, content, etags] = settingsFile.load_contents(null); + let string = ByteArray.toString(content); + let themes = string.split("\n") + themes.pop(); //remove last blank array + let colorThemes = []; + for(let i = 0; i < themes.length; i++){ + let array = themes[i].split('//') + array.pop(); + colorThemes.push(array); + } + let dialog = new ExportColorThemeDialogWindow(this._settings, this, colorThemes); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let selectedThemes = dialog.selectedThemes; + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < selectedThemes.length; i++){ + this.color_themes.push(selectedThemes[i]); + } + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + dialog.destroy(); + } + else + dialog.destroy(); + }); + }); + + presetsButtonRow.add(manageButton); + presetsButtonRow.add(addButton); + presetsButtonRow.add(this.saveButton); + this.colorPresetFrame.add(presetsButtonRow); + vbox.append(this.colorPresetFrame); + + this._settings.connect("changed::color-themes", () => { + store.clear(); + this.createIconList(store); + this.colorPresetCombo.model = store; + this.colorPresetCombo.show(); + + this.checkIfPresetMatch(); + }); + + let menuSettingsHeaderLabel = new Gtk.Label({ + label: "" + _('Theme Settings') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + vbox.append(menuSettingsHeaderLabel); + + let themeSettingsFrame = new PW.FrameBox(); + let themeSettingsFrameScrollWindow = new Gtk.ScrolledWindow({ + vexpand: true, + valign: Gtk.Align.FILL + }); + themeSettingsFrameScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + themeSettingsFrameScrollWindow.set_min_content_height(250); + themeSettingsFrameScrollWindow.set_child(themeSettingsFrame); + vbox.append(themeSettingsFrameScrollWindow); + + //ROW 1 - MENU BACKGROUND COLOR-------------------------------------- + let menuBackgroudColorRow = new PW.FrameBoxRow(); + let menuBackgroudColorLabel = new Gtk.Label({ + label: _('Menu Background Color'), + xalign:0, + hexpand: true, + }); + let menuBackgroudColorChooser = new Gtk.ColorButton({use_alpha:true}); + let color = new Gdk.RGBA(); + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + menuBackgroudColorChooser.connect('color-set', () => { + this.menuColor = menuBackgroudColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuBackgroudColorRow.add(menuBackgroudColorLabel); + menuBackgroudColorRow.add(menuBackgroudColorChooser); + themeSettingsFrame.add(menuBackgroudColorRow); + + //ROW 2 - MENU FOREGROUND COLOR-------------------------------------- + let menuForegroundColorRow = new PW.FrameBoxRow(); + let menuForegroundColorLabel = new Gtk.Label({ + label: _('Menu Foreground Color'), + xalign:0, + hexpand: true, + }); + let menuForegroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + menuForegroundColorChooser.connect('color-set', () => { + this.menuForegroundColor = menuForegroundColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuForegroundColorRow.add(menuForegroundColorLabel); + menuForegroundColorRow.add(menuForegroundColorChooser); + themeSettingsFrame.add(menuForegroundColorRow); + + //ROW 3 - FONT SIZE-------------------------------------------------- + let fontSizeRow = new PW.FrameBoxRow(); + let fontSizeLabel = new Gtk.Label({ + label: _('Font Size'), + xalign:0, + hexpand: true, + }); + + let fontScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 8, upper: 14, step_increment: 1, page_increment: 1, page_size: 0 }), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + fontScale.set_format_value_func( (scale, value) => { + return value + "pt"; + }); + fontScale.set_value(this.fontSize); + fontScale.connect('value-changed', () => { + this.fontSize = fontScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + fontSizeRow.add(fontSizeLabel); + fontSizeRow.add(fontScale); + themeSettingsFrame.add(fontSizeRow); + + //ROW 4- Border Color------------------------------------------------- + let borderColorRow = new PW.FrameBoxRow(); + let borderColorLabel = new Gtk.Label({ + label: _('Border Color'), + xalign:0, + hexpand: true, + }); + let borderColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + borderColorChooser.connect('color-set', ()=>{ + this.borderColor = borderColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + borderColorRow.add(borderColorLabel); + borderColorRow.add(borderColorChooser); + themeSettingsFrame.add(borderColorRow); + + //ROW 5 - Border Size------------------------------------------------------- + let borderSizeRow = new PW.FrameBoxRow(); + let borderSizeLabel = new Gtk.Label({ + label: _('Border Size'), + xalign:0, + hexpand: true, + }); + let borderScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({lower: 0, upper: 4, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + borderScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + borderScale.set_value(this.borderSize); + borderScale.connect('value-changed', () => { + this.borderSize = borderScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + borderSizeRow.add(borderSizeLabel); + borderSizeRow.add(borderScale); + themeSettingsFrame.add(borderSizeRow); + + //ROW 6 - Active Item Background Color----------------------------------------------- + let itemColorRow = new PW.FrameBoxRow(); + let itemColorLabel = new Gtk.Label({ + label: _('Active Item Background Color'), + xalign:0, + hexpand: true, + }); + let itemColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + itemColorChooser.connect('color-set', () => { + this.highlightColor = itemColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + itemColorRow.add(itemColorLabel); + itemColorRow.add(itemColorChooser); + themeSettingsFrame.add(itemColorRow); + + //ROW 7 - Active Item Foreground Color----------------------------------------------- + let itemForegroundColorRow = new PW.FrameBoxRow(); + let itemForegroundColorLabel = new Gtk.Label({ + label: _('Active Item Foreground Color'), + xalign:0, + hexpand: true, + }); + let itemForegroundColorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + itemForegroundColorChooser.connect('color-set', () => { + this.highlightForegroundColor = itemForegroundColorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + itemForegroundColorRow.add(itemForegroundColorLabel); + itemForegroundColorRow.add(itemForegroundColorChooser); + themeSettingsFrame.add(itemForegroundColorRow); + + //ROW 8 - Corner Radius----------------------------------------------------- + let cornerRadiusRow = new PW.FrameBoxRow(); + let cornerRadiusLabel = new Gtk.Label({ + label: _('Corner Radius'), + xalign:0, + hexpand: true, + }); + let cornerScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 20, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + cornerScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + cornerScale.set_value(this.cornerRadius); + cornerScale.connect('value-changed', () => { + this.cornerRadius = cornerScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + cornerRadiusRow.add(cornerRadiusLabel); + cornerRadiusRow.add(cornerScale); + themeSettingsFrame.add(cornerRadiusRow); + + //ROW 9 - Menu Arrow Size------------------------------------------------------- + let menuMarginRow = new PW.FrameBoxRow(); + let menuMarginLabel = new Gtk.Label({ + label: _('Menu Arrow Size'), + xalign:0, + hexpand: true, + }); + let marginScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 30, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + marginScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + marginScale.set_value(this.menuMargin); + marginScale.connect('value-changed', () => { + this.menuMargin = marginScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuMarginRow.add(menuMarginLabel); + menuMarginRow.add(marginScale); + themeSettingsFrame.add(menuMarginRow); + + //ROW 10 - Menu Displacement------------------------------------------------------ + let menuArrowRow = new PW.FrameBoxRow(); + let menuArrowLabel = new Gtk.Label({ + label: _('Menu Displacement'), + xalign:0, + hexpand: true, + }); + let arrowScale = new Gtk.Scale({ + orientation: Gtk.Orientation.HORIZONTAL, + adjustment: new Gtk.Adjustment({ lower: 0,upper: 20, step_increment: 1, page_increment: 1, page_size: 0}), + digits: 0, round_digits: 0, hexpand: true, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT + }); + arrowScale.set_format_value_func( (scale, value) => { + return "\t" + value + "px"; + }); + arrowScale.set_value(this.menuArrowSize); + arrowScale.connect('value-changed', () => { + this.menuArrowSize = arrowScale.get_value(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + menuArrowRow.add(menuArrowLabel); + menuArrowRow.add(arrowScale); + themeSettingsFrame.add(menuArrowRow); + + //ROW 11 - Vertical Separator------------------------------------------------------ + let vertSeparatorRow = new PW.FrameBoxRow(); + let vertSeparatorLabel = new Gtk.Label({ + label: _('Enable Vertical Separator'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let vertSeparatorSwitch = new Gtk.Switch({ halign: Gtk.Align.END}); + vertSeparatorSwitch.set_active(this.verticalSeparator); + vertSeparatorSwitch.connect('notify::active', (widget) => { + this.verticalSeparator = widget.get_active(); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + applyButton.set_sensitive(true); + resetButton.set_sensitive(true); + }); + vertSeparatorRow.add(vertSeparatorLabel); + vertSeparatorRow.add(vertSeparatorSwitch); + themeSettingsFrame.add(vertSeparatorRow); + + //ROW 12 - Separator Color------------------------------------------------------ + let separatorColorRow = new PW.FrameBoxRow(); + let separatorColorLabel = new Gtk.Label({ + label: _('Separator Color'), + use_markup: true, + xalign: 0, + hexpand: true, + selectable: false + }); + let colorChooser = new Gtk.ColorButton({use_alpha:true}); + color = new Gdk.RGBA(); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + colorChooser.connect('color-set', ()=>{ + this.separatorColor = colorChooser.get_rgba().to_string(); + applyButton.set_sensitive(true); + if(this.shouldDeselect) + this.checkIfPresetMatch(); + resetButton.set_sensitive(true); + }); + separatorColorRow.add(separatorColorLabel); + separatorColorRow.add(colorChooser); + themeSettingsFrame.add(separatorColorRow); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + this._parentMainBox.buttonRow = buttonRow; + let resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + valign: Gtk.Align.END, + vexpand: false + }); + resetButton.set_sensitive( this.checkIfResetButtonSensitive()); + resetButton.connect('clicked', ()=> { + this.separatorColor = this._settings.get_default_value('separator-color').unpack(); + this.verticalSeparator = this._settings.get_default_value('vert-separator').unpack(); + this.menuColor = this._settings.get_default_value('menu-color').unpack(); + this.menuForegroundColor = this._settings.get_default_value('menu-foreground-color').unpack(); + this.borderColor = this._settings.get_default_value('border-color').unpack(); + this.highlightColor = this._settings.get_default_value('highlight-color').unpack(); + this.highlightForegroundColor = this._settings.get_default_value('highlight-foreground-color').unpack(); + this.fontSize = this._settings.get_default_value('menu-font-size').unpack(); + this.borderSize = this._settings.get_default_value('menu-border-size').unpack(); + this.cornerRadius = this._settings.get_default_value('menu-corner-radius').unpack(); + this.menuMargin = this._settings.get_default_value('menu-margin').unpack(); + this.menuArrowSize = this._settings.get_default_value('menu-arrow-size').unpack(); + + color.parse(this.menuColor); + menuBackgroudColorChooser.set_rgba(color); + + color.parse(this.menuForegroundColor); + menuForegroundColorChooser.set_rgba(color); + + fontScale.set_value(this.fontSize); + + color.parse(this.borderColor); + borderColorChooser.set_rgba(color); + + borderScale.set_value(this.borderSize); + + color.parse(this.highlightColor); + itemColorChooser.set_rgba(color); + + color.parse(this.highlightForegroundColor); + itemForegroundColorChooser.set_rgba(color); + + cornerScale.set_value(this.cornerRadius); + marginScale.set_value(this.menuMargin); + arrowScale.set_value(this.menuArrowSize); + + vertSeparatorSwitch.set_active(this.verticalSeparator); + color.parse(this.separatorColor); + colorChooser.set_rgba(color); + + resetButton.set_sensitive(false); + applyButton.set_sensitive(true); + }); + + + let applyButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true, + halign: Gtk.Align.END + }); + applyButton.connect('clicked', ()=> { + applyButton.set_sensitive(false); + this.emit('menu-theme-response', -10); + }); + applyButton.set_sensitive(false); + + buttonRow.append(resetButton); + buttonRow.append(applyButton); + + this._parentMainBox.append(buttonRow); + } + get_response(){ + return this.addResponse; + } + checkIfPresetMatch(){ + this.presetName = "Custom Theme"; + let currentSettingsArray = [this.menuColor, this.menuForegroundColor, this.borderColor, this.highlightColor, this.highlightForegroundColor, this.separatorColor, + this.fontSize.toString(), this.borderSize.toString(), this.cornerRadius.toString(), this.menuArrowSize.toString(), + this.menuMargin.toString(), this.verticalSeparator.toString()]; + let all_color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0;i < all_color_themes.length;i++){ + this.isEqual=true; + for(let l = 0; l { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array=[]; + for(let i = 0;i { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps([newPinnedApps],softwareShortcutsFrame); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + softwareShortcutsFrame.remove_all_children(); + this._loadPinnedApps(this._settings.get_default_value('directory-shortcuts-list').deep_unpack(), softwareShortcutsFrame); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < softwareShortcutsFrame.count; i++) { + let frame = softwareShortcutsFrame.get_index(i); + array.push([frame._name, frame._icon, frame._cmd]); + } + this._settings.set_value('directory-shortcuts-list', new GLib.Variant('aas', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultShortcuts = this._settings.get_default_value('directory-shortcuts-list').deep_unpack(); + let currentShortcuts = this._settings.get_value('directory-shortcuts-list').deep_unpack(); + return !Utils.getArraysEqual(defaultShortcuts, currentShortcuts); + } + + _loadPinnedApps(applicationShortcuts,softwareShortcutsFrame){ + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = _(applicationShortcuts[i][0]); + let editable = true; + if(applicationShortcuts[i][2].startsWith("ArcMenu_")){ + editable = false; + } + + let frameRow = new PW.FrameBoxDragRow(this.softwareShortcutsScrollWindow); + frameRow._name = applicationName; + frameRow._icon = applicationShortcuts[i][1]; + frameRow._gicon = Gio.icon_new_for_string(getIconPath(applicationShortcuts[i])); + frameRow._cmd = applicationShortcuts[i][2]; + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(applicationName), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: softwareShortcutsFrame, + buttons: [this.resetButton, this.saveButton], + modifyButton: editable, + deleteButton: true + }); + + if(editable){ + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.DIRECTORIES, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newApplicationShortcut = dialog.get_newPinnedAppsArray(); + frameRow._name = newApplicationShortcut[0]; + frameRow._icon = newApplicationShortcut[1]; + frameRow._cmd = newApplicationShortcut[2]; + softwareShortcutsLabel.label = _(frameRow._name); + applicationIcon.gicon = Gio.icon_new_for_string(frameRow._icon); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(true); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + } + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + softwareShortcutsFrame.add(frameRow); + } + } +}); +var MenuSettingsShortcutApplicationsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsShortcutApplicationsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + let softwareShortcutsFrame = new PW.FrameBox(); + this.softwareShortcutsScrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.softwareShortcutsScrollWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); + this.softwareShortcutsScrollWindow.set_min_content_height(300); + this.softwareShortcutsScrollWindow.set_child(softwareShortcutsFrame); + + let applicationShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._loadPinnedApps(applicationShortcuts,softwareShortcutsFrame); + this.mainBox.append(this.softwareShortcutsScrollWindow); + + let addPinnedAppsFrame = new PW.FrameBox(); + let addPinnedAppsFrameRow = new PW.FrameBoxRow(); + let addPinnedAppsFrameLabel = new Gtk.Label({ + label: _("Add More Apps"), + use_markup: true, + xalign: 0, + hexpand: true + }); + let addPinnedAppsButton = new PW.Button({ + icon_name: 'list-add-symbolic', + }); + addPinnedAppsButton.connect('clicked', ()=> { + let dialog = new AddAppsToPinnedListWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + let array=[]; + for(let i = 0;i { + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newPinnedApps = dialog.get_newPinnedAppsArray(); + this._loadPinnedApps([newPinnedApps],softwareShortcutsFrame); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + addCustomAppFrameRow.add(addCustomAppFrameLabel); + addCustomAppFrameRow.add(addCustomAppButton); + addCustomAppFrame.add(addCustomAppFrameRow); + this.mainBox.append(addCustomAppFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + softwareShortcutsFrame.remove_all_children(); + this._loadPinnedApps(this._settings.get_default_value('application-shortcuts-list').deep_unpack(), softwareShortcutsFrame); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < softwareShortcutsFrame.count; i++) { + let frame = softwareShortcutsFrame.get_index(i); + array.push([frame._name,frame._icon, frame._cmd]); + } + this._settings.set_value('application-shortcuts-list', new GLib.Variant('aas', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultShortcuts = this._settings.get_default_value('application-shortcuts-list').deep_unpack(); + let currentShortcuts = this._settings.get_value('application-shortcuts-list').deep_unpack(); + return !Utils.getArraysEqual(defaultShortcuts, currentShortcuts); + } + + _loadPinnedApps(applicationShortcuts,softwareShortcutsFrame){ + for(let i = 0; i < applicationShortcuts.length; i++){ + let applicationName = applicationShortcuts[i][0]; + + let frameRow = new PW.FrameBoxDragRow(this.softwareShortcutsScrollWindow); + let iconString; + frameRow._name = applicationShortcuts[i][0]; + frameRow._icon = applicationShortcuts[i][1]; + frameRow._cmd = applicationShortcuts[i][2]; + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + iconString = frameRow._icon; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + frameRow._gicon = Gio.icon_new_for_string(iconString); + let applicationIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let applicationImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + applicationImageBox.append(dragImage); + applicationImageBox.append(applicationIcon); + frameRow.add(applicationImageBox); + + let softwareShortcutsLabel = new Gtk.Label({ + label: _(applicationName), + use_markup: true, + xalign: 0, + hexpand: true + }); + + checkIfValidShortcut(frameRow, softwareShortcutsLabel, applicationIcon); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: softwareShortcutsFrame, + buttons: [this.saveButton, this.resetButton], + modifyButton: true, + deleteButton: true + }); + + buttonBox.connect('modify', ()=> { + let appArray = [frameRow._name,frameRow._icon,frameRow._cmd]; + let dialog = new AddCustomLinkDialogWindow(this._settings, this, Constants.DiaglogType.APPLICATIONS, true, appArray); + dialog.show(); + dialog.connect('response', ()=> { + if(dialog.get_response()) { + let newApplicationShortcut = dialog.get_newPinnedAppsArray(); + frameRow._name = newApplicationShortcut[0]; + frameRow._icon = newApplicationShortcut[1]; + frameRow._cmd = newApplicationShortcut[2]; + softwareShortcutsLabel.label = _(frameRow._name); + let iconString; + if(frameRow._icon === "" && Gio.DesktopAppInfo.new(frameRow._cmd)){ + iconString = Gio.DesktopAppInfo.new(frameRow._cmd).get_icon() ? Gio.DesktopAppInfo.new(frameRow._cmd).get_icon().to_string() : ""; + } + applicationIcon.gicon = Gio.icon_new_for_string(iconString ? iconString : frameRow._icon); + dialog.destroy(); + softwareShortcutsFrame.show(); + this.resetButton.set_sensitive(true); + this.saveButton.set_sensitive(true); + } + else + dialog.destroy(); + }); + }); + + frameRow.add(softwareShortcutsLabel); + frameRow.add(buttonBox); + softwareShortcutsFrame.add(frameRow); + } + } +}); +var MenuSettingsPowerOptionsPage = GObject.registerClass( + class Arc_Menu_MenuSettingsPowerOptionsPage extends Gtk.Box { + _init(settings) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + }); + + this.scrollBox = new Gtk.ScrolledWindow(); + this.scrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.scrollBox.set_child(this.mainBox); + this.append(this.scrollBox); + this._settings = settings; + this.powerOptionsFrame = new PW.FrameBox(); + + this.resetButton = new Gtk.Button({ + label: _("Restore Defaults"), + }); + this.saveButton = new Gtk.Button({ + label: _("Apply"), + hexpand: true + }); + + this._createFrame(this._settings.get_value("power-options").deep_unpack()); + this.mainBox.append(this.powerOptionsFrame); + + let buttonRow = new Gtk.Box({ + valign: Gtk.Align.END, + margin_top: 6, + margin_bottom: 6, + margin_start: 24, + margin_end: 24, + }); + + this.resetButton.set_sensitive(this.getSensitive()); + + this.resetButton.connect('clicked', ()=> { + this.saveButton.set_sensitive(true); + this.powerOptionsFrame.remove_all_children(); + this._createFrame(this._settings.get_default_value('power-options').deep_unpack()); + this.powerOptionsFrame.show(); + this.resetButton.set_sensitive(false); + }); + + this.saveButton.connect('clicked', ()=> { + let array = []; + for(let i = 0; i < this.powerOptionsFrame.count; i++) { + let frame = this.powerOptionsFrame.get_index(i); + array.push([frame._enum, frame._shouldShow]); + } + this._settings.set_value('power-options', new GLib.Variant('a(ib)', array)); + this.saveButton.set_sensitive(false); + this.resetButton.set_sensitive(this.getSensitive()); + }); + this.saveButton.set_halign(Gtk.Align.END); + this.saveButton.set_sensitive(false); + buttonRow.append(this.resetButton); + buttonRow.append(this.saveButton); + this.append(buttonRow); + } + + getSensitive(){ + let defaultPowerOptions = this._settings.get_default_value("power-options").deep_unpack(); + let currentPowerOptions = this._settings.get_value("power-options").deep_unpack(); + return !Utils.getArraysEqual(defaultPowerOptions, currentPowerOptions); + } + + _createFrame(powerOptions){ + for(let i = 0; i < powerOptions.length; i++){ + let powerType = powerOptions[i][0]; + let name = Constants.PowerOptions[powerType].TITLE; + + let frameRow = new PW.FrameBoxDragRow(this); + frameRow._enum = powerOptions[i][0]; + frameRow._shouldShow = powerOptions[i][1]; + frameRow._name = Constants.PowerOptions[powerType].TITLE; + frameRow._gicon = Gio.icon_new_for_string(Constants.PowerOptions[powerType].IMAGE); + frameRow.saveButton = this.saveButton; + frameRow.resetButton = this.resetButton; + frameRow.hasSwitch = true; + frameRow.switchActive = frameRow._shouldShow; + + let powerIcon = new Gtk.Image( { + gicon: frameRow._gicon, + pixel_size: 22 + }); + let powerImageBox = new Gtk.Box( { + margin_start: 0, + hexpand: false, + vexpand: false, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + powerImageBox.append(dragImage); + powerImageBox.append(powerIcon); + frameRow.add(powerImageBox); + + let powerLabel = new Gtk.Label({ + label: _(name), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let buttonBox = new PW.EditEntriesBox({ + frameRow: frameRow, + frame: this.powerOptionsFrame, + buttons: [this.saveButton, this.resetButton], + }); + + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + }); + + modifyButton.set_active(frameRow._shouldShow); + modifyButton.connect('notify::active', ()=> { + frameRow._shouldShow = modifyButton.get_active(); + this.saveButton.set_sensitive(true); + this.resetButton.set_sensitive(true); + }); + buttonBox.insert_column(0); + buttonBox.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + buttonBox.insert_column(0); + buttonBox.attach(modifyButton, 0, 0, 1, 1); + + frameRow.add(powerLabel); + frameRow.add(buttonBox); + this.powerOptionsFrame.add(frameRow); + } + } + }); + +var MiscPage = GObject.registerClass( + class Arc_Menu_MiscPage extends Gtk.ScrolledWindow { + _init(settings, parentBox) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let settingsHeaderLabel = new Gtk.Label({ + label: "" + _('Export or Import Settings') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(settingsHeaderLabel); + + let importFrame = new PW.FrameBox(); + let importRow = new PW.FrameBoxRow(); + let importLabel = new Gtk.Label({ + label: _("All ArcMenu Settings"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let settingsImportInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + settingsImportInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Export or Import All ArcMenu Settings"), + secondaryText: _('Importing settings from file may replace ALL saved settings.\nThis includes all saved pinned apps.'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + let importButtonsRow = new PW.FrameBoxRow(); + let importButton = new Gtk.Button({ + label: _("Import from File"), + hexpand: true, + vexpand: true, + }); + importButton.connect('clicked', ()=> { + this._showFileChooser( + _('Import settings'), + { action: Gtk.FileChooserAction.OPEN }, + "_Open", + filename => { + let settingsFile = Gio.File.new_for_path(filename); + let [ success_, pid, stdin, stdout, stderr] = + GLib.spawn_async_with_pipes( + null, + ['dconf', 'load', SCHEMA_PATH], + null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null + ); + + stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); + GLib.close(stdout); + GLib.close(stderr); + + stdin.splice(settingsFile.read(null), Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, null); + } + ); + }); + let exportButton = new Gtk.Button({ + label: _("Export to File"), + hexpand: true, + vexpand: true, + }); + exportButton.connect('clicked', ()=> { + this._showFileChooser( + _('Export settings'), + { action: Gtk.FileChooserAction.SAVE}, + "_Save", + (filename) => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + out.write_all(GLib.spawn_command_line_sync('dconf dump ' + SCHEMA_PATH)[1], null); + out.close(null); + } + ); + }); + + importRow.add(importLabel); + importRow.add(settingsImportInfoButton); + importButtonsRow.add(exportButton); + importButtonsRow.add(importButton); + importFrame.add(importRow); + importFrame.add(importButtonsRow); + this.mainBox.append(importFrame); + + let importColorPresetFrame = new PW.FrameBox(); + let importColorPresetRow = new PW.FrameBoxRow(); + let importColorPresetLabel = new Gtk.Label({ + label: _("Menu Theme Presets"), + use_markup: true, + xalign: 0, + hexpand: true + }); + + let colorThemesImportInfoButton = new PW.Button({ + icon_name: 'info-circle-symbolic' + }); + colorThemesImportInfoButton.connect('clicked', ()=> { + let dialog = new PW.MessageDialog({ + text: _("Export or Import Menu Theme Presets"), + secondaryText: _('Menu theme presets are located in the "Menu Theme" section'), + buttons: Gtk.ButtonsType.OK, + transient_for: this.get_root() + }); + dialog.connect ('response', ()=> dialog.destroy()); + dialog.show(); + }); + + let importColorPresetButtonsRow = new PW.FrameBoxRow(); + let importColorPresetButton = new Gtk.Button({ + label: _("Import Theme Preset"), + hexpand: true, + vexpand: true, + }); + importColorPresetButton.connect('clicked', ()=> { + this._showFileChooser( + _('Import Theme Preset'), + { action: Gtk.FileChooserAction.OPEN }, + "_Open", + filename => { + let settingsFile = Gio.File.new_for_path(filename); + let [ success, content, etags] = settingsFile.load_contents(null); + let string = ByteArray.toString(content); + let themes = string.split("\n") + themes.pop(); //remove last blank array + this.color_themes = []; + for(let i = 0; i < themes.length; i++){ + let array = themes[i].split('//') + array.pop(); + this.color_themes.push(array); + } + let dialog = new ExportColorThemeDialogWindow(this._settings, this, this.color_themes); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + let selectedThemes = dialog.selectedThemes; + this.color_themes = this._settings.get_value('color-themes').deep_unpack(); + for(let i = 0; i < selectedThemes.length; i++){ + this.color_themes.push(selectedThemes[i]); + } + + this._settings.set_value('color-themes',new GLib.Variant('aas',this.color_themes)); + + dialog.destroy(); + } + else + dialog.destroy(); + }); + } + ); + }); + let exportColorPresetButton = new Gtk.Button({ + label: _("Export Theme Preset"), + hexpand: true, + vexpand: true, + }); + exportColorPresetButton.connect('clicked', ()=> { + let dialog = new ExportColorThemeDialogWindow(this._settings, this); + dialog.show(); + dialog.connect('response', (response) => { + if(dialog.get_response()){ + this.selectedThemes = dialog.selectedThemes; + this._showFileChooser( + _('Export Theme Preset'), + { action: Gtk.FileChooserAction.SAVE }, + "_Save", + (filename) => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + for(let i = 0; i" + _('ArcMenu Settings Window Size') +"", + use_markup: true, + xalign: 0, + hexpand: true + }); + this.mainBox.append(settingsSizeHeaderLabel); + + let settingsSizeFrame = new PW.FrameBox(); + let settingsWidthRow = new PW.FrameBoxRow(); + let settingsWidthLabel = new Gtk.Label({ + label: _('Window Width'), + xalign:0, + hexpand: false, + }); + let settingsWidthScale = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 850, upper: 1800, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + hexpand: true, + halign: Gtk.Align.END + }); + settingsWidthScale.set_value(this._settings.get_int("settings-width")); + settingsWidthScale.connect('value-changed', (widget) => { + this._settings.set_int("settings-width", widget.get_value()) + }); + settingsWidthRow.add(settingsWidthLabel); + settingsWidthRow.add(settingsWidthScale); + settingsSizeFrame.add(settingsWidthRow); + + let settingsHeightRow = new PW.FrameBoxRow(); + let settingsHeightLabel = new Gtk.Label({ + label: _('Window Height'), + xalign:0, + hexpand: false, + }); + let settingsHeightScale = new Gtk.SpinButton({ + adjustment: new Gtk.Adjustment({ + lower: 300, upper: 1600, step_increment: 1, page_increment: 1, page_size: 0, + }), + climb_rate: 1, + digits: 0, + numeric: true, + hexpand: true, + halign: Gtk.Align.END + }); + settingsHeightScale.set_value(this._settings.get_int("settings-height")); + settingsHeightScale.connect('value-changed', (widget) => { + this._settings.set_int("settings-height", widget.get_value()) + }); + settingsHeightRow.add(settingsHeightLabel); + settingsHeightRow.add(settingsHeightScale); + settingsSizeFrame.add(settingsHeightRow); + + this.mainBox.append(settingsSizeFrame); + + let resetSettingsButton = new Gtk.Button({ + valign: Gtk.Align.END, + halign: Gtk.Align.START, + vexpand: true, + hexpand: false, + label: _("Reset all Settings"), + }); + let context = resetSettingsButton.get_style_context(); + context.add_class('suggested-action'); + resetSettingsButton.connect('clicked', (widget) => { + let dialog = new Gtk.MessageDialog({ + text: "" + _("Restore Default Settings?") + '\n' + _("All ArcMenu settings will be reset to the default value."), + use_markup: true, + buttons: Gtk.ButtonsType.YES_NO, + message_type: Gtk.MessageType.WARNING, + transient_for: this.get_root(), + modal: true + }); + dialog.connect('response', (widget, response) => { + if(response == Gtk.ResponseType.YES){ + GLib.spawn_command_line_sync('dconf reset -f /org/gnome/shell/extensions/arcmenu/'); + let children = [...parentBox.settingsFrameStack]; + for(let child of children){ + parentBox.settingsFrameStack.remove(child); + } + parentBox.populateSettingsFrameStack(); + } + dialog.destroy(); + }); + dialog.show(); + }); + + this.mainBox.append(resetSettingsButton); + } + _showFileChooser(title, params, acceptBtn, acceptHandler) { + let dialog = new Gtk.FileChooserDialog({ + title: _(title), + transient_for: this.get_root(), + modal: true, + action: params.action, + }); + dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button(acceptBtn, Gtk.ResponseType.ACCEPT); + + dialog.connect("response", (self, response) => { + if(response === Gtk.ResponseType.ACCEPT){ + try { + acceptHandler(dialog.get_file().get_path()); + } catch(e) { + log('error from ArcMenu filechooser: ' + e); + } + } + dialog.destroy(); + }); + + dialog.show(); + } + }); + function mergeObjects(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + return main; + }; + +var AboutPage = GObject.registerClass( + class Arc_Menu_AboutPage extends Gtk.ScrolledWindow { + _init(settings) { + super._init(); + this.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + + this.mainBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + margin_start: 24, + margin_end: 24, + spacing: 0, + vexpand: true, + valign: Gtk.Align.FILL + }); + + this.set_child(this.mainBox); + this._settings = settings; + + let releaseVersion; + if(Me.metadata.version) + releaseVersion = Me.metadata.version; + else + releaseVersion = 'unknown'; + + let commitVersion; + if(Me.metadata.commit) + commitVersion = Me.metadata.commit; + + let projectUrl = Me.metadata.url; + + let arcMenuImage = new Gtk.Image({ + margin_bottom: 5, + icon_name: 'arc-menu-logo', + pixel_size: 100, + }); + let arcMenuImageBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + margin_top: 10, + margin_bottom: 10, + hexpand: false, + vexpand: false + }); + arcMenuImageBox.append(arcMenuImage); + + let extensionInfoFrame = new PW.FrameBox(); + + let arcMenuVersionRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let versionText = new Gtk.Label({ + label: _('ArcMenu Version'), + }); + let versionInfo = new Gtk.Label({ + label: releaseVersion + '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + arcMenuVersionRow.add(versionText); + arcMenuVersionRow.add(versionInfo); + extensionInfoFrame.add(arcMenuVersionRow); + + let commitRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let commitText = new Gtk.Label({ + label: _('Git Commit'), + }); + let commitInfo = new Gtk.Label({ + label: commitVersion ? commitVersion : '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + commitRow.add(commitText); + commitRow.add(commitInfo); + if(commitVersion){ + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(commitRow); + } + + let gnomeVersionRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let gnomeVersionText = new Gtk.Label({ + label: _('GNOME Version'), + }); + let gnomeVersionInfo = new Gtk.Label({ + label: imports.misc.config.PACKAGE_VERSION + '', + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + gnomeVersionRow.add(gnomeVersionText); + gnomeVersionRow.add(gnomeVersionInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(gnomeVersionRow); + + let osRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let osText = new Gtk.Label({ + label: _('OS'), + }); + let osInfoText; + let name = GLib.get_os_info("NAME"); + let prettyName = GLib.get_os_info("PRETTY_NAME"); + if(prettyName) + osInfoText = prettyName; + else + osInfoText = name; + let versionID = GLib.get_os_info("VERSION_ID"); + if(versionID) + osInfoText += "; Version ID: " + versionID; + let buildID = GLib.get_os_info("BUILD_ID"); + if(buildID) + osInfoText += "; " + "Build ID: " +buildID; + + let osInfo = new Gtk.Label({ + label: osInfoText, + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + osRow.add(osText); + osRow.add(osInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(osRow); + + let windowingRow = new PW.FrameBoxRow({ + selectable: false, + activatable: false + }); + let windowingText = new Gtk.Label({ + label: _('Session Type'), + }); + let windowingLabel; + if(Me.metadata.isWayland) + windowingLabel = "Wayland"; + else + windowingLabel = "X11"; + + let windowingInfo = new Gtk.Label({ + label: windowingLabel, + hexpand: true, + sensitive: false, + halign: Gtk.Align.END + }); + windowingRow.add(windowingText); + windowingRow.add(windowingInfo); + extensionInfoFrame.add(createSeparator()); + extensionInfoFrame.add(windowingRow); + + let arcMenuInfoBox = new Gtk.Box( { + orientation: Gtk.Orientation.VERTICAL, + hexpand: false, + vexpand: false + }); + let arcMenuLabel = new Gtk.Label({ + label: '' + _('ArcMenu') + '', + use_markup: true, + vexpand: true, + valign: Gtk.Align.FILL + }); + + let projectDescriptionLabel = new Gtk.Label({ + label: _('Application Menu Extension for GNOME'), + hexpand: false, + vexpand: false, + margin_bottom: 5 + }); + let linksBox = new Gtk.Box({ + hexpand: false, + vexpand: false, + valign: Gtk.Align.END, + halign: Gtk.Align.CENTER, + margin_top: 0, + margin_bottom: 0, + margin_start: 0, + margin_end: 0, + spacing: 0, + }); + + let pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/donate-icon.svg', 150, 50); + let donateImage = Gtk.Picture.new_for_pixbuf(pixbuf); + let donateLinkButton = new Gtk.LinkButton({ + child: donateImage, + uri: 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=53CWA7NR743WC&item_name=Donate+to+support+my+work¤cy_code=USD&source=url', + }); + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(Me.path + '/media/icons/prefs_icons/gitlab-icon.svg', 150, 50); + let gitlabImage = Gtk.Picture.new_for_pixbuf(pixbuf); + let projectLinkButton = new Gtk.LinkButton({ + child: gitlabImage, + uri: projectUrl, + }); + + linksBox.append(projectLinkButton); + linksBox.append(donateLinkButton); + + this.creditsScrollWindow = new Gtk.ScrolledWindow({ + margin_top: 10, + margin_bottom: 0, + hexpand: false, + }); + this.creditsScrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.creditsScrollWindow.set_max_content_height(200); + this.creditsScrollWindow.set_min_content_height(200); + this.creditsFrame = new PW.Notebook(); + this.creditsFrame.scrollable = true; + let developersPage = new PW.NotebookPage(_("Developers")); + this.creditsFrame.append_page(developersPage); + let translatorsPage = new PW.NotebookPage(_("Translators")); + this.creditsFrame.append_page(translatorsPage); + let contributorsPage = new PW.NotebookPage(_("Contributors")); + this.creditsFrame.append_page(contributorsPage ); + let artworkPage = new PW.NotebookPage(_("Artwork")); + this.creditsFrame.append_page(artworkPage); + this.creditsScrollWindow.set_child(this.creditsFrame); + let creditsLabel = new Gtk.Label({ + label: _(Constants.DEVELOPERS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + }); + developersPage.append(creditsLabel); + creditsLabel = new Gtk.Label({ + label: _(Constants.TRANSLATORS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + }); + translatorsPage.append(creditsLabel); + creditsLabel = new Gtk.Label({ + label: _(Constants.CONTRIBUTORS), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + wrap: true + }); + contributorsPage.append(creditsLabel); + contributorsPage.hexpand = false; + creditsLabel = new Gtk.Label({ + label: _(Constants.ARTWORK), + use_markup: true, + halign: Gtk.Align.START, + hexpand: false, + vexpand: false, + wrap: true + }); + artworkPage.append(creditsLabel); + arcMenuImageBox.append(arcMenuLabel); + arcMenuImageBox.append(projectDescriptionLabel); + + let gnuSofwareLabel = new Gtk.Label({ + label: _(Constants.GNU_SOFTWARE), + use_markup: true, + justify: Gtk.Justification.CENTER + }); + let gnuSofwareLabelBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + valign: Gtk.Align.END, + vexpand: true, + margin_top: 5, + margin_bottom: 10 + }); + gnuSofwareLabelBox.append(gnuSofwareLabel); + + this.mainBox.append(arcMenuImageBox); + this.mainBox.append(arcMenuInfoBox); + this.mainBox.append(extensionInfoFrame); + + this.mainBox.append(this.creditsScrollWindow) + this.mainBox.append(gnuSofwareLabelBox); + this.mainBox.append(linksBox); + } +}); + +function createSeparator(){ + let separatorRow = new Gtk.ListBoxRow({ + selectable: false, + activatable: false + }); + separatorRow.set_child(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + return separatorRow; +} + +var ArcMenuPreferencesWidget = GObject.registerClass( +class Arc_Menu_ArcMenuPreferencesWidget extends Gtk.Box { + _init() { + super._init(); + + this.leftHeaderBox = new Gtk.Box({ + hexpand: true, + visible: true + }); + + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + + this.backButton = new Gtk.Button({ + child: new Gtk.Image({icon_name: 'go-previous-symbolic'}), + visible: true + }); + this.backButton.connect("clicked", () => { + this.leftHeaderBox.remove(this.backButton); + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectFirstRow(); + }); + + this.settingsFrameStack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.CROSSFADE + }); + + this.settingsListStack = new Gtk.Stack({ + hhomogeneous: true, + transition_type: Gtk.StackTransitionType.SLIDE_LEFT_RIGHT + }); + + let mainStackListBox = new PW.StackListBox(this, {width_request: 215}); + + let mainStackBox = mainStackListBox.scrollWindow; + mainStackListBox.addRow("General", _("General"), 'homescreen-symbolic'); + mainStackListBox.addRow("MenuLayout", _("Menu Layout"), 'menu-layouts-symbolic') + mainStackListBox.addRow("MenuTheme", _("Menu Theme"), 'menu-theme-symbolic'); + mainStackListBox.addRow("MenuSettingsGeneral", _("Customize Menu"), 'menu-settings-symbolic', "MenuSettings"); + mainStackListBox.addRow("ButtonAppearance", _("Button Appearance"), 'arc-menu-symbolic') + mainStackListBox.addRow("Misc", _("Misc"), 'misc-symbolic') + mainStackListBox.addRow("About", _("About"), 'info-circle-symbolic'); + mainStackListBox.setSeparatorIndices([1, 4, 5]); + + let menuSettingsStackListBox = new PW.StackListBox(this, {width_request: 215}); + let menuSettingsListBox = menuSettingsStackListBox.scrollWindow; + menuSettingsStackListBox.addRow("MenuSettingsGeneral", _("Menu Settings"), 'menu-settings-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsPinnedApps", _("Pinned Apps"), 'pinned-apps-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsShortcutDirectories", _("Directory Shortcuts"), 'folder-documents-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsShortcutApplications", _("Application Shortcuts"), 'preferences-desktop-apps-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsPowerOptions", _("Power Options"), 'gnome-power-manager-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsSearchOptions", _("Search Options"), 'preferences-system-search-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsCategories", _("Extra Categories"), 'categories-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsNewApps", _("New Apps Tracker"), 'preferences-system-notifications-symbolic'); + menuSettingsStackListBox.addRow("MenuSettingsFineTune", _("Fine-Tune"), 'fine-tune-symbolic'); + menuSettingsStackListBox.setSeparatorIndices([1, 4, 8]); + + this.settingsListStack.add_named(mainStackBox, "Main"); + this.settingsListStack.add_named(menuSettingsListBox, "MenuSettings"); + + let sidebar = new Gtk.StackSidebar(); + sidebar.set_stack(this.settingsListStack); + this.append(this.settingsListStack); + this.append(sidebar); + + this.append(this.settingsFrameStack); + this.populateSettingsFrameStack(); + } + + populateSettingsFrameStack(){ + this.settingsFrameStack.add_named(new GeneralPage(this._settings), "General"); + this.menuLayoutPage = new MenuLayoutPage(this._settings); + this.settingsFrameStack.add_named(this.menuLayoutPage, "MenuLayout"); + this.settingsFrameStack.add_named(new MenuThemePage(this._settings), "MenuTheme"); + + this.settingsFrameStack.add_named(new MenuSettingsGeneralPage(this._settings), "MenuSettingsGeneral"); + this.settingsFrameStack.add_named(new MenuSettingsPinnedAppsPage(this._settings), "MenuSettingsPinnedApps"); + + let menuSettingsPinnedAppsPage = this.settingsFrameStack.get_child_by_name("MenuSettingsPinnedApps"); + + if(this.pinnedAppsChangedID){ + this._settings.disconnect(this.pinnedAppsChangedID); + this.pinnedAppsChangedID = null; + } + this.pinnedAppsChangedID = this._settings.connect("changed::pinned-app-list", () =>{ + menuSettingsPinnedAppsPage.frame.remove_all_children(); + menuSettingsPinnedAppsPage._loadPinnedApps(this._settings.get_strv('pinned-app-list')); + menuSettingsPinnedAppsPage.frame.show(); + }); + + this.settingsFrameStack.add_named(new MenuSettingsShortcutDirectoriesPage(this._settings), "MenuSettingsShortcutDirectories"); + this.settingsFrameStack.add_named(new MenuSettingsShortcutApplicationsPage(this._settings), "MenuSettingsShortcutApplications"); + this.settingsFrameStack.add_named(new MenuSettingsPowerOptionsPage(this._settings), "MenuSettingsPowerOptions"); + this.settingsFrameStack.add_named(new MenuSettingsSearchOptionsPage(this._settings), "MenuSettingsSearchOptions"); + this.settingsFrameStack.add_named(new MenuSettingsCategoriesPage(this._settings, "extra-categories"), "MenuSettingsCategories"); + this.settingsFrameStack.add_named(new MenuSettingsNewAppsPage(this._settings), "MenuSettingsNewApps"); + this.settingsFrameStack.add_named(new MenuSettingsFineTunePage(this._settings), "MenuSettingsFineTune"); + this.settingsFrameStack.add_named(new ButtonAppearancePage(this._settings), "ButtonAppearance"); + this.settingsFrameStack.add_named(new MiscPage(this._settings, this), "Misc"); + this.settingsFrameStack.add_named(new AboutPage(this._settings), "About"); + + this.show(); + + if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.MAIN){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectFirstRow(); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.CUSTOMIZE_MENU){ + this.settingsListStack.set_visible_child_name("MenuSettings"); + this.settingsListStack.get_child_by_name('MenuSettings').listBox.selectRowAtIndex(0); + if(!this.backButton.get_parent()) + this.leftHeaderBox.append(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.MENU_LAYOUT){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.BUTTON_APPEARANCE){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(4); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.LAYOUT_TWEAKS){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + this.menuLayoutPage.connect("realize", () => this.menuLayoutPage.displayLayoutTweaksPage()); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.RUNNER_TWEAKS){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(1); + this.menuLayoutPage.connect("realize", () => this.menuLayoutPage.displayRunnerTweaksPage()); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + else if(this._settings.get_int('prefs-visible-page') === Constants.PrefsVisiblePage.ABOUT){ + this.settingsListStack.set_visible_child_name("Main"); + this.settingsListStack.get_child_by_name('Main').listBox.selectRowAtIndex(6); + if(this.backButton.get_parent()) + this.leftHeaderBox.remove(this.backButton); + } + this._settings.set_int('prefs-visible-page', Constants.PrefsVisiblePage.MAIN); + } +}); + +function init() { + ExtensionUtils.initTranslations(Me.metadata['gettext-domain']); +} + +function buildPrefsWidget() { + this._settings = ExtensionUtils.getSettings(Me.metadata['settings-schema']); + let iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()); + if(!iconTheme.get_search_path().includes(Me.path + "/media/icons/prefs_icons")) + iconTheme.add_search_path(Me.path + "/media/icons/prefs_icons"); + let widget = new ArcMenuPreferencesWidget(); + widget.connect("realize", () => { + let window = widget.get_root(); + + window.default_width = this._settings.get_int('settings-width'); + window.default_height = this._settings.get_int('settings-height'); + + window.set_title(_("ArcMenu Settings")); + window.get_titlebar().pack_start(widget.leftHeaderBox); + }); + + widget.show(); + return widget; +} + +function checkIfValidShortcut(frameRow, label, icon){ + if(frameRow._cmd.endsWith(".desktop") && !Gio.DesktopAppInfo.new(frameRow._cmd)){ + icon.icon_name = 'warning-symbolic'; + label.label = "" + _("Invalid Shortcut") + " "+ _(label.label); + } +} + +function getIconPath(listing){ + let path, icon; + + if(listing[2]=="ArcMenu_Home") + path = GLib.get_home_dir(); + else if(listing[2].startsWith("ArcMenu_")){ + let string = listing[2]; + path = string.replace("ArcMenu_",''); + if(path === "Documents") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS); + else if(path === "Downloads") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD); + else if(path === "Music") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC); + else if(path === "Pictures") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES); + else if(path === "Videos") + path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_VIDEOS); + else + path = null; + } + else if(listing[1] == listing[2]) + path = listing[2]; + else if(listing[1] == "ArcMenu_Folder"){ + path = listing[2]; + } + else + path = null; + + if(path){ + let file = Gio.File.new_for_path(path); + try { + let info = file.query_info('standard::symbolic-icon', 0, null); + icon = info.get_symbolic_icon(); + } catch (e) { + if (e instanceof Gio.IOErrorEnum) { + if (!file.is_native()) { + icon = new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); + } else { + icon = new Gio.ThemedIcon({ name: 'folder-symbolic' }); + } + } + } + return icon.to_string(); + } + else{ + if(listing[2]=="ArcMenu_Network") + return 'network-workgroup-symbolic'; + else if(listing[2]=="ArcMenu_Computer") + return 'drive-harddisk-symbolic'; + else + return listing[1]; + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js new file mode 100644 index 0000000..0700025 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/prefsWidgets.js @@ -0,0 +1,793 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk} = imports.gi; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +var Notebook = GObject.registerClass(class Arc_Menu_Notebook extends Gtk.Notebook{ + _init() { + super._init({ + margin_start: 0, + margin_end: 0 + }); + } + + append_page(notebookPage) { + Gtk.Notebook.prototype.append_page.call( + this, + notebookPage, + notebookPage.getTitleLabel() + ); + } +}); + +var NotebookPage = GObject.registerClass(class Arc_Menu_NotebookPage extends Gtk.Box { + _init(title) { + super._init({ + orientation: Gtk.Orientation.VERTICAL, + margin_top: 24, + margin_bottom: 24, + margin_start: 24, + margin_end: 24, + spacing: 20, + homogeneous: false + }); + this._title = new Gtk.Label({ + label: "" + title + "", + use_markup: true, + xalign: 0 + }); + } + + getTitleLabel() { + return this._title; + } +}); + +var Button = GObject.registerClass(class Arc_Menu_Button extends Gtk.Button { + _init(params) { + super._init(); + this._params = params; + this.halign = Gtk.Align.END; + this.valign = Gtk.Align.CENTER; + this.box = new Gtk.Box({ + orientation: Gtk.Orientation.HORIZONTAL, + spacing: 5 + }); + this.set_child(this.box); + + if (this._params.icon_name) { + let image = new Gtk.Image({ + icon_name: this._params.icon_name, + halign: Gtk.Align.CENTER + }); + this.box.append(image); + } + if (this._params.tooltip_text){ + this.set_tooltip_text(this._params.tooltip_text); + } + if (this._params.title){ + let label = new Gtk.Label({ + label: _(this._params.title), + use_markup: true, + xalign: 0 + }); + if(this._params.icon_first) + this.box.append(label); + else + this.box.prepend(label); + } + } +}); + +var DialogWindow = GObject.registerClass(class Arc_Menu_DialogWindow extends Gtk.Dialog { + _init(title, parent) { + super._init({ + title: title, + transient_for: parent.get_root(), + modal: true + }); + let vbox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + spacing: 20, + homogeneous: false, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + hexpand: true, + halign: Gtk.Align.FILL + }); + vbox.insert_after(this.get_content_area(), null); + this._createLayout(vbox); + } + + _createLayout(vbox) { + throw "Not implemented!"; + } +}); + +var MessageDialog = GObject.registerClass(class Arc_Menu_MessageDialog extends Gtk.MessageDialog { + _init(params) { + super._init({ + transient_for: params.transient_for, + modal: true, + buttons: params.buttons + }); + this.set_size_request(300, 50); + this.grid = new Gtk.Grid({ + row_spacing: 10, + column_spacing: 24, + margin_top: 24, + margin_bottom: 0, + margin_start: 24, + margin_end: 24, + hexpand: false, + halign: Gtk.Align.CENTER + }); + this.grid.insert_after(this.get_content_area(), null); + let text = new Gtk.Label({ + label: "" + _(params.text) + "", + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true, + }); + this.grid.attach(text, 1, 0, 1, 1); + + if(params.secondaryText){ + let secondayText = new Gtk.Label({ + label: _(params.secondaryText), + use_markup: true, + hexpand: false, + halign: Gtk.Align.START, + wrap: true, + }); + this.grid.attach(secondayText, 1, 1, 1, 1); + } + + if(params.iconName){ + let image = new Gtk.Image({ + icon_name: params.iconName, + pixel_size: 48 + }); + this.grid.attach(image, 0, 0, 1, 2); + } + } +}); + +var FrameBox = GObject.registerClass(class Arc_Menu_FrameBox extends Gtk.Frame { + _init(params) { + super._init(params); + this._listBox = new Gtk.ListBox(); + this._listBox.set_selection_mode(Gtk.SelectionMode.NONE); + this.count = 0; + this.children = []; + Gtk.Frame.prototype.set_child.call(this, this._listBox); + } + + add(boxRow) { + this._listBox.append(boxRow); + this.children.push(boxRow); + this.count++; + } + show() { + this._listBox.show(); + super.show(); + } + length() { + return this._listBox.length; + } + remove(boxRow){ + if(boxRow){ + this._listBox.remove(boxRow); + this.children = this.children.filter(e => e !== boxRow) + this.count = this.count -1; + } + } + removeChildrenAfterIndex(index){ + let childrenCount = this.count; + for(let i = childrenCount - 1; i > index; i--){ + let child = this._listBox.get_row_at_index(i); + if(child) this.remove(child); + } + this._listBox.show(); + } + remove_all_children() { + for(let i = 0; i < this.children.length; i++){ + let child = this.children[i]; + this._listBox.remove(child); + } + this.children = []; + this.count = 0; + this._listBox.show(); + } + get_index(index){ + return this._listBox.get_row_at_index(index); + } + insert(row, pos){ + this._listBox.insert(row, pos); + this.children.push(row); + this.count++; + } +}); + +var FrameBoxRow = GObject.registerClass(class Arc_Menu_FrameBoxRow extends Gtk.ListBoxRow { + _init(params) { + super._init(params); + this.selectable = false; + this.activatable = false; + this._grid = new Gtk.Grid({ + orientation: Gtk.Orientation.HORIZONTAL, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + column_spacing: 20, + row_spacing: 20 + }); + this.x = 0; + Gtk.ListBoxRow.prototype.set_child.call(this, this._grid); + } + + add(widget) { + this._grid.attach(widget, this.x, 0, 1, 1); + this.x++; + } + + setVerticalAlignmentBottom(){ + this._grid.vexpand = true; + this._grid.valign = Gtk.Align.END; + } +}); + +var FrameBoxDragRow = GObject.registerClass(class Arc_Menu_FrameBoxDragRow extends Gtk.ListBoxRow { + _init(scrolledWindow) { + super._init(); + + this._grid = new Gtk.Grid({ + orientation: Gtk.Orientation.HORIZONTAL, + margin_top: 5, + margin_bottom: 5, + margin_start: 5, + margin_end: 5, + column_spacing: 20, + row_spacing: 20 + }); + + let dragSource = new Gtk.DragSource({ + actions: Gdk.DragAction.MOVE + }); + this.add_controller(dragSource); + + let dropTarget = new Gtk.DropTargetAsync({ + actions: Gdk.DragAction.MOVE + }); + this.add_controller(dropTarget); + + this.x = 0; + Gtk.ListBoxRow.prototype.set_child.call(this, this._grid); + dragSource.connect("drag-begin", (self, gdkDrag) => { + //get listbox parent + let listBox = self.get_widget().get_parent(); + //get widgets parent - the listBoxDragRow + listBox.dragRow = this; + + let alloc = self.get_widget().get_allocation(); + let dragWidget = self.get_widget().createDragRow(alloc); + listBox.dragWidget = dragWidget; + + let icon = Gtk.DragIcon.get_for_drag(gdkDrag); + icon.set_child(dragWidget); + + gdkDrag.set_hotspot(listBox.dragX, listBox.dragY); + }); + + dragSource.connect("prepare", (self, x, y) => { + //get listbox parent + this.set_state_flags(Gtk.StateFlags.NORMAL, true); + let listBox = self.get_widget().get_parent(); + //store drag start cursor location + listBox.dragX = x; + listBox.dragY = y; + return new Gdk.ContentProvider(Arc_Menu_FrameBoxDragRow); + }); + + dragSource.connect("drag-end", (self, gdkDrag, deleteData)=> { + deleteData = true; + let listBox = self.get_widget().get_parent(); + listBox.dragWidget = null; + listBox.drag_unhighlight_row(); + }); + + dropTarget.connect("drag-enter", (self, gdkDrop, x, y, selection, info, time)=> { + let listBox = self.get_widget().get_parent(); + let widget = self.get_widget(); + + listBox.startIndex = widget.get_index(); + listBox.drag_highlight_row(widget); + + if(!scrolledWindow) + return true; + + let height = widget.get_height(); + let scrollHeight = scrolledWindow.get_height(); + let widgetLoc = widget.get_index() * height; + let value = scrolledWindow.vadjustment.value; + + if((widgetLoc + (height * 4)) > (value + scrollHeight)) + scrolledWindow.vadjustment.value += height; + else if((widgetLoc - (height * 2)) < value) + scrolledWindow.vadjustment.value -= height; + }); + + dropTarget.connect("drag-leave", (self, gdkDrop, x, y, selection, info, time)=> { + let listBox = self.get_widget().get_parent(); + listBox.drag_unhighlight_row(); + }); + + dropTarget.connect("drop", (self, gdkDrop, x, y, selection, info, time)=> { + //get listbox parent + let listBox = this.get_parent(); + let index = this.get_index(); + if(index === listBox.dragRow.get_index()){ + gdkDrop.read_value_async(Arc_Menu_FrameBoxDragRow, 1, null, ()=>{ + gdkDrop.finish(Gdk.DragAction.MOVE); + }); + return true; + } + listBox.remove(listBox.dragRow); + listBox.show(); + listBox.insert(listBox.dragRow, index); + this.resetButton?.set_sensitive(true); + this.saveButton.set_sensitive(true); + gdkDrop.read_value_async(Arc_Menu_FrameBoxDragRow, 1, null, ()=>{ + gdkDrop.finish(Gdk.DragAction.MOVE); + }); + return true; + }); + } + + createDragRow(alloc){ + let dragWidget = new Gtk.ListBox(); + dragWidget.set_size_request(alloc.width, alloc.height); + + let dragRow = new FrameBoxRow(); + dragWidget.append(dragRow); + dragWidget.drag_highlight_row(dragRow); + + let image = new Gtk.Image( { + gicon: this._gicon, + pixel_size: 22 + }); + + let imageBox = new Gtk.Box({ + margin_start: 0, + hexpand: false, + vexpand: true, + spacing: 5, + }); + let dragImage = new Gtk.Image( { + gicon: Gio.icon_new_for_string("drag-symbolic"), + pixel_size: 12 + }); + + imageBox.append(dragImage); + imageBox.append(image); + + dragRow.add(imageBox); + + let label = new Gtk.Label({ + use_markup: true, + xalign: 0, + hexpand: true, + label: _(this._name) + }); + dragRow.add(label); + let grid = new Gtk.Grid({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }) + let editButton = new Button({ + icon_name: 'view-more-symbolic' + }); + grid.attach(editButton, 0, 0, 1, 1); + + if(this.hasSwitch){ + let modifyButton = new Gtk.Switch({ + valign: Gtk.Align.CENTER, + margin_start: 10, + active: this.switchActive + }); + grid.insert_column(0); + grid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + grid.insert_column(0); + grid.attach(modifyButton, 0, 0, 1, 1); + } + if(this.hasEditButton){ + let editButton = new Button({ + icon_name: 'text-editor-symbolic', + }); + grid.insert_column(0); + grid.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + grid.insert_column(0); + grid.attach(editButton, 0, 0, 1, 1); + } + dragRow.add(grid); + + return dragWidget; + } + + add(widget) { + this._grid.attach(widget, this.x, 0, 1, 1); + this.x++; + } + + setVerticalAlignmentBottom(){ + this._grid.vexpand = true; + this._grid.valign = Gtk.Align.END; + } +}); + +var EditEntriesBox = GObject.registerClass({ + Signals: { + 'modify': {}, + 'change': {}, + 'move-up': {}, + 'move-down': {}, + 'delete': {}, + }, +}, class Arc_Menu_EditEntriesBox extends Gtk.Grid{ + _init(params){ + super._init({ + margin_top: 0, + margin_bottom: 0, + vexpand: false, + hexpand: false, + column_spacing: 10 + }); + let editPopover = new Gtk.Popover(); + let frameRow = params.frameRow; + let frame = params.frame; + let buttons = params.buttons; + + let modifyButton, deleteButton, changeButton; + + if(params.modifyButton){ + modifyButton = new Gtk.Button({ + label: _("Modify"), + has_frame: false + }); + modifyButton.connect('clicked', () => { + editPopover.popdown(); + this.emit('modify'); + }); + } + + if(params.changeButton){ + changeButton = new Button({ + icon_name: 'text-editor-symbolic', + }); + changeButton.connect('clicked', () => { + editPopover.popdown(); + this.emit('change'); + }); + } + + let editButton = new Gtk.MenuButton({ + icon_name: 'view-more-symbolic', + popover: editPopover, + }); + + this.attach(editButton, 0, 0, 1, 1); + + let editPopoverBox = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL + }); + + editPopover.set_child(editPopoverBox); + + let moveUpButton = new Gtk.Button({ + label: _("Move Up"), + has_frame: false + }); + moveUpButton.connect('clicked', ()=> { + this.emit('move-up'); + let index = frameRow.get_index(); + if(index > 0){ + frame.remove(frameRow); + frame.insert(frameRow, index - 1); + } + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + + let moveDownButton = new Gtk.Button({ + label: _("Move Down"), + has_frame: false + }); + moveDownButton.connect('clicked', ()=> { + this.emit('move-down'); + let index = frameRow.get_index(); + if(index + 1 < frame.count) { + frame.remove(frameRow); + frame.insert(frameRow, index + 1); + } + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + + if(params.deleteButton){ + deleteButton = new Gtk.Button({ + label: _("Delete"), + has_frame: false, + }); + deleteButton.connect('clicked', ()=> { + this.emit('delete'); + frame.remove(frameRow); + frame.show(); + buttons.forEach(button => button.set_sensitive(true)); + editPopover.popdown(); + }); + } + + if(params.changeButton){ + this.insert_column(0); + this.attach(Gtk.Separator.new(Gtk.Orientation.VERTICAL), 0, 0, 1, 1); + this.insert_column(0); + this.attach(changeButton, 0, 0, 1, 1); + } + + if(params.modifyButton){ + editPopoverBox.append(modifyButton); + editPopoverBox.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + } + + editPopoverBox.append(moveUpButton); + editPopoverBox.append(moveDownButton); + + if(params.deleteButton){ + editPopoverBox.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); + editPopoverBox.append(deleteButton); + } + } +}); + +var StackListBox = GObject.registerClass(class Arc_Menu_StackListBox extends Gtk.ListBox{ + _init(widget, params){ + super._init(params); + this.valign = Gtk.Align.FILL; + this.vexpand = true; + this.hexpand = false; + this.settingsFrameStack = widget.settingsFrameStack; + this.settingsListStack = widget.settingsListStack + this.connect("row-selected", (self, row) => { + if(row){ + let stackName = row.stackName; + this.settingsFrameStack.set_visible_child_name(stackName); + if(row.nextPage){ + if(widget.backButton.get_parent()) + widget.leftHeaderBox.remove(widget.backButton); + widget.leftHeaderBox.prepend(widget.backButton); + this.settingsListStack.set_visible_child_name(row.nextPage); + this.settingsListStack.get_child_by_name(row.nextPage).listBox.selectFirstRow(); + } + } + }); + this.scrollWindow = new Gtk.ScrolledWindow({ + valign: Gtk.Align.FILL, + vexpand: true + }); + this.scrollWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); + this.scrollWindow.set_child(this); + this.scrollWindow.listBox = this; + } + + getRowAtIndex(index){ + return this.get_row_at_index(index).get_children()[0]; + } + + getSelectedRow(){ + return this.get_selected_row().get_children()[0]; + } + + selectFirstRow(){ + this.select_row(this.get_row_at_index(0)); + } + + selectRowAtIndex(index){ + this.select_row(this.get_row_at_index(index)); + } + + addRow(name, translateableName, iconName, nextPage){ + let row1 = new Gtk.ListBoxRow(); + this.append(row1); + + let row = new Gtk.Grid({ + margin_top: 12, + margin_bottom: 12, + margin_start: 12, + margin_end: 12, + column_spacing: 10 + }); + row1.set_child(row); + row1.stackName = name; + row1.translateableName = translateableName; + + let image = new Gtk.Image({ + icon_name: iconName + }); + + let label = new Gtk.Label({ + label: translateableName, + halign: Gtk.Align.START, + }); + row.attach(image, 0, 0, 1, 1); + row.attach(label, 1, 0, 1, 1); + + if(nextPage){ + row1.nextPage = nextPage; + let image2 = new Gtk.Image({ + gicon: Gio.icon_new_for_string('go-next-symbolic'), + halign: Gtk.Align.END, + hexpand: true + }); + row.attach(image2, 2, 0, 1, 1); + } + } + + setSeparatorIndices(indexArray){ + this.set_header_func((_row, _before) =>{ + for(let i = 0; i < indexArray.length; i++){ + if(_row.get_index() === indexArray[i]){ + let sep = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL); + sep.show(); + _row.set_header(sep); + + } + } + }); + } +}); + +var TileGrid = GObject.registerClass(class Arc_Menu_TileGrid extends Gtk.FlowBox{ + _init(maxColumns) { + super._init({ + row_spacing: 5, + column_spacing: 5, + vexpand: true, + hexpand: true, + valign: Gtk.Align.CENTER, + halign: Gtk.Align.CENTER, + max_children_per_line: maxColumns, + homogeneous: true, + selection_mode: Gtk.SelectionMode.NONE + }); + } +}); + +var IconGrid = GObject.registerClass(class Arc_Menu_IconGrid extends Gtk.FlowBox{ + _init() { + super._init({ + max_children_per_line: 7, + row_spacing: 10, + column_spacing: 10, + vexpand: true, + hexpand: false, + valign: Gtk.Align.START, + halign: Gtk.Align.CENTER, + homogeneous: true, + selection_mode: Gtk.SelectionMode.SINGLE + }); + this.childrenCount = 0; + } + + add(widget){ + this.insert(widget, -1); + this.childrenCount++; + } +}); + +var Tile = GObject.registerClass(class Arc_Menu_Tile extends FrameBox{ + _init(name, file, width, height, layout) { + super._init({ + hexpand: true, + vexpand: false, + halign: Gtk.Align.FILL, + valign: Gtk.Align.CENTER + }); + this.box = new FrameBoxRow(); + this.box.activatable = true; + this.box._grid.row_spacing = 0; + this.box._grid.orientation = Gtk.Orientation.VERTICAL, + this.activatable = true; + this.name = name; + this.layout = layout; + this._image = new Gtk.Image({ + + gicon: Gio.icon_new_for_string(file), + pixel_size: width + }); + this._label = new Gtk.Label({ label: _(this.name) }); + + this.box._grid.attach(this._image, 0, 0, 1, 1); + this.box._grid.attach(this._label, 0, 1, 1, 1); + this._listBox.append(this.box); + } +}); + +var LayoutTile = GObject.registerClass(class Arc_Menu_LayoutTile extends FrameBox{ + _init(name, file, layout) { + super._init({ + halign: Gtk.Align.FILL, + valign: Gtk.Align.CENTER, + hexpand: true, + vexpand: false + }); + this._listBox.set_selection_mode(Gtk.SelectionMode.NONE); + this.name = name; + this.layout = layout.MENU_TYPE; + + this.box = new FrameBoxRow(); + this.box.activatable = true; + this.box._grid.row_spacing = 0; + this.box._grid.column_spacing = 0; + + this._image = new Gtk.Image({ + hexpand: false, + halign: Gtk.Align.START, + gicon: Gio.icon_new_for_string(file), + pixel_size: 46 + }); + + let titleLabel = new Gtk.Label({ + label: "" + _("%s Menu Layouts", layout.TITLE).format(layout.TITLE) + "", + use_markup: true, + hexpand: true, + halign: Gtk.Align.CENTER, + vexpand: true, + valign: Gtk.Align.CENTER, + wrap: true, + }) + + let goNextImage = new Gtk.Image({ + gicon: Gio.icon_new_for_string('go-next-symbolic'), + halign: Gtk.Align.END, + valign: Gtk.Align.CENTER, + hexpand: false, + vexpand: false, + }) + + this.box._grid.attach(this._image, 0, 0, 1, 2); + this.box._grid.attach(titleLabel, 1, 0, 1, 1); + this.box._grid.attach(goNextImage, 2, 0, 1, 2); + + this._listBox.append(this.box); + } +}); diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js new file mode 100644 index 0000000..eb51dff --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/recentFilesManager.js @@ -0,0 +1,111 @@ +const { Gtk, Gio, GLib } = imports.gi; +const ExtensionUtils = imports.misc.extensionUtils; +const Main = imports.ui.main; + +const LogEnabled = false; + +var isCanceled = false; +var currentQueries = []; + +var RecentFilesManager = class Arc_Menu_RecentFilesManager { + constructor() { + this._settings = ExtensionUtils.getSettings(); + this._recentManager = new Gtk.RecentManager(); + } + + filterRecentFiles(callback){ + isCanceled = false; + this._recentManager.get_items().sort((a, b) => b.get_modified() - a.get_modified()) + .forEach(item => { + this.queryFileExists(item) + .then(validFile => { + this.debugLog("Valid file - " + validFile.get_display_name()); + if(!isCanceled) + callback(validFile); + }) + .catch(err =>{ + this.debugLog(err); + }); + }); + } + + queryFileExists(item) { + return new Promise((resolve, reject) => { + let file = Gio.File.new_for_uri(item.get_uri()); + let cancellable = new Gio.Cancellable(); + + if(file === null) + reject("Recent file is null. Rejected."); + + //Create and store queryInfo to cancel any active queries when needed + let queryInfo = { + timeOutID: null, + cancellable, + reject, + item + }; + + currentQueries.push(queryInfo); + + file.query_info_async('standard::type,standard::is-hidden', 0, 0, cancellable, (source, res) => { + try { + let fileInfo = source.query_info_finish(res); + this.removeQueryInfoFromList(queryInfo); + if (fileInfo) { + let isHidden = fileInfo.get_attribute_boolean("standard::is-hidden"); + let showHidden = this._settings.get_boolean('show-hidden-recent-files'); + if(isHidden && !showHidden) + reject(item.get_display_name() + " is hidden. Rejected.") + resolve(item); + } + } + catch (err) { + if (err.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + this.debugLog("Cancel Called: " + item.get_display_name()); + + this.removeQueryInfoFromList(queryInfo); + reject(err); + } + }); + }); + } + + removeQueryInfoFromList(queryInfo){ + let queryIndex = currentQueries.indexOf(queryInfo); + if(queryIndex !== -1) + currentQueries.splice(queryIndex, 1); + } + + cancelCurrentQueries(){ + if(currentQueries.length === 0) + return; + isCanceled = true; + this.debugLog("Canceling " + currentQueries.length + " queries...") + for(let queryInfo of currentQueries){ + this.debugLog("Cancel query - " + queryInfo.item.get_display_name()); + queryInfo.cancellable.cancel(); + queryInfo.cancellable = null; + queryInfo.reject("Query Canceled"); + } + currentQueries = null; + currentQueries = []; + this.debugLog("Cancel Finished"); + } + + debugLog(message){ + if (!LogEnabled) + return; + else log(message); + } + + getRecentManager(){ + return this._recentManager; + } + + destroy(){ + this.cancelCurrentQueries(); + this._settings = null; + this._recentManager = null; + } +} + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..473fe73f32ad30f7f813acd364e7108a048a2530 GIT binary patch literal 12620 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 KhO#K9?)X3aDRLwL literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml new file mode 100644 index 0000000..9638cb6 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/schemas/org.gnome.shell.extensions.arcmenu.gschema.xml @@ -0,0 +1,799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 +

      Menu position alignment + Menu position alignment 0 = Left, 50 = Center, 100 = Right + + + 'Default' + menu layout + Menu Layout + + + 'Off' + Force the menu to a specific location + Force the menu to a specific location + + + false + disable hotkey on key release + disable hotkey on key release. + + + false + show ArcMenu on primary monitor when using hotkey + show ArcMenu on primary monitor when using hotkey. + + + false + show standalone Runner menu on primary monitor when using hotkey + show standalone Runner menu monitor when using hotkey. + + + 875 + ArcMenu Settings Width + ArcMenu Settings Width. + + + 725 + ArcMenu Settings Height + ArcMenu Settings Height. + + + [true, false, false] + Keeps track of available placement for ArcMenu. [Main Panel, Dash to Panel, Dash to Dock] + false = not avaliable, true = avaliable + + + "Panel" + Embed ArcMenu button into Dash instead of panel + Embed ArcMenu button into Dash instead of panel + + + 'Left' + Raven layout position. 'Left' or 'Right' side of screen + Raven layout position. 'Left' or 'Right' side of screen. + + + true + Enable Weather Widget raven layout + Enable Weather Widget raven layout. + + + true + Enable Clocks Widget raven layout + Enable Clocks Widget raven layout. + + + false + Enable Weather Widget Unity layout + Enable Weather Widget Unity layout. + + + false + Enable Clocks Widget Unity layout + Enable Clocks Widget Unity layout. + + + false + Enable Category Sub Menus + Enable Category Sub Menus. + + + 'Full_Color' + Category icon type. Full_Color or Symbolic + Category icon type. Full_Color or Symbolic + + + 'Symbolic' + Shortcut icon type. Full_Color or Symbolic + Shortcut icon type. Full_Color or Symbolic + + + false + disable the fade effect on scrollviews + ddisable the fade effect on scrollviews (may help improve performace) + + + false + Show a larger icon and extra app details + Show a larger icon and extra app details. + + + 5 + The amount of search results to display. + The amount of search results to display. + + + false + Highlight search results terms + Highlight search results terms. + + + false + Show search result description label + Show search result description label. + + + false + Show custom search provider - open windows + Show custom search provider - open windows. + + + false + Show custom search provider - recent files + Show custom search provider - recent files. + + + false + Show hidden recent files + Show hidden recent files. + + + false + Activate Categories on Hover + Activate Categories on Hover. + + + false + disable recently installed apps + disable recently installed apps. + + + false + disable tooltips + disable tooltips. + + + true + Separate All Programs by a Character Listing + Separate All Programs by a Character Listing. + + + true + Multi-lined labels for large icon application grid layouts + Multi-lined labels for large icon application grid layouts. + + + 'Pinned_Apps' + Set ArcMenu Layout Default View + Set ArcMenu Layout Default View. + + + 'Categories_List' + Set Tognee Layout Default View + Set Tognee Layout Default View. + + + true + Set Unity layout to display "Home Screen" as default + Set Unity layout to display "Home Screen" as default. False = Show all Apps + + + false + Remove the themes menu arrow and displacement + Remove the themes menu arrow and displacement + + + false + Remove border around the searchbox + Remove border around the searchbox + + + false + Disable the user avatar icon from the menu + Disable the user avatar icon from the menu + + + false + Enable an Activitities Overview Shortcut + Enable an Activitities Overview Shortcut + + + 'Bottom' + Searchbar location for layouts with default searchbar on bottom + Searchbar location for layouts with default searchbar on bottom + + + 'Top' + Searchbar location for layouts with default searchbar on top + Searchbar location for layouts with default searchbar on top + + + false + Flip menu horizontally + Flip menu horizontally + + + false + Windows layout - disable frequent apps + Windows layout - disable frequent apps + + + false + Windows layout - disable pinned apps + Windows layout - disable pinned apps + + + false + GNOME Dash Layout - Show Applications + GNOME Dash Layout - Show Applications + + + "rgb(61, 174, 235)" + Plasma Selected Item Color + Plasma Selected Item Color. + + + "rgba(245, 245, 245, .05)" + Plasma Selected Item Background Color + Plasma Selected Item Background Color. + + + true + Plasma Menu Hover to activate item + Plasma Menu Hover to activate item. + + + false + Runner layout - show frequent apps + Runner layout - show frequent apps + + + false + Runner layout - use current shell theme gap + Runner layout - use current shell theme gap + + + 400 + Runner layout - menu height + Runner layout - menu height + + + 500 + Runner layout - menu width + Runner layout - menu width + + + 0 + Runner layout - font size + Runner layout - font size + + + false + Eleven Layout - disable frequent apps + Eleven Layout - disable frequent apps + + + false + Used to reload theme + Used to reload theme. + + + false + Enable a vertical separator + Enable a vertical separator. + + + "rgb(32,32,32)" + Separator Color + Separator Color. + + + "rgba(53,53,53,0.987)" + Menu Background Color + Menu Background Color. + + + "rgb(223,223,223)" + Menu Foreground Color + Menu Foreground Color. + + + "rgb(32,32,32)" + Border Color + Border Color. + + + "rgb(21,83,158)" + Highlight/Active Menu Item Background Color + Highlight/Active Menu Item Background Color. + + + "rgba(255,255,255,1)" + Highlight/Active Menu Item Foreground Color + Highlight/Active Menu Item Foreground Color. + + + 9 + Menu font size + Menu font size. + + + 1 + Menu border size + Menu border size. + + + 5 + Menu corner radius + Menu corner radius. + + + 24 + Menu margin + Menu margin. + + + 12 + Menu arrow size + Menu arrow size. + + + 550 + Menu Height + Menu Height. + + + 290 + Menu width + Menu width. + + + 0 + Menu Width Adjustement. + Menu Width Adjustement. 0 Default. A negative value decreses the default width, positive increases width. + + + 205 + Right Panel width + Right Panel width. + + + 0 + Gap Adjustment + Gap Adjustment + + + "rgb(41, 165, 249)" + Recently Installed Application Inidcator Color + Recently Installed Application Inidcator Color.. + + + "rgba(196, 196, 196, 0.3)" + Recently Installed Application Inidcator Text Background Color + Recently Installed Application Inidcator Text Background Color.. + + + false + Enable Custom ArcMenu Theme + Enable Custom ArcMenu Theme. + + + false + Enable Custom ArcMenu Layout + Enable Custom ArcMenu Layout. + + + false + Show External Devices + Show External Devices. + + + false + Show Bookmarks + Show Bookmarks. + + + [(0, true), (1, true), (2, true), (3, true), (4, false), (5, false), (6, false)] + Power Options + See Constants.js PowerOptions + + + false + Display on all monitors + Display the menu on all monitors when using Dash to Panel. + + + 'Default' + Activities hotcorner action + Activities hotcorner action. + + + false + Override action of activities hot corner + Override action of activities hot corner. + + + false + Show/Hide Activities Button in panel + Show/Hide Activities Button in panel. + + + "sh -c 'notify-send \"$(date)\"'" + Custom hot corner terminal command + Custom hot corner terminal command. + + + 'Undefined' + Set a hotkey to open ArcMenu + Set a hotkey to open ArcMenu. + + + ["<Super>x"] + Custom keybind to open ArcMenu + Custom keybind to open ArcMenu. + + + false + Enable a standalone Runner menu. + Enable a standalone Runner menu. + + + 'Custom' + Set a hotkey to open the standalone Runner menu. + Set a hotkey to open the standalone Runner menu. + + + ["<Alt>1"] + Keybinding to open the standalone runner menu + Keybinding to open the standalone runner menu. + + + 'Left' + The menu position in the panel + The menu position in the panel. + + + 'Top' + Runner Menu Position + Runner Menu Position. + + + 'Icon' + Appearance of the menu button. + Appearance of the menu button. + + + 'Circular' + Appearance of the avatar icon. + Appearance of the avatar icon. + + + false + Enables the default menu button arrow. + Enables the default menu button arrow. + + + 'Default' + Size of the menu items icon. + Size of the menu items icon. Includes all application items, category items, search results. + + + 'Default' + Size of the menu grid icons. + Size of the menu grid icon. + + + 'Default' + Size of the button items in ArcMenu. + Size of the button items in ArcMenu. Includes all buttons inside the menu + + + 'Default' + Size of misc items in ArcMenu. + Size of misc items in ArcMenu. Includes searchbox icons, back menu item, all applications menu item, usermenu item. + + + 'Default' + Size of quicklink items in ArcMenu. + Size of quicklink items in ArcMenu. Includes places, shortcuts, external devices, bookmarks. + + + 'Applications' + Text of the menu button. + Text of the menu button. + + + 'Arc_Menu_Icon' + Icon of the menu button. + Icon of the menu button. + + + 0 + Icon of the menu button. + Icon of the menu button. + + + 0 + Icon of the menu button. + Icon of the menu button. + + + '' + File path of the custom icon for the menu button. + File path of the custom icon for the menu button. + + + 20 + Size of the icon in percentage. + Size of the icon in percentage. + + + -1 + Menu Button Padding. + Menu Button Padding. + + + 0 + Menu button position offset for main panel + Menu button position offset for main panel + + + false + Override border radius styling of the menu button + Override border radius of the menu button. + + + 0 + The border radius size of the menu button + The border radius size of the menu button. + + + 'rgb(240,240,240)' + Color for the menu button icon + Color for the menu button icon. + + + false + Allows changing the menu button icon color + Allows changing the menu button icon color. + + + 'rgb(240,240,240)' + Active color for the menu button icon + Active color for the menu button icon. + + + false + Allows changing the menu button icon active color + Allows changing the menu button icon active color. + + + 'rgb(214,214,214)' + Hover color for the menu button icon + Hover color for the menu button icon. + + + false + Allows changing the menu button icon hover color + Allows changing the menu button icon hover color. + + + 'rgba(238,238,236,0.1)' + Hover background color for the menu button icon + Hover background color for the menu button icon. + + + false + Allows changing the menu button hover background color + Allows changing the menu button hover background color. + + + 'rgba(238,238,236,0.18)' + Active background color for the menu button icon + Active background color for the menu button icon. + + + false + Allows changing the menu button active background color + Allows changing the menu button active background color. + + + [(0, true), (1, true), (2, false), (3, false), (4, false)] + Array of extra categories. See Constants.js - Categories + Array of extra categories. See Constants.js - Categories + + + [(0, false), (1, false), (2, false), (3, false), (4, false)] + Array of extra categories links for ArcMenu layout. See Constants.js - Categories + Array of extra categories for ArcMenu layout. See Constants.js - Categories + + + 'Bottom' + Display extra categories quick links on ArcMenu Layout home page + Display extra categories quick links on ArcMenu Layout home page + + + [] + List of recently installed apps + List of recently installed apps + + + [ "ArcMenu_WebBrowser","WebBrowser", "WebBrowser", + "Files", "", "org.gnome.Nautilus.desktop", + "Terminal", "", "org.gnome.Terminal.desktop", + "ArcMenu Settings", "ArcMenu_ArcMenuIcon", "gnome-extensions prefs arcmenu@arcmenu.com" + ] + + List of Apps Pinned to Menu + List of Apps Pinned to Menu + + + false + Toggle for enabling custom shortcuts. + Toggle for enabling custom shortcuts. + + + [["Home","ArcMenu_Home", "ArcMenu_Home"], ["Documents","ArcMenu_Documents", "ArcMenu_Documents"],["Downloads","ArcMenu_Downloads", "ArcMenu_Downloads"], + ["Music","ArcMenu_Music", "ArcMenu_Music"],["Pictures","ArcMenu_Pictures", "ArcMenu_Pictures"],["Videos","ArcMenu_Videos", "ArcMenu_Videos"]] + List of default directory paths used for links on the right side of ArcMenu + List of default directory paths used for links on the right side of ArcMenu. + + + [["Software","system-software-install-symbolic", "ArcMenu_Software"], ["Settings","preferences-system-symbolic", "gnome-control-center.desktop"], + ["Tweaks","org.gnome.tweaks-symbolic", "org.gnome.tweaks.desktop"],["Terminal","utilities-terminal-symbolic", "org.gnome.Terminal.desktop"], + ["Activities Overview", "view-fullscreen-symbolic", "ArcMenu_ActivitiesOverview"]] + List of default directory paths used for links on the right side of ArcMenu + List of default directory paths used for links on the right side of ArcMenu. + + + [] + List of Unity Layout Pinned Apps + List of Uniity Layout Pinned Apps + + + 5 + Index of Unity Layout Pinned App Separator + Index of Unity Layout Pinned App Separator, 0 = none + + + ["Software","system-software-install-symbolic", "ArcMenu_Software", "Settings","preferences-system-symbolic", "gnome-control-center.desktop"] + List of Brisk Layout Shortcuts + List of Brisk Layout Shortcuts + + + [] + List of Mint Layout Pinned Apps + List of Mint Layout Pinned Apps + + + 5 + Index of Mint Layout Pinned App Separator + Index of Mint Layout Pinned App Separator, 0 = none + + + [['ArcMenu Style', 'rgba(53,53,53,0.987)', 'rgb(223,223,223)', 'rgb(32,32,32)', 'rgb(21,83,158)', 'rgba(255,255,255,1)', 'rgb(32,32,32)', '9', '1', '5', '12', '24', 'false'], + ['Simply Dark', 'rgba(28, 28, 28, 0.98)', 'rgba(211, 218, 227, 1)', 'rgb(63,62,64)', 'rgba(238, 238, 236, 0.1)', 'rgba(255,255,255,1)', 'rgb(63,62,64)', '9', '0', '0', '0', '0', 'false'], + ['Dark Blue Theme', 'rgb(25,31,34)', 'rgb(189,230,251)', 'rgb(41,50,55)', 'rgb(41,50,55)', 'rgba(255,255,255,1)', 'rgb(41,50,55)', '9', '1', '5', '12', '24', 'true'], + ['Light Blue Theme', 'rgb(255,255,255)', 'rgb(51,51,51)', 'rgb(235,235,235)', 'rgba(189,230,251,0.9)', 'rgba(89,89,89,1)', 'rgba(189,230,251,0.9)', '9', '1', '5', '12', '24', 'true']] + List of color-themes + List of color themes. + + + + 0 + Handles which page to open in ArcMenu Settings + See Constants.js PrefsVisiblePage + + + diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/search.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/search.js new file mode 100644 index 0000000..9085c77 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/search.js @@ -0,0 +1,872 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: This file leverages the work from GNOME Shell search.js file + * (https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/master/js/ui/search.js) + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const {Clutter, Gio, GLib, GObject, Shell, St } = imports.gi; +const AppDisplay = imports.ui.appDisplay; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const MW = Me.imports.menuWidgets; +const PopupMenu = imports.ui.popupMenu; +const { RecentFilesManager } = Me.imports.recentFilesManager; +const RemoteSearch = imports.ui.remoteSearch; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +const { OpenWindowSearchProvider } = Me.imports.searchProviders.openWindows; +const { RecentFilesSearchProvider } = Me.imports.searchProviders.recentFiles; + +const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; + +var ListSearchResult = GObject.registerClass(class Arc_Menu_ListSearchResult extends MW.ApplicationMenuItem{ + _init(provider, metaInfo, resultsView) { + let menulayout = resultsView._menuLayout; + let app = appSys.lookup_app(metaInfo['id']); + + super._init(menulayout, app, Constants.DisplayType.LIST, metaInfo) + + this.app = app; + let layoutProperties = this._menuLayout.layoutProperties; + this.searchType = layoutProperties.SearchDisplayType; + this.metaInfo = metaInfo; + this.provider = provider; + this._settings = this._menuLayout._settings; + this.resultsView = resultsView; + this.layout = this._settings.get_enum('menu-layout'); + + if(this.provider.id === 'org.gnome.Nautilus.desktop' || this.provider.id === 'arcmenu.recent-files') + this._path = this.metaInfo['description']; + + let highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + if(highlightSearchResultTerms){ + this._termsChangedId = this.resultsView.connect('terms-changed', this._highlightTerms.bind(this)); + this._highlightTerms(); + } + + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.metaInfo['description'] && this.provider.appInfo.get_id() === 'org.gnome.Calculator.desktop' && !showSearchResultDescriptions) + this.label.text = this.metaInfo['name'] + " " + this.metaInfo['description']; + + if(!this.app && this.metaInfo['description']) + this.description = this.metaInfo['description'].split('\n')[0]; + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._termsChangedId) { + this.resultsView.disconnect(this._termsChangedId); + this._termsChangedId = null; + } + } + + _highlightTerms() { + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.descriptionLabel && showSearchResultDescriptions){ + let descriptionMarkup = this.resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]); + this.descriptionLabel.clutter_text.set_markup(descriptionMarkup); + } + let labelMarkup = this.resultsView.highlightTerms(this.label.text.split('\n')[0]); + this.label.clutter_text.set_markup(labelMarkup); + } +}); + +var AppSearchResult = GObject.registerClass(class Arc_Menu_AppSearchResult extends MW.ApplicationMenuItem{ + _init(provider, metaInfo, resultsView) { + let menulayout = resultsView._menuLayout; + let app = appSys.lookup_app(metaInfo['id']) || appSys.lookup_app(provider.id); + let displayType = menulayout.layoutProperties.SearchDisplayType; + super._init(menulayout, app, displayType, metaInfo); + this.app = app; + this.provider = provider; + this.metaInfo = metaInfo; + this.resultsView = resultsView; + + if(!this.app && this.metaInfo['description']) + this.description = this.metaInfo['description'].split('\n')[0]; + + let highlightSearchResultTerms = this._settings.get_boolean('highlight-search-result-terms'); + if(highlightSearchResultTerms){ + this._termsChangedId = this.resultsView.connect('terms-changed', this._highlightTerms.bind(this)); + this._highlightTerms(); + } + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._termsChangedId) { + this.resultsView.disconnect(this._termsChangedId); + this._termsChangedId = null; + } + } + + _highlightTerms() { + let showSearchResultDescriptions = this._settings.get_boolean("show-search-result-details"); + if(this.descriptionLabel && showSearchResultDescriptions){ + let descriptionMarkup = this.resultsView.highlightTerms(this.descriptionLabel.text.split('\n')[0]); + this.descriptionLabel.clutter_text.set_markup(descriptionMarkup); + } + + let labelMarkup = this.resultsView.highlightTerms(this.label.text.split('\n')[0]); + this.label.clutter_text.set_markup(labelMarkup); + } +}); + +var SearchResultsBase = GObject.registerClass({ + Signals: { 'terms-changed': {}, + 'no-results': {} }, +}, class ArcMenu_SearchResultsBase extends St.BoxLayout { + _init(provider, resultsView) { + super._init({ vertical: true }); + this.provider = provider; + this.resultsView = resultsView; + this._menuLayout = resultsView._menuLayout; + this._terms = []; + + this._resultDisplayBin = new St.Bin({ + x_expand: true, + y_expand: true + }); + + this.add_child(this._resultDisplayBin); + + this._resultDisplays = {}; + this._clipboard = St.Clipboard.get_default(); + + this._cancellable = new Gio.Cancellable(); + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + this._terms = []; + } + + _createResultDisplay(meta) { + if (this.provider.createResultObject) + return this.provider.createResultObject(meta, this.resultsView); + + return null; + } + + clear() { + this._cancellable.cancel(); + for (let resultId in this._resultDisplays) + this._resultDisplays[resultId].destroy(); + this._resultDisplays = {}; + this._clearResultDisplay(); + this.hide(); + } + + _setMoreCount(count) { + } + + _ensureResultActors(results, callback) { + let metasNeeded = results.filter( + resultId => this._resultDisplays[resultId] === undefined + ); + + if (metasNeeded.length === 0) { + callback(true); + } else { + this._cancellable.cancel(); + this._cancellable.reset(); + + this.provider.getResultMetas(metasNeeded, metas => { + if (this._cancellable.is_cancelled()) { + if (metas.length > 0) + log(`Search provider ${this.provider.id} returned results after the request was canceled`); + callback(false); + return; + } + if (metas.length != metasNeeded.length) { + log('Wrong number of result metas returned by search provider ' + this.provider.id + + ': expected ' + metasNeeded.length + ' but got ' + metas.length); + callback(false); + return; + } + if (metas.some(meta => !meta.name || !meta.id)) { + log('Invalid result meta returned from search provider ' + this.provider.id); + callback(false); + return; + } + + metasNeeded.forEach((resultId, i) => { + let meta = metas[i]; + let display = this._createResultDisplay(meta); + this._resultDisplays[resultId] = display; + }); + callback(true); + }, this._cancellable); + } + } + + updateSearch(providerResults, terms, callback) { + this._terms = terms; + if (providerResults.length == 0) { + this._clearResultDisplay(); + this.hide(); + callback(); + } else { + let maxResults = this._getMaxDisplayedResults(); + let results = this.provider.filterResults(providerResults, maxResults); + let moreCount = Math.max(providerResults.length - results.length, 0); + + this._ensureResultActors(results, successful => { + if (!successful) { + this._clearResultDisplay(); + callback(); + return; + } + + // To avoid CSS transitions causing flickering when + // the first search result stays the same, we hide the + // content while filling in the results. + this.hide(); + this._clearResultDisplay(); + results.forEach(resultId => { + this._addItem(this._resultDisplays[resultId]); + }); + + this._setMoreCount(this.provider.canLaunchSearch ? moreCount : 0); + this.show(); + callback(); + }); + } + } +}); + +var ListSearchResults = GObject.registerClass( +class ArcMenu_ListSearchResults extends SearchResultsBase { + _init(provider, resultsView) { + super._init(provider, resultsView); + this._menuLayout = resultsView._menuLayout; + this.searchType = this._menuLayout.layoutProperties.SearchDisplayType; + this._settings = this._menuLayout._settings; + this.layout = this._settings.get_enum('menu-layout'); + + this._container = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL, + x_expand: true, + y_expand: true, + }); + + if(this.searchType === Constants.DisplayType.GRID){ + this.add_style_class_name('margin-box'); + } + + this.providerInfo = new ArcSearchProviderInfo(provider, this._menuLayout); + this.providerInfo.connect('activate', () => { + if (provider.canLaunchSearch) { + provider.launchSearch(this._terms); + this._menuLayout.arcMenu.toggle(); + } + }); + + this._container.add_child(this.providerInfo); + + this._content = new St.BoxLayout({ + vertical: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL + }); + + this._container.add_child(this._content); + this._resultDisplayBin.set_child(this._container); + } + + _setMoreCount(count) { + this.providerInfo.setMoreCount(count); + } + + _getMaxDisplayedResults() { + return this._settings.get_int('max-search-results'); + } + + _clearResultDisplay() { + this._content.remove_all_children(); + } + + _createResultDisplay(meta) { + return super._createResultDisplay(meta, this.resultsView) || + new ListSearchResult(this.provider, meta, this.resultsView); + } + + _addItem(display) { + if(display.get_parent()) + display.get_parent().remove_child(display); + this._content.add_child(display); + } + + getFirstResult() { + if (this._content.get_n_children() > 0) + return this._content.get_child_at_index(0)._delegate; + else + return null; + } +}); + +var AppSearchResults = GObject.registerClass( +class ArcMenu_AppSearchResults extends SearchResultsBase { + _init(provider, resultsView) { + super._init(provider, resultsView); + this._parentContainer = resultsView; + this._menuLayout = resultsView._menuLayout; + this._settings = this._menuLayout._settings; + this.layoutProperties = this._menuLayout.layoutProperties; + this.searchType = this.layoutProperties.SearchDisplayType; + this.layout = this._menuLayout._settings.get_enum('menu-layout'); + + this.itemCount = 0; + this.gridTop = -1; + this.gridLeft = 0; + + this.rtl = this._menuLayout.mainBox.get_text_direction() == Clutter.TextDirection.RTL; + + let layout = new Clutter.GridLayout({ + orientation: Clutter.Orientation.VERTICAL, + column_spacing: this.searchType === Constants.DisplayType.GRID ? this.layoutProperties.ColumnSpacing : 0, + row_spacing: this.searchType === Constants.DisplayType.GRID ? this.layoutProperties.RowSpacing : 0, + }); + this._grid = new St.Widget({ + x_expand: true, + x_align: this.searchType === Constants.DisplayType.LIST ? Clutter.ActorAlign.FILL : Clutter.ActorAlign.CENTER, + layout_manager: layout + }); + layout.hookup_style(this._grid); + + if(this.searchType === Constants.DisplayType.GRID){ + let spacing = this.layoutProperties.ColumnSpacing; + + this._grid.style = "padding: 0px 0px 10px 0px; spacing: " + spacing + "px;"; + this._resultDisplayBin.x_align = Clutter.ActorAlign.CENTER; + } + + this._resultDisplayBin.set_child(this._grid); + } + + _getMaxDisplayedResults() { + let maxDisplayedResults; + if(this.searchType === Constants.DisplayType.GRID) + maxDisplayedResults = this._menuLayout.getColumnsFromGridIconSizeSetting(); + else + maxDisplayedResults = this._settings.get_int('max-search-results'); + return maxDisplayedResults; + } + + _clearResultDisplay() { + this.itemCount = 0; + this.gridTop = -1; + this.gridLeft = 0; + this._grid.remove_all_children(); + } + + _createResultDisplay(meta) { + return new AppSearchResult(this.provider, meta, this.resultsView); + } + + _addItem(display) { + const GridColumns = this.searchType === Constants.DisplayType.LIST ? 1 : this._menuLayout.getColumnsFromGridIconSizeSetting(); + if(!this.rtl && (this.itemCount % GridColumns === 0)){ + this.gridTop++; + this.gridLeft = 0; + } + else if(this.rtl && (this.gridLeft === 0)){ + this.gridTop++; + this.gridLeft = GridColumns; + } + this._grid.layout_manager.attach(display, this.gridLeft, this.gridTop, 1, 1); + display.gridLocation = [this.gridLeft, this.gridTop]; + + if(!this.rtl) + this.gridLeft++; + else if(this.rtl) + this.gridLeft--; + this.itemCount++; + } + + getFirstResult() { + if (this._grid.get_n_children() > 0) + return this._grid.get_child_at_index(0)._delegate; + else + return null; + } +}); + +var SearchResults = GObject.registerClass({ + Signals: { 'terms-changed': {}, + 'have-results': {}, + 'no-results': {} }, +}, class ArcMenu_SearchResults extends St.BoxLayout { + _init(menuLayout) { + super._init({ + vertical: true, + y_expand: true, + x_expand: true, + x_align: Clutter.ActorAlign.FILL + }); + this._menuLayout = menuLayout; + this.layoutProperties = this._menuLayout.layoutProperties; + this.searchType = this.layoutProperties.SearchDisplayType; + this._settings = this._menuLayout._settings; + this.layout = this._settings.get_enum('menu-layout'); + + this._content = new St.BoxLayout({ + vertical: true, + x_align: Clutter.ActorAlign.FILL + }); + + this.add_child(this._content); + + this._statusText = new St.Label(); + this._statusBin = new St.Bin({ + x_align: Clutter.ActorAlign.CENTER, + y_align: Clutter.ActorAlign.CENTER, + x_expand: true, + y_expand: true + }); + + if(menuLayout._settings.get_boolean('enable-custom-arc-menu')) + this._statusText.style_class = 'arc-menu-status-text'; + else + this._statusText.style_class = ''; + + this.add_child(this._statusBin); + this._statusBin.set_child(this._statusText); + + this._highlightDefault = true; + this._defaultResult = null; + this._startingSearch = false; + + this._terms = []; + this._results = {}; + + this._providers = []; + + this._highlightRegex = null; + + this.recentFilesManager = new RecentFilesManager(); + + this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA }); + this.disabledID = this._searchSettings.connect('changed::disabled', this._reloadRemoteProviders.bind(this)); + this.enabledID = this._searchSettings.connect('changed::enabled', this._reloadRemoteProviders.bind(this)); + this.disablExternalID = this._searchSettings.connect('changed::disable-external', this._reloadRemoteProviders.bind(this)); + this.sortOrderID = this._searchSettings.connect('changed::sort-order', this._reloadRemoteProviders.bind(this)); + + this._searchTimeoutId = null; + this._cancellable = new Gio.Cancellable(); + + this._registerProvider(new AppDisplay.AppSearchProvider()); + + this.installChangedID = appSys.connect('installed-changed', this._reloadRemoteProviders.bind(this)); + + this._reloadRemoteProviders(); + + this.connect('destroy', this._onDestroy.bind(this)); + } + + get terms() { + return this._terms; + } + + setStyle(style){ + if(this._statusText){ + this._statusText.style_class = style; + } + } + + _onDestroy(){ + this._terms = []; + this._results = {}; + this._clearDisplay(); + this._clearSearchTimeout(); + this._defaultResult = null; + this._startingSearch = false; + if(this.disabledID){ + this._searchSettings.disconnect(this.disabledID); + this.disabledID = null; + } + if(this.enabledID){ + this._searchSettings.disconnect(this.enabledID); + this.enabledID = null; + } + if(this.disablExternalID){ + this._searchSettings.disconnect(this.disablExternalID); + this.disablExternalID = null; + } + if(this.sortOrderID){ + this._searchSettings.disconnect(this.sortOrderID); + this.sortOrderID = null; + } + if(this.installChangedID){ + appSys.disconnect(this.installChangedID); + this.installChangedID = null; + } + let remoteProviders = this._providers.filter(p => p.isRemoteProvider); + remoteProviders.forEach(provider => { + this._unregisterProvider(provider); + }); + + this.recentFilesManager.destroy(); + this.recentFilesManager = null; + + this._content.destroy_all_children(); + } + + _reloadRemoteProviders() { + let currentTerms = this._terms; + //cancel any active search + if (this._terms.length !== 0) + this._reset(); + + this._oldProviders = null; + let remoteProviders = this._providers.filter(p => p.isRemoteProvider); + + remoteProviders.forEach(provider => { + this._unregisterProvider(provider); + }); + + if(this._settings.get_boolean('search-provider-open-windows')) + this._registerProvider(new OpenWindowSearchProvider()); + if(this._settings.get_boolean('search-provider-recent-files')) + this._registerProvider(new RecentFilesSearchProvider(this.recentFilesManager)); + + RemoteSearch.loadRemoteSearchProviders(this._searchSettings, providers => { + providers.forEach(this._registerProvider.bind(this)); + }); + + //restart any active search + if(currentTerms.length > 0) + this.setTerms(currentTerms); + } + + _registerProvider(provider) { + provider.searchInProgress = false; + this._providers.push(provider); + this._ensureProviderDisplay(provider); + } + + _unregisterProvider(provider) { + let index = this._providers.indexOf(provider); + this._providers.splice(index, 1); + + if (provider.display){ + provider.display.destroy(); + } + } + + _gotResults(results, provider) { + this._results[provider.id] = results; + this._updateResults(provider, results); + } + + _clearSearchTimeout() { + if (this._searchTimeoutId) { + GLib.source_remove(this._searchTimeoutId); + this._searchTimeoutId = null; + } + } + + _reset() { + this._terms = []; + this._results = {}; + this._clearDisplay(); + this._clearSearchTimeout(); + this._defaultResult = null; + this._startingSearch = false; + + this._updateSearchProgress(); + } + + _doSearch() { + this._startingSearch = false; + + let previousResults = this._results; + this._results = {}; + + this._providers.forEach(provider => { + provider.searchInProgress = true; + + let previousProviderResults = previousResults[provider.id]; + if (this._isSubSearch && previousProviderResults) + provider.getSubsearchResultSet(previousProviderResults, + this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + else + provider.getInitialResultSet(this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + }); + + this._updateSearchProgress(); + + this._clearSearchTimeout(); + } + + _onSearchTimeout() { + this._searchTimeoutId = null; + this._doSearch(); + return GLib.SOURCE_REMOVE; + } + + setTerms(terms) { + // Check for the case of making a duplicate previous search before + // setting state of the current search or cancelling the search. + // This will prevent incorrect state being as a result of a duplicate + // search while the previous search is still active. + let searchString = terms.join(' '); + let previousSearchString = this._terms.join(' '); + if (searchString == previousSearchString) + return; + + this._startingSearch = true; + + this.recentFilesManager.cancelCurrentQueries(); + + this._cancellable.cancel(); + this._cancellable.reset(); + + if (terms.length == 0) { + this._reset(); + return; + } + + let isSubSearch = false; + if (this._terms.length > 0) + isSubSearch = searchString.indexOf(previousSearchString) == 0; + + this._terms = terms; + this._isSubSearch = isSubSearch; + this._updateSearchProgress(); + + if (this._searchTimeoutId === null) + this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, this._onSearchTimeout.bind(this)); + + + + const escapedTerms = terms + .map(term => Shell.util_regex_escape(term)) + .filter(term => term.length > 0); + + if (escapedTerms.length === 0) + return; + + this._highlightRegex = new RegExp('(%s)'.format( + escapedTerms.join('|')), 'gi'); + + this.emit('terms-changed'); + } + + _ensureProviderDisplay(provider) { + if (provider.display) + return; + + let providerDisplay; + if (provider.appInfo) + providerDisplay = new ListSearchResults(provider, this); + else + providerDisplay = new AppSearchResults(provider, this); + providerDisplay.hide(); + this._content.add_child(providerDisplay); + provider.display = providerDisplay; + } + + _clearDisplay() { + this._providers.forEach(provider => { + provider.display.clear(); + }); + } + + _maybeSetInitialSelection() { + let newDefaultResult = null; + + let providers = this._providers; + for (let i = 0; i < providers.length; i++) { + let provider = providers[i]; + let display = provider.display; + + if (!display.visible) + continue; + + let firstResult = display.getFirstResult(); + if (firstResult) { + newDefaultResult = firstResult; + break; // select this one! + } + } + + if (newDefaultResult !== this._defaultResult) { + this._setSelected(this._defaultResult, false); + this._setSelected(newDefaultResult, this._highlightDefault); + + this._defaultResult = newDefaultResult; + } + } + + get searchInProgress() { + if (this._startingSearch) + return true; + + return this._providers.some(p => p.searchInProgress); + } + + _updateSearchProgress() { + let haveResults = this._providers.some(provider => { + let display = provider.display; + return (display.getFirstResult() != null); + }); + + this._statusBin.visible = !haveResults; + if (haveResults) + this.emit("have-results") + else if (!haveResults) { + if (this.searchInProgress) + this._statusText.set_text(_("Searching...")); + else + this._statusText.set_text(_("No results.")); + + this.emit("no-results") + } + } + + _updateResults(provider, results) { + let terms = this._terms; + let display = provider.display; + display.updateSearch(results, terms, () => { + provider.searchInProgress = false; + + this._maybeSetInitialSelection(); + this._updateSearchProgress(); + }); + } + + highlightDefault(highlight) { + this._highlightDefault = highlight; + this._setSelected(this._defaultResult, highlight); + } + + getTopResult(){ + return this._defaultResult; + } + + getProviders(){ + return this._providers; + } + + setProvider(providerID){ + if(!this._oldProviders) + this._oldProviders = this._providers; + this._clearDisplay(); + this._providers = this._oldProviders; + if(providerID === Constants.CategoryType.ALL_PROGRAMS){ + this._providers = this._providers.filter(p => (p.appInfo ? false : true)); + } + else if(providerID !== Constants.CategoryType.SEARCH_RESULTS){ + this._providers = this._providers.filter(p => (p.appInfo ? p.appInfo.get_id() : p) === providerID); + } + } + + _setSelected(result, selected) { + if(!result) + return; + + if(selected) + result.add_style_pseudo_class('active'); + else + result.remove_style_pseudo_class('active'); + } + + hasActiveResult(){ + return (this._defaultResult ? true : false) && this._highlightDefault; + } + + highlightTerms(text) { + if (!this._highlightRegex) + return GLib.markup_escape_text(text, -1); + + let escaped = []; + let lastMatchEnd = 0; + let match; + while ((match = this._highlightRegex.exec(text))) { + if (match.index > lastMatchEnd) { + let unmatched = GLib.markup_escape_text( + text.slice(lastMatchEnd, match.index), -1); + escaped.push(unmatched); + } + let matched = GLib.markup_escape_text(match[0], -1); + escaped.push('%s'.format(matched)); + lastMatchEnd = match.index + match[0].length; + } + let unmatched = GLib.markup_escape_text( + text.slice(lastMatchEnd), -1); + escaped.push(unmatched); + + return escaped.join(''); + } +}); + +var ArcSearchProviderInfo = GObject.registerClass(class Arc_Menu_ArcSearchProviderInfo extends MW.ArcMenuPopupBaseMenuItem{ + _init(provider, menuLayout) { + super._init(menuLayout); + this.provider = provider; + this._menuLayout = menuLayout; + this._settings = this._menuLayout._settings; + + this.description = this.provider.appInfo.get_description(); + if(this.description) + this.description = this.description.split('\n')[0]; + + this.label = new St.Label({ + text: provider.appInfo.get_name(), + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.CENTER, + style: 'text-align: left;' + }); + + this.label.style = 'font-weight: bold;'; + this.style = "padding: 10px 0px;"; + this.add_child(this.label); + + this._moreText = ""; + } + + setMoreCount(count) { + this._moreText = ngettext("%d more", "%d more", count).format(count); + + if(count > 0) + this.label.text = this.provider.appInfo.get_name() + " (" + this._moreText + ")"; + else + this.label.text = this.provider.appInfo.get_name(); + } +}); diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js new file mode 100644 index 0000000..933a1e6 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/openWindows.js @@ -0,0 +1,93 @@ +const { Meta, Gio, St, Shell } = imports.gi; + +const Main = imports.ui.main; +const { getWindows } = imports.ui.altTab; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +function createIcon(app, size) { + return app + ? app.create_icon_texture(size) + : new St.Icon({ icon_name: 'icon-missing', icon_size: size }); +} + +var OpenWindowSearchProvider = class { + constructor() { + this.id = 'arcmenu.open-windows'; + this.isRemoteProvider = true; + this.canLaunchSearch = false; + + this._appWindows = []; + this._windowTracker = Shell.WindowTracker.get_default(); + + this.appInfo = { + get_description: () => _('List of open windows across all workspaces'), + get_name: () => _('Open Windows'), + get_id: () => 'arcmenu.open-windows', + get_icon: () => Gio.icon_new_for_string('focus-windows-symbolic'), + } + } + + getResultMetas(winIds, callback) { + const metas = winIds.map(winId => { + const aw = this._getAppWindow(winId); + return aw ? { + id: winId, + name: aw.window.title ?? aw.app.get_name(), + description: aw.window.get_workspace() ? _("'%s' on Workspace %d").format(aw.app.get_name(), aw.window.get_workspace().index() + 1) : aw.app.get_name(), + createIcon: (size) => createIcon(aw.app, size), + } : undefined; + }).filter(m => m?.name !== undefined && m?.name !== null); + + callback(metas); + } + + filterResults(results, maxNumber) { + return results.slice(0, maxNumber); + } + + getInitialResultSet(terms, callback, _cancellable) { + this._appWindows = getWindows(null).map(window => { + return { + window, + app: this._windowTracker.get_window_app(window), + } + }); + + callback(this._getFilteredWindowIds(terms, this._appWindows)); + } + + getSubsearchResultSet(previousResults, terms, callback, _cancellable) { + const appWindows = previousResults.map(winId => this._getAppWindow(winId)).filter(aw => aw !== undefined); + callback(this._getFilteredWindowIds(terms, appWindows)); + } + + activateResult(winId, _terms) { + const window = this._getAppWindow(winId)?.window; + if (window) + Main.activateWindow(window); + } + + launchSearch() { + + } + + _getFilteredWindowIds(terms, appWindows) { + terms = terms.map(term => term.toLowerCase()); + appWindows = appWindows.filter(aw => { + const title = aw.window.title?.toLowerCase(); + const appName = aw.app.get_name()?.toLowerCase(); + const appDescription = aw.app.get_description()?.toLowerCase(); + return terms.some(term => title?.includes(term) || appName?.includes(term) || appDescription?.includes(term)); + }); + + return appWindows.map(aw => aw.window.get_id().toString()); + } + + _getAppWindow(winId) { + winId = typeof winId === "string" ? parseInt(winId) : winId; + return this._appWindows.find(aw => aw.window.get_id() === winId); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js new file mode 100644 index 0000000..fb595e4 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/searchProviders/recentFiles.js @@ -0,0 +1,100 @@ +const { Meta, Gtk, Gio, GLib, St, Shell } = imports.gi; + +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; + +function createIcon(mimeType, size) { + let symbolicIcon = mimeType ? Gio.content_type_get_symbolic_icon(mimeType)?.to_string() : null; + return symbolicIcon + ? new St.Icon({ gicon: Gio.icon_new_for_string(symbolicIcon), icon_size: size }) + : new St.Icon({ icon_name: 'icon-missing', icon_size: size }); +} + +var RecentFilesSearchProvider = class { + constructor(recentFilesManager) { + this.id = 'arcmenu.recent-files'; + this.isRemoteProvider = true; + this.canLaunchSearch = false; + this.recentFilesManager = recentFilesManager; + this._recentFiles = []; + + this.appInfo = { + get_description: () => _('Recent Files'), + get_name: () => _('Recent Files'), + get_id: () => 'arcmenu.recent-files', + get_icon: () => Gio.icon_new_for_string('document-open-recent-symbolic'), + } + } + + getResultMetas(fileUris, callback) { + const metas = fileUris.map(fileUri => { + const rf = this._getRecentFile(fileUri); + const file = Gio.File.new_for_uri(rf.get_uri()); + return rf ? { + id: fileUri, + name: rf.get_display_name(), + description: file.get_parent()?.get_path(), // can be null + createIcon: (size) => createIcon(rf.get_mime_type(), size), + } : undefined; + }).filter(m => m?.name !== undefined && m?.name !== null); + + callback(metas); + } + + filterResults(results, maxNumber) { + return results.slice(0, maxNumber); + } + + getInitialResultSet(terms, callback, _cancellable) { + this.recentFilesManager.cancelCurrentQueries(); + this._recentFiles = []; + this.recentFilesManager.filterRecentFiles(recentFile => { + this._recentFiles.push(recentFile); + callback(this._getFilteredFileUris(terms, this._recentFiles)); + }); + } + + getSubsearchResultSet(previousResults, terms, callback, _cancellable) { + const recentFiles = previousResults.map(fileUri => this._getRecentFile(fileUri)).filter(rf => rf !== undefined); + callback(this._getFilteredFileUris(terms, recentFiles)); + } + + activateResult(fileUri, _terms) { + const recentFile = this._getRecentFile(fileUri); + if (recentFile){ + let context = global.create_app_launch_context(0, -1); + + new Promise((resolve, reject) => { + Gio.AppInfo.launch_default_for_uri_async(recentFile.get_uri(), context, null, (o, res) => { + try { + Gio.AppInfo.launch_default_for_uri_finish(res); + resolve(); + } catch (e) { + Main.notifyError(_('Failed to open “%s”').format(recentFile.get_display_name()), e.message); + reject(e); + } + }); + }); + } + } + + launchSearch() { + } + + _getFilteredFileUris(terms, recentFiles) { + terms = terms.map(term => term.toLowerCase()); + recentFiles = recentFiles.filter(rf => { + const fileName = rf.get_display_name()?.toLowerCase(); + return terms.some(term => fileName?.includes(term)); + }); + + return recentFiles.map(rf => rf.get_uri()); + } + + _getRecentFile(fileUri) { + return this._recentFiles.find(rf => rf.get_uri() === fileUri); + } +} diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js new file mode 100644 index 0000000..6c0613d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/standaloneRunner.js @@ -0,0 +1,376 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const {Clutter, GLib, Shell, St} = imports.gi; +const appSys = Shell.AppSystem.get_default(); +const Constants = Me.imports.constants; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Utils = Me.imports.utils; +const _ = Gettext.gettext; + +var StandaloneRunner = class Arc_Menu_StandaloneRunner{ + constructor(settings) { + this._settings = settings; + + this.tooltipShowing = false; + this.tooltipHidingID = null; + this.tooltipShowingID = null; + this.dtpNeedsRelease = false; + + this.dummyWidget = new St.Widget({ width: 0, height: 0, opacity: 0 }); + Main.uiGroup.add_child(this.dummyWidget); + + //Create Main Menus - ArcMenu and arcMenu's context menu + this.arcMenu = new ArcMenu(this.dummyWidget, 0.5, St.Side.TOP, this); + this.arcMenu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); + + this.menuManager = new PopupMenu.PopupMenuManager(Main.panel); + this.menuManager._changeMenu = (menu) => {}; + this.menuManager.addMenu(this.arcMenu); + + if(!this.rise){ + let themeNode = this.arcMenu.actor.get_theme_node(); + this.rise = themeNode.get_length('-arrow-rise'); + } + + let rect = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryMonitor.index); + + //Position the runner menu in the center of the current monitor, at top of screen. + let positionX = Math.round(rect.x + (rect.width / 2)); + let positionY = rect.y + this.rise; + this.dummyWidget.set_position(positionX, positionY); + + //Context Menus for applications and other menu items + this.contextMenuManager = new PopupMenu.PopupMenuManager(this.dummyWidget); + this.contextMenuManager._changeMenu = (menu) => {}; + this.contextMenuManager._onMenuSourceEnter = (menu) =>{ + if (this.contextMenuManager.activeMenu && this.contextMenuManager.activeMenu != menu) + return Clutter.EVENT_STOP; + + return Clutter.EVENT_PROPAGATE; + } + + //Sub Menu Manager - Control all other popup menus + this.subMenuManager = new PopupMenu.PopupMenuManager(this.dummyWidget); + this.subMenuManager._changeMenu = (menu) => {}; + } + + initiate(){ + this.initiateRecentlyInstalledApps(); + + //Create Basic Layout + this.createLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.createLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + initiateRecentlyInstalledApps(){ + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this._settings.get_boolean('disable-recently-installed-apps')) + return; + + this._appList = this.listAllApps(); + //Update Categories on 'installed-changed' event------------------------------------- + this._installedChangedId = appSys.connect('installed-changed', () => { + this._newAppList = this.listAllApps(); + + //Filter to find if a new application has been installed + let newApps = this._newAppList.filter(app => !this._appList.includes(app)); + + //A New Application has been installed + //Save it in settings + if(newApps.length){ + let recentApps = this._settings.get_strv('recently-installed-apps'); + let newRecentApps = [...new Set(recentApps.concat(newApps))]; + this._settings.set_strv('recently-installed-apps', newRecentApps); + this.MenuLayout.reloadApplications(); + } + + this._appList = this._newAppList; + }); + } + + listAllApps(){ + let appList = appSys.get_installed().filter(appInfo => { + try { + appInfo.get_id(); // catch invalid file encodings + } catch (e) { + return false; + } + return appInfo.should_show(); + }); + return appList.map(app => app.get_id()); + } + + createMenuLayout(){ + this._forcedMenuLocation = false; + this.arcMenu.actor.style = null; + this.arcMenu.removeAll(); + this.section = new PopupMenu.PopupMenuSection(); + this.arcMenu.addMenuItem(this.section); + this.mainBox = new St.BoxLayout({ + vertical: false, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign.FILL, + y_align: Clutter.ActorAlign.FILL + }); + this.mainBox._delegate = this.mainBox; + this.section.actor.add_child(this.mainBox); + + const StandaloneRunner = true; + this.MenuLayout = Utils.getMenuLayout(this, Constants.MenuLayout.RUNNER, StandaloneRunner); + this.updateStyle(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + reloadMenuLayout(){ + this._forcedMenuLocation = false; + + this.MenuLayout.destroy(); + this.MenuLayout = null; + + this.arcMenu.actor.style = null; + + const StandaloneRunner = true; + this.MenuLayout = Utils.getMenuLayout(this, Constants.MenuLayout.RUNNER, StandaloneRunner); + + this.updateStyle(); + + if(this.arcMenu.isOpen){ + if(this.MenuLayout.activeMenuItem) + this.MenuLayout.activeMenuItem.active = true; + else + this.mainBox.grab_key_focus(); + } + } + + updateStyle(){ + let customStyle = this._settings.get_boolean('enable-custom-arc-menu'); + + this.arcMenu.actor.set_style_class_name(null); + this.arcMenu.actor.style_class = customStyle ? 'arc-menu-boxpointer': 'popup-menu-boxpointer'; + this.arcMenu.actor.add_style_class_name(customStyle ? 'arc-menu' : 'popup-menu'); + + if(this.MenuLayout) + this.MenuLayout.updateStyle(); + } + + toggleMenu(){ + if(this.contextMenuManager.activeMenu) + this.contextMenuManager.activeMenu.toggle(); + if(this.subMenuManager.activeMenu) + this.subMenuManager.activeMenu.toggle(); + + if(!this.arcMenu.isOpen){ + this.MenuLayout.updateLocation(); + this.arcMenu.toggle(); + if(this.arcMenu.isOpen) + this.mainBox.grab_key_focus(); + } + else if(this.arcMenu.isOpen){ + this.arcMenu.toggle(); + } + } + + getActiveMenu(){ + if(this.contextMenuManager.activeMenu) + return this.contextMenuManager.activeMenu; + else if(this.subMenuManager.activeMenu) + return this.subMenuManager.activeMenu; + else if(this.arcMenu.isOpen) + return this.arcMenu; + else + return null; + } + + destroy(){ + if(this.createLayoutID){ + GLib.source_remove(this.createLayoutID); + this.createLayoutID = null; + } + + if(this.updateMenuLayoutID){ + GLib.source_remove(this.updateMenuLayoutID); + this.updateMenuLayoutID = null; + } + + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + + if(this._installedChangedId){ + appSys.disconnect(this._installedChangedId); + this._installedChangedId = null; + } + + if(this.MenuLayout) + this.MenuLayout.destroy(); + if(this.arcMenu) + this.arcMenu.destroy(); + if(this.dummyWidget){ + Main.uiGroup.remove_child(this.dummyWidget); + this.dummyWidget.destroy(); + } + } + + updateMenuLayout(){ + this.tooltipShowing = false; + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + if(this.MenuLayout){ + this.MenuLayout.destroy(); + this.MenuLayout = null; + } + this.updateMenuLayoutID = GLib.timeout_add(0, 100, () => { + this.createMenuLayout(); + this.updateMenuLayoutID = null; + return GLib.SOURCE_REMOVE; + }); + } + + loadExtraPinnedApps(){ + if(this.MenuLayout) + this.MenuLayout.loadExtraPinnedApps(); + } + + updateLocation(){ + if(this.MenuLayout) + this.MenuLayout.updateLocation(); + } + + displayPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.displayPinnedApps(); + } + + loadPinnedApps() { + if(this.MenuLayout) + this.MenuLayout.loadPinnedApps(); + } + + reload(){ + if(this.MenuLayout){ + this.reloadMenuLayout(); + } + } + + shouldLoadPinnedApps(){ + if(this.MenuLayout) + return this.MenuLayout.shouldLoadPinnedApps; + } + + setDefaultMenuView(){ + if(this.MenuLayout) + this.MenuLayout.setDefaultMenuView(); + } + + _onOpenStateChanged(menu, open) { + if(open){ + if(Main.panel.menuManager && Main.panel.menuManager.activeMenu) + Main.panel.menuManager.activeMenu.toggle(); + } + else{ + if(!this.arcMenu.isOpen){ + if (this.tooltipShowingID) { + GLib.source_remove(this.tooltipShowingID); + this.tooltipShowingID = null; + } + this.tooltipShowing = false; + if(this.activeTooltip){ + this.activeTooltip.hide(); + } + + if (this.tooltipHidingID) { + GLib.source_remove(this.tooltipHidingID); + this.tooltipHidingID = null; + } + } + } + } +}; + +var ArcMenu = class Arc_Menu_ArcMenu extends PopupMenu.PopupMenu{ + constructor(sourceActor, arrowAlignment, arrowSide, standaloneRunner) { + super(sourceActor, arrowAlignment, arrowSide); + this._settings = sourceActor._settings; + this.standaloneRunner = standaloneRunner; + Main.uiGroup.add_child(this.actor); + this.actor.hide(); + this._boxPointer.set_offscreen_redirect(Clutter.OffscreenRedirect.ON_IDLE); + this._menuClosedID = this.connect('menu-closed', () => this.standaloneRunner.setDefaultMenuView()); + this.connect('destroy', () => this._onDestroy()); + } + + open(animate){ + if(!this.isOpen) + this.standaloneRunner.arcMenu.actor._muteInput = false; + super.open(animate); + } + + close(animate){ + if(this.isOpen){ + if(this.standaloneRunner.contextMenuManager.activeMenu) + this.standaloneRunner.contextMenuManager.activeMenu.toggle(); + if(this.standaloneRunner.subMenuManager.activeMenu) + this.standaloneRunner.subMenuManager.activeMenu.toggle(); + } + + super.close(animate); + } + + _onDestroy(){ + if(this._menuClosedID){ + this.disconnect(this._menuClosedID) + this._menuClosedID = null; + } + } +}; diff --git a/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/utils.js b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/utils.js new file mode 100644 index 0000000..92207b5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/arcmenu@arcmenu.com/utils.js @@ -0,0 +1,687 @@ +/* + * ArcMenu - A traditional application menu for GNOME 3 + * + * ArcMenu Lead Developer and Maintainer + * Andrew Zaech https://gitlab.com/AndrewZaech + * + * ArcMenu Founder, Former Maintainer, and Former Graphic Designer + * LinxGem33 https://gitlab.com/LinxGem33 - (No Longer Active) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Constants = Me.imports.constants; +const {Gio, GLib} = imports.gi; + +const PowerManagerInterface = ` + + + + + + + + + + + + + + +`; +const PowerManager = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface); + +function canHibernate(asyncCallback){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHibernateRemote((result, error) => { + if(error) + asyncCallback(false, false); + else{ + let needsAuth = result[0] === 'challenge'; + let canHibernate = needsAuth || result[0] === 'yes'; + asyncCallback(canHibernate, needsAuth); + } + }); +} + +function activateHibernate(){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHibernateRemote((result, error) => { + if(error || result[0] !== 'yes') + imports.ui.main.notifyError(_("ArcMenu - Hibernate Error!"), _("System unable to hibernate.")); + else{ + proxy.HibernateRemote(true); + } + }); +} + +function canHybridSleep(asyncCallback){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHybridSleepRemote((result, error) => { + if(error) + asyncCallback(false, false); + else{ + let needsAuth = result[0] === 'challenge'; + let canHybridSleep = needsAuth || result[0] === 'yes'; + asyncCallback(canHybridSleep, needsAuth); + } + }); +} + +function activateHybridSleep(){ + let proxy = new PowerManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + proxy.CanHybridSleepRemote((result, error) => { + if(error || result[0] !== 'yes') + imports.ui.main.notifyError(_("ArcMenu - Hybrid Sleep Error!"), _("System unable to hybrid sleep.")); + else{ + proxy.HybridSleepRemote(true); + } + }); +} + +function getMenuLayout(menuButton, layout, isStandaloneRunner){ + let MenuLayout = Me.imports.menulayouts; + switch(layout){ + case Constants.MenuLayout.ARCMENU: + return new MenuLayout.arcmenu.createMenu(menuButton); + case Constants.MenuLayout.BRISK: + return new MenuLayout.brisk.createMenu(menuButton); + case Constants.MenuLayout.WHISKER: + return new MenuLayout.whisker.createMenu(menuButton); + case Constants.MenuLayout.GNOME_MENU: + return new MenuLayout.gnomemenu.createMenu(menuButton); + case Constants.MenuLayout.MINT: + return new MenuLayout.mint.createMenu(menuButton); + case Constants.MenuLayout.GNOME_OVERVIEW: + return null; + case Constants.MenuLayout.ELEMENTARY: + return new MenuLayout.elementary.createMenu(menuButton); + case Constants.MenuLayout.REDMOND: + return new MenuLayout.redmond.createMenu(menuButton); + case Constants.MenuLayout.SIMPLE: + return new MenuLayout.simple.createMenu(menuButton); + case Constants.MenuLayout.SIMPLE_2: + return new MenuLayout.simple2.createMenu(menuButton); + case Constants.MenuLayout.UNITY: + return new MenuLayout.unity.createMenu(menuButton); + case Constants.MenuLayout.BUDGIE: + return new MenuLayout.budgie.createMenu(menuButton); + case Constants.MenuLayout.INSIDER: + return new MenuLayout.insider.createMenu(menuButton); + case Constants.MenuLayout.RUNNER: + return new MenuLayout.runner.createMenu(menuButton, isStandaloneRunner); + case Constants.MenuLayout.CHROMEBOOK: + return new MenuLayout.chromebook.createMenu(menuButton); + case Constants.MenuLayout.RAVEN: + return new MenuLayout.raven.createMenu(menuButton); + case Constants.MenuLayout.TOGNEE: + return new MenuLayout.tognee.createMenu(menuButton); + case Constants.MenuLayout.PLASMA: + return new MenuLayout.plasma.createMenu(menuButton); + case Constants.MenuLayout.WINDOWS: + return new MenuLayout.windows.createMenu(menuButton); + case Constants.MenuLayout.LAUNCHER: + return new MenuLayout.launcher.createMenu(menuButton); + case Constants.MenuLayout.ELEVEN: + return new MenuLayout.eleven.createMenu(menuButton); + case Constants.MenuLayout.AZ: + return new MenuLayout.az.createMenu(menuButton); + default: + return new MenuLayout.arcmenu.createMenu(menuButton); + } +} + +function getSettings(schema, extensionUUID) { + let extension = imports.ui.main.extensionManager.lookup(extensionUUID); + + if (!extension) + throw new Error('ArcMenu - getSettings() unable to find extension'); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Expect USER extensions to have a schemas/ subfolder, otherwise assume a + // SYSTEM extension that has been installed in the same prefix as the shell + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) { + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + } else { + schemaSource = GioSSS.get_default(); + } + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error(`Schema ${schema} could not be found for extension ${extension.metadata.uuid}. Please check your installation`); + + return new Gio.Settings({ settings_schema: schemaObj }); +} + +function convertToGridLayout(item){ + const Clutter = imports.gi.Clutter; + const settings = item._settings; + const layoutProperties = item._menuLayout.layoutProperties; + + let icon = item._icon ? item._icon : item._iconBin; + + item.vertical = true; + if(item._ornamentLabel) + item.remove_child(item._ornamentLabel); + + item.tooltipLocation = Constants.TooltipLocation.BOTTOM_CENTERED; + item.label.x_align = item.label.y_align = Clutter.ActorAlign.CENTER; + item.label.y_expand = true; + + icon.y_align = Clutter.ActorAlign.CENTER; + icon.y_expand = true; + if(settings.get_boolean('multi-lined-labels')){ + icon.y_align = Clutter.ActorAlign.TOP; + icon.y_expand = false; + + let clutterText = item.label.get_clutter_text(); + clutterText.set({ + line_wrap: true, + line_wrap_mode: imports.gi.Pango.WrapMode.WORD_CHAR, + }); + } + + if(item._indicator){ + item.remove_child(item._indicator); + item.insert_child_at_index(item._indicator, 0); + item._indicator.x_align = Clutter.ActorAlign.CENTER; + item._indicator.y_align = Clutter.ActorAlign.START; + item._indicator.y_expand = false; + } + + const iconSizeEnum = settings.get_enum('menu-item-grid-icon-size'); + let defaultIconStyle = layoutProperties.DefaultIconGridStyle; + + iconSize = getGridIconStyle(iconSizeEnum, defaultIconStyle); + item.name = iconSize; +} + +function getIconSize(iconSizeEnum, defaultIconSize){ + const IconSizeEnum = iconSizeEnum; + let iconSize = defaultIconSize; + if(IconSizeEnum === Constants.IconSize.DEFAULT) + iconSize = defaultIconSize; + else if(IconSizeEnum === Constants.IconSize.EXTRA_SMALL) + iconSize = Constants.EXTRA_SMALL_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.SMALL) + iconSize = Constants.SMALL_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.MEDIUM) + iconSize = Constants.MEDIUM_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.LARGE) + iconSize = Constants.LARGE_ICON_SIZE; + else if(IconSizeEnum === Constants.IconSize.EXTRA_LARGE) + iconSize = Constants.EXTRA_LARGE_ICON_SIZE; + + return iconSize; +} + +function getGridIconSize(iconSizeEnum, defaultIconStyle){ + let iconSize; + if(iconSizeEnum === Constants.GridIconSize.DEFAULT){ + Constants.GridIconInfo.forEach((info) => { + if(info.NAME === defaultIconStyle){ + iconSize = info.ICON_SIZE; + } + }); + } + else + iconSize = Constants.GridIconInfo[iconSizeEnum - 1].ICON_SIZE; + + return iconSize; +} + +function getGridIconStyle(iconSizeEnum, defaultIconStyle){ + const IconSizeEnum = iconSizeEnum; + let iconStyle = defaultIconStyle; + if(IconSizeEnum === Constants.GridIconSize.DEFAULT) + iconStyle = defaultIconStyle; + else if(IconSizeEnum === Constants.GridIconSize.SMALL) + iconStyle = 'SmallIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.MEDIUM) + iconStyle = 'MediumIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.LARGE) + iconStyle = 'LargeIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.SMALL_RECT) + iconStyle = 'SmallRectIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.MEDIUM_RECT) + iconStyle = 'MediumRectIconGrid'; + else if(IconSizeEnum === Constants.GridIconSize.LARGE_RECT) + iconStyle = 'LargeRectIconGrid'; + + return iconStyle; +} + +function getCategoryDetails(currentCategory, categoryIconType){ + let name, gicon, iconName, fallbackIconName; + for(let entry of Constants.Categories){ + if(entry.CATEGORY === currentCategory){ + name = entry.NAME; + if(categoryIconType === Constants.CategoryIconType.FULL_COLOR) + iconName = entry.FULL_COLOR_ICON; + else + iconName = entry.ICON; + return [name, gicon, iconName, fallbackIconName]; + } + } + if(currentCategory === Constants.CategoryType.HOME_SCREEN){ + name = _("Home Screen"); + gicon = Gio.icon_new_for_string(Me.path + '/media/icons/menu_icons/homescreen-symbolic.svg'); + return [name, gicon, iconName, fallbackIconName]; + } + else{ + name = currentCategory.get_name(); + if(categoryIconType === Constants.CategoryIconType.FULL_COLOR) + gicon = currentCategory.get_icon() ? currentCategory.get_icon() : null; + else + iconName = currentCategory.get_icon().to_string() + "-symbolic"; + fallbackIconName = currentCategory.get_icon() ? currentCategory.get_icon().to_string() : null; + return [name, gicon, iconName, fallbackIconName]; + } +} + +function activateCategory(currentCategory, menuLayout, menuItem, extraParams = false){ + if(currentCategory === Constants.CategoryType.HOME_SCREEN){ + menuLayout.activeCategory = _("Pinned Apps"); + menuLayout.displayPinnedApps(); + } + else if(currentCategory === Constants.CategoryType.PINNED_APPS) + menuLayout.displayPinnedApps(); + else if(currentCategory === Constants.CategoryType.FREQUENT_APPS){ + menuLayout.setFrequentAppsList(menuItem); + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + } + else if(currentCategory === Constants.CategoryType.ALL_PROGRAMS) + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + else if(currentCategory === Constants.CategoryType.RECENT_FILES) + menuLayout.displayRecentFiles(); + else + menuLayout.displayCategoryAppList(menuItem.appList, currentCategory, extraParams ? menuItem : null); + + menuLayout.activeCategoryType = currentCategory; +} + +function getMenuButtonIcon(settings, path){ + let iconType = settings.get_enum('menu-button-icon'); + + if(iconType === Constants.MenuIcon.CUSTOM){ + if(path && GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + else if(iconType === Constants.MenuIcon.DISTRO_ICON){ + let iconEnum = settings.get_int('distro-icon'); + path = Me.path + Constants.DistroIcons[iconEnum].PATH; + if(Constants.DistroIcons[iconEnum].PATH === 'start-here-symbolic') + return 'start-here-symbolic'; + else if(GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + else{ + let iconEnum = settings.get_int('arc-menu-icon'); + path = Me.path + Constants.MenuIcons[iconEnum].PATH; + if(GLib.file_test(path, GLib.FileTest.IS_REGULAR)) + return path; + } + + global.log("ArcMenu Error - Failed to set menu button icon. Set to System Default."); + return 'start-here-symbolic'; +} + +function findSoftwareManager(){ + let softwareManager = null; + let appSys = imports.gi.Shell.AppSystem.get_default(); + + for(let softwareManagerID of Constants.SoftwareManagerIDs){ + if(appSys.lookup_app(softwareManagerID)){ + softwareManager = softwareManagerID; + break; + } + } + + return softwareManager; +} + +function createXpmImage(color1, color2, color3, color4){ + let width = 42; + let height = 14; + let colors = 5; + let xpm = [width + " " + height + " " + colors + " " + 1, "1 c " + rgbStringToHex(color1), "2 c " + rgbStringToHex(color2), + "3 c " + rgbStringToHex(color3), "4 c " + rgbStringToHex(color4), "x c #AAAAAA"]; + xpm.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + for(let i = 0; i < height - 2; i++) + xpm.push("x1111111111222222222233333333334444444444x"); + xpm.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + return xpm; +} + +function areaOfTriangle(p1, p2, p3){ + return Math.abs((p1[0] * (p2[1] - p3[1]) + p2[0] * (p3[1] - p1[1]) + p3[0] * (p1[1] - p2[1])) / 2.0); +} + +function ensureActorVisibleInScrollView(actor) { + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2; + + let parent = actor.get_parent(); + while (!(parent instanceof imports.gi.St.ScrollView)) { + if (!parent) + return; + + box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + parent = parent.get_parent(); + } + + let adjustment = parent.vscroll.adjustment; + let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values(); + + let offset = 0; + let vfade = parent.get_effect("fade"); + if (vfade) + offset = vfade.fade_margins.top; + + if (y1 < value + offset) + value = Math.max(0, y1 - offset); + else if (y2 > value + pageSize - offset) + value = Math.min(upper, y2 + offset - pageSize); + else + return; + adjustment.set_value(value); +} + +function getArraysEqual(a, b) { + if(a instanceof Array && b instanceof Array){ + if (a.length !== b.length) + return false; + for(let i = 0; i < a.length; i++) + if (!getArraysEqual(a[i], b[i])) + return false; + return true; + } + else + return a === b; +} + +function createTooltip(button, widget, titleLabel, description, displayType){ + let lbl = titleLabel.clutter_text; + lbl.get_allocation_box(); + let isEllipsized = lbl.get_layout().is_ellipsized(); + if(displayType !== Constants.DisplayType.BUTTON && (isEllipsized || description)){ + let titleText, descriptionText; + if(isEllipsized && description){ + titleText = titleLabel.text.replace(/\n/g, " "); + descriptionText = description; + } + else if(isEllipsized && !description) + titleText = titleLabel.text.replace(/\n/g, " "); + else if(!isEllipsized && description) + descriptionText = description; + widget.tooltip = new Me.imports.menuWidgets.Tooltip(button, widget.actor, titleText, descriptionText); + widget.tooltip._onHover(); + } + else if(displayType === Constants.DisplayType.BUTTON){ + let titleText = titleLabel.text.replace(/\n/g, " "); + widget.tooltip = new Me.imports.menuWidgets.Tooltip(button, widget.actor, titleText, null); + widget.tooltip.location = Constants.TooltipLocation.TOP_CENTERED; + widget.tooltip._onHover(); + } +} + +function getDashToPanelPosition(settings, index){ + var positions = null; + var side; + + try{ + positions = JSON.parse(settings.get_string('panel-positions')) + } catch(e){ + log('Error parsing Dash to Panel positions: ' + e.message); + } + + if(!positions) + side = settings.get_string('panel-position'); + else{ + side = positions[index]; + } + + if (side === 'TOP') + return imports.gi.St.Side.TOP; + else if (side === 'RIGHT') + return imports.gi.St.Side.RIGHT; + else if (side === 'BOTTOM') + return imports.gi.St.Side.BOTTOM; + else if (side === 'LEFT') + return imports.gi.St.Side.LEFT; + else + return imports.gi.St.Side.BOTTOM; +} + +function getStylesheet(){ + let stylesheet = Gio.File.new_for_path(GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + + if(!stylesheet.query_exists(null)){ + GLib.spawn_command_line_sync("mkdir " + GLib.get_home_dir() + "/.local/share/arcmenu"); + GLib.spawn_command_line_sync("touch " + GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + stylesheet = Gio.File.new_for_path(GLib.get_home_dir() + "/.local/share/arcmenu/stylesheet.css"); + } + + return stylesheet; +} + +function rgbStringToHex(colorString) { + let [r, g, b, a_] = parseRgbString(colorString) + return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); +} + +function clutterColorToRGBA(color) { + return `rgba(${color.red}, ${color.green}, ${color.blue}, ${color.alpha})`; +} + +function parseRgbString(colorString){ + if(colorString.includes('rgba')) + colorString = colorString.replace('rgba(',''); + if(colorString.includes('rgb')) + colorString = colorString.replace('rgb(',''); + colorString = colorString.replace(')',''); + let rgbaColor = colorString.split(","); + + let r = parseFloat(rgbaColor[0]); + let g = parseFloat(rgbaColor[1]); + let b = parseFloat(rgbaColor[2]); + let a; + if(rgbaColor[3] != undefined) + a = parseFloat(rgbaColor[3]); + else + a = 1; + return [r, g, b, a]; +} + +function modifyColorLuminance(colorString, luminanceFactor, overrideAlpha){ + let Clutter = imports.gi.Clutter; + let color = Clutter.color_from_string(colorString)[1]; + let [hue, lum, sat] = color.to_hls(); + let modifiedLum = lum; + + if(lum >= .85) //if lum is too light, force darken + modifiedLum = Math.min((1 - Math.abs(luminanceFactor)) * modifiedLum, 1); + else if(lum <= .15) //if lum is too dark, force lighten + modifiedLum = Math.max((1 - Math.abs(luminanceFactor)) * modifiedLum, 0); + else if(luminanceFactor >= 0) //otherwise, darken or lighten based on luminanceFactor + modifiedLum = Math.min((1 + luminanceFactor) * modifiedLum, 1); + else + modifiedLum = Math.max((1 + luminanceFactor) * modifiedLum, 0); + + let alpha = (color.alpha / 255).toPrecision(3); + if(overrideAlpha) + alpha = overrideAlpha; + + let modifiedColor = Clutter.color_from_hls(hue, modifiedLum, sat); + + return `rgba(${modifiedColor.red}, ${modifiedColor.green}, ${modifiedColor.blue}, ${alpha})` +} + +function createStylesheet(settings){ + let customarcMenu = settings.get_boolean('enable-custom-arc-menu'); + let separatorColor = settings.get_string('separator-color'); + let menuColor = settings.get_string('menu-color'); + let menuForegroundColor = settings.get_string('menu-foreground-color'); + let borderColor = settings.get_string('border-color'); + let highlightColor = settings.get_string('highlight-color'); + let highlightForegroundColor = settings.get_string('highlight-foreground-color'); + let fontSize = settings.get_int('menu-font-size'); + let borderSize = settings.get_int('menu-border-size'); + let cornerRadius = settings.get_int('menu-corner-radius'); + let menuMargin = settings.get_int('menu-margin'); + let menuArrowSize = settings.get_int('menu-arrow-size'); + let leftPanelWidth = settings.get_int('menu-width'); + let leftPanelWidthSmall = settings.get_int('menu-width') - 65; + let rightPanelWidth = settings.get_int('right-panel-width'); + let rightPanelWidthPlus45 = settings.get_int('right-panel-width') + 45; + let rightPanelWidthPlus70 = settings.get_int('right-panel-width') + 70; + let avatarStyle = settings.get_enum('avatar-style'); + let avatarRadius = avatarStyle == 0 ? 999 : 0; + let menuButtonColor = settings.get_string('menu-button-color'); + let menuButtonHoverColor = settings.get_string('menu-button-hover-color'); + let menuButtonActiveColor = settings.get_string('menu-button-active-color'); + let menuButtonHoverBackgroundcolor = settings.get_string('menu-button-hover-backgroundcolor'); + let menuButtonActiveBackgroundcolor = settings.get_string('menu-button-active-backgroundcolor'); + let gapAdjustment = settings.get_int('gap-adjustment'); + let indicatorColor = settings.get_string('indicator-color'); + let indicatorTextBackgroundColor = settings.get_string('indicator-text-color'); + let plasmaSelectedItemColor = settings.get_string('plasma-selected-color'); + let plasmaSelectedItemBackgroundColor = settings.get_string('plasma-selected-background-color'); + let plasmaSearchBarTop = settings.get_enum('searchbar-default-top-location'); + let menuButtonBorderRadius = settings.get_int('menu-button-border-radius'); + let tooltipStyle, separatorColorStyle = "\n", smallButtonHoverStyle = "\n"; + let plasmaButtonStyle = plasmaSearchBarTop === Constants.SearchbarLocation.TOP ? 'border-top-width: 2px;' : 'border-bottom-width: 2px;'; + if(customarcMenu){ + tooltipStyle = ".tooltip-menu-item{\nborder-radius: 8px;\nbox-shadow: 0 0 1px 0px " + separatorColor + ";\nfont-size:" + fontSize + "pt;\npadding: 3px 8px;\nmin-height: 0px;" + + "\ncolor:" + menuForegroundColor+ ";\nbackground-color:" + modifyColorLuminance(menuColor, 0.05, 1) + ";\nmax-width:550px;\n}\n\n"; + separatorColorStyle = ".separator-color-style{\nbackground-color: " + separatorColor + ";\n}\n\n"; + smallButtonHoverStyle = ".arc-menu .popup-menu-item .arcmenu-small-button.selected{\nbackground-color: " + modifyColorLuminance(highlightColor, -0.25) + "\n}\n\n"; + } + else + tooltipStyle = ".tooltip-menu-item{\nborder-radius: 8px;\npadding: 3px 8px;\nmax-width:550px;\nmin-height: 0px;\n}\n\n"; + + let menuButtonStyle = ''; + if(settings.get_boolean('override-menu-button-color')) + menuButtonStyle += ".arc-menu-icon, .arc-menu-text, .arc-menu-arrow{\ncolor: " + menuButtonColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-hover-background-color')) + menuButtonStyle += ".arc-menu-panel-menu:hover{\nbackground-color: " + menuButtonHoverBackgroundcolor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-hover-color')) + menuButtonStyle += ".arc-menu-panel-menu:hover .arc-menu-icon, .arc-menu-panel-menu:hover .arc-menu-text" + +", .arc-menu-panel-menu:hover .arc-menu-arrow{\ncolor: " + menuButtonHoverColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-active-color')) + menuButtonStyle += ".arc-menu-icon:active, .arc-menu-text:active, .arc-menu-arrow:active{\ncolor: " + menuButtonActiveColor + ";\n}\n\n"; + if(settings.get_boolean('override-menu-button-active-background-color')) + menuButtonStyle += ".arc-menu-panel-menu:active{\nbackground-color: " + menuButtonActiveBackgroundcolor + ";\n}\n\n"; + if(settings.get_boolean('menu-button-override-border-radius')){ + let border = menuButtonBorderRadius === 0 ? 1 : 3; + menuButtonStyle += ".arc-menu-panel-menu{\nborder-radius: " + menuButtonBorderRadius + "px;\nborder: " + border + "px solid transparent;\n}\n\n"; + } + + let iconGridStyle = "\ntext-align: center;\n border-radius: 8px;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\n"; + + let stylesheetCSS = "#arc-search{\nwidth: " + leftPanelWidth + "px;\n}\n\n" + +".arc-menu-status-text{\ncolor:" + menuForegroundColor + ";\nfont-size:" + fontSize + "pt;\n}\n\n" + +".search-statustext{\nfont-size:11pt;\n}\n\n" + + +"#ExtraLargeIconGrid{\nwidth: 150px;\n height: 150px;" + iconGridStyle + "}\n\n" + + +"#LargeIconGrid{\nwidth: 95px;\n height: 95px;" + iconGridStyle + "}\n\n" + + +"#MediumIconGrid{\nwidth: 87px;\n height: 87px;" + iconGridStyle + "}\n\n" + + +"#SmallIconGrid{\nwidth: 80px;\n height: 80px;" + iconGridStyle + "}\n\n" + + +"#LargeRectIconGrid{\nwidth: 95px;\n height: 85px;" + iconGridStyle + "}\n\n" + + +"#MediumRectIconGrid{\nwidth: 92px;\n height: 78px;" + iconGridStyle + "}\n\n" + + +"#SmallRectIconGrid{\nwidth: 85px;\n height: 70px;" + iconGridStyle + "}\n\n" + + +".left-panel{\nwidth:" + leftPanelWidth + "px;\n}\n\n" + +".left-panel-small{\nwidth:" + leftPanelWidthSmall + "px;\n}\n\n" + +".right-panel{\nwidth:" + rightPanelWidth + "px;\n}\n\n" + +".right-panel-plus45{\nwidth:" + rightPanelWidthPlus45 + "px;\n}\n\n" + +".right-panel-plus70{\nwidth:" + rightPanelWidthPlus70 + "px;\n}\n\n" + +".default-search-entry{\nmax-width: 17.667em;\n}\n\n" + +".arc-search-entry{\nmax-width: 17.667em;\nfont-size:" + fontSize + "pt;\nborder-color:" + separatorColor + ";\nborder-width: 1px;\n" + +"color:" + menuForegroundColor + ";\nbackground-color:" + modifyColorLuminance(menuColor, -0.1, 1) + ";\n}\n\n" + +".arc-search-entry:focus{\nborder-color:" + highlightColor + ";\nborder-width: 1px;\nbox-shadow: inset 0 0 0 1px " + modifyColorLuminance(highlightColor, 0.05) + ";\n}\n\n" + +".arc-search-entry StLabel.hint-text{\ncolor: " + modifyColorLuminance(menuForegroundColor, 0, 0.6) + ";\n}\n\n" + +"#ArcSearchEntry{\nmin-height: 0px;\nborder-radius: 8px;\nborder-width: 1px;\npadding: 7px 9px;\n}\n\n" + +"#ArcSearchEntryRound{\nmin-height: 0px;\nborder-radius: 18px;\nborder-width: 1px;\npadding: 7px 12px;\n}\n\n" + + menuButtonStyle + +".symbolic-icons{\n-st-icon-style: symbolic;\n}\n\n" + +".regular-icons{\n-st-icon-style: regular;\n}\n\n" + +".arcmenu-menu-item{\nborder-radius: 8px;\n}\n\n" + +".margin-box{\nmargin: 0px 4px;\n}\n\n" + +"#arc-menu-launcher-button{\nmax-width: 90px;\nborder-radius: 0px;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\nborder-color: transparent;\nborder-bottom-width: 3px;\n}\n\n" + +"#arc-menu-launcher-button.active-item, #arc-menu-launcher-button:active{\nbackground-color: " + plasmaSelectedItemBackgroundColor + ";\n" + +"\nborder-color: " + plasmaSelectedItemColor + ";\nborder-bottom-width: 3px;\n}\n\n" + + +"#arc-menu-plasma-button{\nwidth: 90px;\n height: 65px;\nborder-radius: 8px;\n text-align: center;\n padding: 5px;\n spacing: 0px;\n margin: 0px;\n\n" + plasmaButtonStyle + ";\nborder-color: transparent;\n}\n\n" + +"#arc-menu-plasma-button:active-item, .arc-menu-plasma-button:active{\nbackground-color: " + plasmaSelectedItemBackgroundColor + ";\n" + + plasmaButtonStyle + "\nborder-color: " + plasmaSelectedItemColor + ";\n}\n\n" + + +"StScrollView .small-vfade{\n-st-vfade-offset: 44px;\n}\n\n" + + +".arc-menu-button{\n-st-icon-style: symbolic;\nborder-width: 1px;\nborder-radius: 8px;\npadding: 8px;\n}\n\n" + +".arcmenu-small-button{\n-st-icon-style: symbolic;\nborder-radius: 8px;\npadding: 3px 8px;\n}\n\n" + +smallButtonHoverStyle + + +".arc-menu-menu-item-indicator{\ncolor: " + indicatorColor + ";\n}\n\n" + +".arc-menu-menu-item-text-indicator{\nbackground-color: " + indicatorTextBackgroundColor + ";\n}\n\n" + + +tooltipStyle + + +".arc-menu{\n-boxpointer-gap: " + gapAdjustment + "px;\nmin-width: 15em;\ncolor: #D3DAE3;\nborder-image: none;\n" + +"box-shadow: none;\nfont-size:" + fontSize + "pt;\n}\n\n" + +".arc-menu .popup-sub-menu{\npadding-bottom: 1px;\nbackground-color: " + modifyColorLuminance(menuColor, 0.04) + ";\n}\n\n" + +".arc-menu .popup-menu-item{\nspacing: 6px; \nborder: none;\ncolor:" + menuForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:active{\nbackground-color:" + modifyColorLuminance(highlightColor, -0.15) + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item.selected{\nbackground-color:" + highlightColor + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:checked{\nbackground-color:" + highlightColor + "; \ncolor: " + highlightForegroundColor + ";\n}\n\n" + +".arc-menu .popup-menu-item:insensitive{\ncolor:" + modifyColorLuminance(menuForegroundColor, 0, 0.6) + ";\n}\n\n" + +".arc-menu-boxpointer{ \n-arrow-border-radius:" + cornerRadius + "px;\n" + +"-arrow-background-color:" + menuColor + ";\n" + +"-arrow-border-color:" + borderColor + ";\n" + +"-arrow-border-width:" + borderSize + "px;\n" + +"-arrow-base:" + menuMargin + "px;\n" + +"-arrow-rise:" + menuArrowSize + "px;\n}\n\n" + +".arc-menu .popup-menu-content{\npadding: 16px 0px;\nmargin: 0;\nbackground-color: transparent;\nborder-radius: 0px;\nbox-shadow: 0;\n}\n\n" + + +".arcmenu-separator{\npadding: 0px;\nheight: 1px;\nmargin: 0px 20px;\n}\n\n" + + separatorColorStyle + +".menu-user-avatar{\nbackground-size: contain;\nborder-radius: " + avatarRadius + "px;\n}\n\n"; + + let stylesheet = getStylesheet(); + if(stylesheet){ + try{ + stylesheet.replace_contents(stylesheetCSS, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null); + } + catch(e){ + global.log("ArcMenu Error - Failed to update stylesheet. " + e.message); + } + } + else + global.log("ArcMenu Error - Failed to find stylesheet."); +} diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/appfolders.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/appfolders.js new file mode 100644 index 0000000..9548559 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/appfolders.js @@ -0,0 +1,225 @@ +'use strict'; + +const { Shell, GLib, Clutter } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +const transparent = Clutter.Color.from_pixel(0x00000000); +const FOLDER_DIALOG_ANIMATION_TIME = 200; +const FRAME_UPDATE_PERIOD = 16; + +let original_zoomAndFadeIn = null; +let original_zoomAndFadeOut = null; +let sigma = 30; +let brightness = 0.6; + +let _zoomAndFadeIn = function () { + let [sourceX, sourceY] = + this._source.get_transformed_position(); + let [dialogX, dialogY] = + this.child.get_transformed_position(); + + this.child.set({ + translation_x: sourceX - dialogX, + translation_y: sourceY - dialogY, + scale_x: this._source.width / this.child.width, + scale_y: this._source.height / this.child.height, + opacity: 0, + }); + + this.set_background_color(transparent); + + let effect = this.get_effect("appfolder-blur"); + + effect.sigma = 0; + Utils.ease_property(effect, 'sigma', 0, sigma, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + effect.brightness = 1.0; + Utils.ease_property(effect, 'brightness', 1.0, brightness, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + this.child.ease({ + translation_x: 0, + translation_y: 0, + scale_x: 1, + scale_y: 1, + opacity: 255, + duration: FOLDER_DIALOG_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + }); + + this._needsZoomAndFade = false; + + if (this._sourceMappedId === 0) { + this._sourceMappedId = this._source.connect( + 'notify::mapped', this._zoomAndFadeOut.bind(this)); + } +} + +let _zoomAndFadeOut = function () { + if (!this._isOpen) + return; + + if (!this._source.mapped) { + this.hide(); + return; + } + + let [sourceX, sourceY] = + this._source.get_transformed_position(); + let [dialogX, dialogY] = + this.child.get_transformed_position(); + + this.set_background_color(transparent); + + let effect = this.get_effect("appfolder-blur"); + + Utils.ease_property(effect, 'sigma', effect.sigma, 0, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + Utils.ease_property(effect, 'brightness', effect.brightness, 1.0, FOLDER_DIALOG_ANIMATION_TIME, FRAME_UPDATE_PERIOD); + + this.child.ease({ + translation_x: sourceX - dialogX, + translation_y: sourceY - dialogY, + scale_x: this._source.width / this.child.width, + scale_y: this._source.height / this.child.height, + opacity: 0, + duration: FOLDER_DIALOG_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => { + this.child.set({ + translation_x: 0, + translation_y: 0, + scale_x: 1, + scale_y: 1, + opacity: 255, + }); + this.hide(); + + this._popdownCallbacks.forEach(func => func()); + this._popdownCallbacks = []; + }, + }); + + this._needsZoomAndFade = false; +} + + +var AppFoldersBlur = class AppFoldersBlur { + constructor(connections, prefs) { + this.connections = connections; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.prefs = prefs; + } + + enable() { + this._log("blurring appfolders"); + + if (Main.overview._overview.controls._appDisplay._folderIcons.length > 0) { + this.blur_appfolders(); + } + this.connections.connect(Main.overview._overview.controls._appDisplay, 'view-loaded', () => { + this.blur_appfolders(); + }) + } + + blur_appfolders() { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + icon._ensureFolderDialog(); + + if (original_zoomAndFadeIn == null) { + original_zoomAndFadeIn = icon._dialog._zoomAndFadeIn; + } + if (original_zoomAndFadeOut == null) { + original_zoomAndFadeOut = icon._dialog._zoomAndFadeOut; + } + + let effect = new Shell.BlurEffect({ + name: "appfolder-blur", + sigma: sigma, + brightness: brightness, + mode: 1 + }); + icon._dialog.remove_effect_by_name("appfolder-blur"); + icon._dialog.add_effect(effect); + + // HACK + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("appfolders hack level 1"); + this.paint_signals.disconnect_all(); + + Utils.setTimeout(() => { + this.paint_signals.connect(Main.overview._overview, effect); + this.paint_signals.connect(icon._dialog, effect); + }, 100); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("appfolders hack level 2"); + this.paint_signals.disconnect_all(); + + Utils.setTimeout(() => { + this.paint_signals.connect(Main.overview._overview, effect); + this.paint_signals.connect(icon._dialog, effect); + }, 100); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + + icon._dialog._viewBox.set_style_class_name('app-folder-dialog transparent-app-folder-dialogs-' + 100 * this.prefs.APPFOLDER_DIALOG_OPACITY.get()); + + icon._dialog._zoomAndFadeIn = _zoomAndFadeIn; + icon._dialog._zoomAndFadeOut = _zoomAndFadeOut; + }); + } + + set_sigma(s) { + sigma = s; + if (this.prefs.BLUR_APPFOLDERS.get()) + this.blur_appfolders(); + } + + set_brightness(b) { + brightness = b; + if (this.prefs.BLUR_APPFOLDERS.get()) + this.blur_appfolders(); + } + + disable() { + this._log("removing blur from appfolders"); + + if (original_zoomAndFadeIn != null) { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) + icon._dialog._zoomAndFadeIn = original_zoomAndFadeIn; + }); + } + if (original_zoomAndFadeOut != null) { + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) + icon._dialog._zoomAndFadeOut = original_zoomAndFadeOut; + }); + } + Main.overview._overview.controls._appDisplay._folderIcons.forEach(icon => { + if (icon._dialog) { + icon._dialog.remove_effect_by_name("appfolder-blur") + icon._dialog._viewBox.remove_style_class_name('transparent-app-folder-dialogs-' + 100 * this.prefs.APPFOLDER_DIALOG_OPACITY.get()); + } + }); + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/applications.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/applications.js new file mode 100644 index 0000000..e044464 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/applications.js @@ -0,0 +1,274 @@ +'use strict'; + +const { Shell, Clutter, Meta, GLib } = imports.gi; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; +const BlurMode = Shell.BlurMode; + +var ApplicationsBlur = class ApplicationsBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + + this.windowMap = new Map(); + this.blurActorMap = new Map(); + } + + enable() { + this._log("blurring applications..."); + + // iterate through existing windows and add blur as needed + for (let workspace = 0; workspace < global.workspace_manager.get_n_workspaces(); ++workspace) { + let metaWorkspace = global.workspace_manager.get_workspace_by_index(workspace); + let windows = metaWorkspace.list_windows(); + windows.forEach((meta_window) => { + let window_actor = meta_window.get_compositor_private(); + this.track_new(window_actor, meta_window); + }) + } + + // blur every new window + this.connections.connect(global.display, 'window-created', (meta_display, meta_window) => { + this._log("window created"); + if (meta_window) { + let window_actor = meta_window.get_compositor_private(); + this.track_new(window_actor, meta_window); + } + }); + + // workaround for blur being in front of target windows + this.connections.connect(global.display, 'notify::focus-window', () => { + if (this.blurActorMap.size > 0) { + let callbackId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this.blurActorMap.forEach((blurActor, pid) => { + let actor = this.windowMap.get(pid).get_compositor_private(); + if (actor !== null && actor.get_parent() === blurActor.get_parent()) { + global.window_group.set_child_below_sibling(blurActor, actor); + } + }) + }) + } + }) + } + + // Blurs and add the needed signals to every new tracked window + track_new(window_actor, meta_window) { + // TODO change the pid to a more unique one, to prevent collisions? + let pid = Date.now(); + + window_actor['blur_provider_pid'] = pid; + meta_window['blur_provider_pid'] = pid; + + // remove the blur when the window is destroyed + this.connections.connect(window_actor, 'destroy', (window_actor) => { + let pid = window_actor.blur_provider_pid; + if (this.blurActorMap.has(pid)) { + this.remove_blur(pid) + } + }); + + // update the blur when the mutter-hint is changed + this.connections.connect(meta_window, 'notify::mutter-hints', (meta_window) => { + this._log("mutter-hint changed"); + let pid = meta_window.blur_provider_pid; + let window_actor = meta_window.get_compositor_private(); + this.update_blur(window_actor, meta_window, pid) + }); + + this.update_blur(window_actor, meta_window, pid); + } + + // This method is basically a catch-all for blurring windows. It handles the decisions + // to call different methods that handle removing, setting, and updating blur + update_blur(window_actor, meta_window, pid) { + let mutter_hint = meta_window.get_mutter_hints(); + + // check if the window wants blur and update it accordingly + if (mutter_hint != null && mutter_hint.includes("blur-provider")) { + // get blur effect parameters + let sigma = this.parse_sigma_value(mutter_hint); + let brightness = this.prefs.BRIGHTNESS.get(); + + // if the provided sigma value is incorrect + if (sigma == null || sigma < 0 || sigma > 111) { + this._log("sigma value is null or outside of range (0-111), defaulting to extension setting") + sigma = this.prefs.SIGMA.get(); + } + + // check wether the actor is already blurred and act consequently + if (this.blurActorMap.has(pid)) { + if (sigma == 0) { + // actor already blurred, should not be anymore + this.remove_blur(pid); + } else { + // actor already blurred, update it + this.update_blur_effect( + this.blurActorMap.get(pid), + sigma, + brightness + ); + } + } else if (sigma != 0) { + // actor not blurred, blur it + this.set_blur( + pid, + window_actor, + meta_window, + this.create_blur_effect(sigma, brightness) + ) + } + } else if (this.blurActorMap.has(pid)) { + // remove blur if the mutter_hint no longer contains our blur-provider value + this.remove_blur(pid); + } + } + + // Returns a new blur effect + create_blur_effect(sigma, brightness) { + return new Shell.BlurEffect({ + sigma: sigma, + brightness: brightness, + mode: BlurMode.BACKGROUND + }); + } + + // Add the blur effect to the actor + set_blur(pid, window_actor, meta_window, blurEffect) { + let blurActor = this.create_blur_actor(meta_window, window_actor, blurEffect); + + // if hacks are selected, force the repaint the window to prevent artifacts + if (this.prefs.HACKS_LEVEL.get() >= 1) { + this._log("applications hack level 1 or 2"); + this.paint_signals.disconnect_all(); + this.paint_signals.connect(blurActor, blurEffect); + } else { + this.paint_signals.disconnect_all(); + } + + global.window_group.insert_child_below(blurActor, window_actor); + + // registed the blur actor/effect + blurActor['blur_provider_pid'] = pid; + this.blurActorMap.set(pid, blurActor); + this.windowMap.set(pid, meta_window); + + // hide if window become invisible + this.connections.connect(window_actor, 'notify::visible', (window_actor) => { + let pid = window_actor.blur_provider_pid; + if (window_actor.visible) { + this.blurActorMap.get(pid).show(); + } else { + this.blurActorMap.get(pid).hide(); + } + }); + } + + // Returns a new already blurred widget, configured to follow the size and + // position of its target window + create_blur_actor(meta_window, window_actor, blurEffect) { + // create the constraints in size and position to its target window + let frame = meta_window.get_frame_rect(); + let buffer = meta_window.get_buffer_rect(); + + const offsetX = frame.x - buffer.x; + const offsetY = frame.y - buffer.y; + const offsetWidth = buffer.width - frame.width; + const offsetHeight = buffer.height - frame.height; + + let constraintPosX = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.X, + offset: offsetX + }); + let constraintPosY = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.Y, + offset: offsetY + }); + + let constraintSizeX = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.WIDTH, + offset: -offsetWidth + }); + let constraintSizeY = new Clutter.BindConstraint({ + source: window_actor, + coordinate: Clutter.BindCoordinate.HEIGHT, + offset: -offsetHeight + }); + + // create the actor and add the constraints + let blurActor = new Clutter.Actor(); + blurActor.add_constraint(constraintPosX); + blurActor.add_constraint(constraintPosY); + blurActor.add_constraint(constraintSizeX); + blurActor.add_constraint(constraintSizeY); + + // add the effect + blurActor.add_effect_with_name('blur-effect', blurEffect); + + return blurActor; + } + + // Updates the blur effect by overwriting its sigma and brightness values + update_blur_effect(blur_actor, sigma, brightness) { + let effect = blur_actor.get_effect('blur-effect'); + effect.sigma = sigma; + effect.brightness = brightness; + } + + // Removes the blur actor from the shell and unregister it + remove_blur(pid) { + // global.window_group is null when restarting the shell, causing an innocent crash crash + if (global.window_group == null) + return + + global.window_group.remove_actor(this.blurActorMap.get(pid)); + this.blurActorMap.delete(pid); + this.windowMap.delete(pid); + } + + // When given the xprop property, returns either a valid sigma value between 0 and 111 + // or null if the parsing is incorrect + parse_sigma_value(property) { + let result = property.match("(blur-provider=)(\\d{1,3})") + if (result == null) { + return null; + } else { + return result[2]; + } + } + + disable() { + this._log("removing blur from applications..."); + + this.blurActorMap.forEach(((value, key) => { + this.remove_blur(key) + })); + this.connections.disconnect_all(); + this.paint_signals.disconnect_all(); + } + + // Updates each blur effect to use new sigma value + set_sigma(s) { + this.blurActorMap.forEach((actor, _) => { + actor.get_effect('blur-effect').set_sigma(s) + }) + } + + // Updates each blur effect to use new brightness value + set_brightness(b) { + this.blurActorMap.forEach((actor, _) => { + actor.get_effect('blur-effect').set_brightness(b) + }) + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/connections.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/connections.js new file mode 100644 index 0000000..3517a27 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/connections.js @@ -0,0 +1,81 @@ +'use strict'; + +const GObject = imports.gi.GObject; + + +var Connections = class Connections { + constructor() { + this.buffer = []; + } + + process_connection(actor, id) { + let infos = { + actor: actor, + id: id + }; + + if (actor.connect && (!(actor instanceof GObject.Object) || GObject.signal_lookup('destroy', actor))) { + let destroy_id = actor.connect('destroy', () => { + actor.disconnect(id); + actor.disconnect(destroy_id); + + let index = this.buffer.indexOf(infos); + if (index >= 0) { + this.buffer.splice(index, 1) + } + }) + } + + this.buffer.push(infos) + } + + connect(actor, signal, handler) { + let id = actor.connect(signal, handler); + this.process_connection(actor, id); + } + + connect_after(actor, signal, handler) { + let id = actor.connect_after(signal, handler); + + this.process_connection(actor, id); + } + + disconnect_all_for(actor) { + let actor_connections = [] + + this.buffer.forEach((infos) => { + if (infos.actor == actor) { + actor_connections.push(infos) + } + }); + + actor_connections.forEach((connection) => { + // disconnect + try { + connection.actor.disconnect(connection.id) + } catch (e) { + this._log(`error removing connection: ${e}; continuing`) + } + + // remove from buffer + let index = this.buffer.indexOf(connection); + this.buffer.splice(index, 1); + }) + } + + disconnect_all() { + this.buffer.forEach((connection) => { + try { + connection.actor.disconnect(connection.id) + } catch (e) { + this._log(`error removing connection: ${e}; continuing`) + } + }) + this.buffer = []; + } + + // no need to check if DEBUG here, the log function is only used on error + _log(str) { + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash.js new file mode 100644 index 0000000..650bf69 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash.js @@ -0,0 +1,51 @@ +'use strict'; + +const { St, Shell, Meta } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; + + +var DashBlur = class DashBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + } + + enable() { + this._log("blurring dash"); + this.update(); + } + + update() { + if (Main.overview.dash.constructor.name == "Dash") { + Main.overview.dash.get_child_at_index(0).style = "background-color:rgba(0,0,0," + this.prefs.DASH_OPACITY.get() + ")"; + } + + // set search entry the same opacity as the dash + Main.overview._overview._controls._searchEntry.style = "background-color:rgba(0,0,0," + this.prefs.DASH_OPACITY.get() + ")"; + } + + disable() { + this._log("removing blur from dash"); + + if (Main.overview.dash.constructor.name == "Dash") { + if (Main.screenShield && !Main.screenShield.locked) { + try { + Main.overview.dash.get_child_at_index(0).style = null; + } catch (e) { + this._log(e); + } + } + } + Main.overview._overview._controls._searchEntry.style = null; + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`); + } +}; \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js new file mode 100644 index 0000000..166f147 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/dash_to_dock.js @@ -0,0 +1,235 @@ +'use strict'; + +const { St, Shell, GLib } = imports.gi; +const Main = imports.ui.main; +const Signals = imports.signals; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +// This type of object is created for every dash found, and talks to the main DashBlur thanks +// to signals. This allows to dynamically track the created dashes for each screen. +class DashInfos { + constructor(dash_blur, dash, dash_box, background_parent, effect, prefs) { + // the parent DashBlur object, to communicate + this.dash_blur = dash_blur; + // the blurred dash + this.dash = dash; + // the actually blurred box + this.dash_box = dash_box; + this.background_parent = background_parent; + this.effect = effect; + this.prefs = prefs; + + dash_blur.connections.connect(dash_blur, 'remove-dashes', () => { + this._log("removing blur from dash"); + this.dash.get_parent().remove_child(this.background_parent); + this.dash.remove_style_class_name('blurred-dash'); + }); + + dash_blur.connections.connect(dash_blur, 'update-sigma', () => { + this.effect.sigma = this.dash_blur.sigma; + }); + + dash_blur.connections.connect(dash_blur, 'update-brightness', () => { + this.effect.brightness = this.dash_blur.brightness; + }); + + dash_blur.connections.connect(dash_blur, 'show', () => { + this.effect.sigma = this.dash_blur.sigma; + }); + + dash_blur.connections.connect(dash_blur, 'hide', () => { + this.effect.sigma = 0; + }); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + +var DashBlur = class DashBlur { + constructor(connections, prefs) { + this.dashes = []; + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.sigma = prefs.SIGMA.get(); + this.brightness = prefs.BRIGHTNESS.get(); + } + + enable() { + this.connections.connect(Main.uiGroup, 'actor-added', (_, actor) => { + if ((actor.get_name() == "dashtodockContainer") && (actor.constructor.name == 'DashToDock')) + this.try_blur(actor); + }); + + this.blur_existing_dashes(); + } + + // Finds all existing dashes on every monitor, and call `try_blur` on them + // We cannot only blur `Main.overview.dash`, as there could be multiple screens + blur_existing_dashes() { + this._log("searching for dash"); + // blur every dash found + Main.uiGroup.get_children().filter((child) => { + // filter by name + return (child.get_name() == "dashtodockContainer") && (child.constructor.name == 'DashToDock') + }).forEach(this.try_blur.bind(this)); + } + + // Tries to blur the dash contained in the given actor + try_blur(dash_container) { + let dash_box = dash_container._slider.get_child(); + // verify that we did not already blur that dash + if (!dash_box.get_children().some((c) => { + return c.get_name() == "dash-blurred-background-parent" + })) { + // finally blur the dash + this._log("dash to dock found, blurring it"); + let dash = dash_box.get_children().find(c => { return c.get_name() == 'dash' }) + this.dashes.push(this.blur_dash_from(dash, dash_container)); + } + } + + // Blurs the dash and returns a `DashInfos` containing its informations + blur_dash_from(dash, dash_container) { + // the effect to be applied + let effect = new Shell.BlurEffect({ + brightness: this.brightness, + sigma: this.sigma, + mode: 1 + }); + + // dash background parent, not visible + let background_parent = new St.Widget({ + name: 'dash-blurred-background-parent', + style_class: 'dash-blurred-background-parent', + width: 0, + height: 0 + }); + + // dash background widget + let background = new St.Widget({ + name: 'dash-blurred-background', + style_class: 'dash-blurred-background', + x: 0, + y: dash_container._slider.y, + width: dash.width, + height: dash.height, + }); + + // updates size and position on change + this.connections.connect(dash_container._slider, 'notify::y', _ => { + background.y = dash_container._slider.y; + }); + this.connections.connect(dash, 'notify::width', _ => { + background.width = dash.width; + }); + this.connections.connect(dash, 'notify::height', _ => { + background.height = dash.height; + }); + + + // HACK + { + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the dash buttons to cause artefacts on the dash itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("dash hack level 1"); + this.paint_signals.disconnect_all(); + + let rp = () => { + effect.queue_repaint() + }; + + dash._box.get_children().forEach((icon) => { + try { + let zone = icon.get_child_at_index(0); + this.connections.connect(zone, 'enter-event', rp); + this.connections.connect(zone, 'leave-event', rp); + this.connections.connect(zone, 'button-press-event', rp); + } catch (e) { + this._log(`${e}, continuing`); + } + }) + + this.connections.connect(dash._box, 'actor-added', (_, actor) => { + try { + let zone = actor.get_child_at_index(0); + this.connections.connect(zone, 'enter-event', rp); + this.connections.connect(zone, 'leave-event', rp); + this.connections.connect(zone, 'button-press-event', rp); + } catch (e) { + this._log(`${e}, continuing`); + } + }) + + this.connections.connect(dash._showAppsIcon, 'enter-event', rp); + this.connections.connect(dash._showAppsIcon, 'leave-event', rp); + this.connections.connect(dash._showAppsIcon, 'button-press-event', rp); + + this.connections.connect(dash, 'leave-event', rp); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("dash hack level 2"); + + this.paint_signals.connect(background, effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + } + + // add the widget to the dash + background.add_effect(effect); + background_parent.add_child(background); + dash.get_parent().insert_child_at_index(background_parent, 0); + + // remove background color + dash.set_style_class_name('blurred-dash'); + + // returns infos + return new DashInfos(this, dash, dash._background, background_parent, effect, this.prefs); + } + + set_sigma(sigma) { + this.sigma = sigma; + this.emit('update-sigma', true); + } + + set_brightness(brightness) { + this.brightness = brightness; + this.emit('update-brightness', true); + } + + disable() { + this._log("removing blur from dashes"); + + this.emit('remove-dashes', true); + + this.dashes = []; + this.connections.disconnect_all(); + } + + show() { + this.emit('show', true); + } + hide() { + this.emit('hide', true); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + +Signals.addSignalMethods(DashBlur.prototype); \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/extension.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/extension.js new file mode 100644 index 0000000..4d5c4c9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/extension.js @@ -0,0 +1,224 @@ +'use strict'; + +const { St, Shell } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +const Settings = Me.imports.settings; +const Connections = Me.imports.connections; + +const Panel = Me.imports.panel; +const Dash = Me.imports.dash; +const Overview = Me.imports.overview; +const DashToDock = Me.imports.dash_to_dock; +const Lockscreen = Me.imports.lockscreen; +const AppFolders = Me.imports.appfolders; +const WindowList = Me.imports.window_list; +const Applications = Me.imports.applications; + + +class Extension { + constructor() { } + + enable() { + this._prefs = new Settings.Prefs; + + this._log("enabling extension..."); + this._connections = []; + + this._panel_blur = new Panel.PanelBlur(new Connections.Connections, this._prefs); + this._dash_blur = new Dash.DashBlur(new Connections.Connections, this._prefs); + this._dash_to_dock_blur = new DashToDock.DashBlur(new Connections.Connections, this._prefs); + this._overview_blur = new Overview.OverviewBlur(new Connections.Connections, this._prefs); + this._lockscreen_blur = new Lockscreen.LockscreenBlur(new Connections.Connections, this._prefs); + this._appfolders_blur = new AppFolders.AppFoldersBlur(new Connections.Connections, this._prefs); + this._window_list_blur = new WindowList.WindowListBlur(new Connections.Connections, this._prefs); + this._applications_blur = new Applications.ApplicationsBlur(new Connections.Connections, this._prefs); + + + this._connections.push(this._panel_blur.connections, this._dash_blur.connections, + this._dash_to_dock_blur.connections, this._overview_blur.connections, + this._lockscreen_blur.connections, this._appfolders_blur.connections, + this._window_list_blur.connections, this._applications_blur.connections); + + this._connect_to_settings(); + + if (this._prefs.BLUR_PANEL.get()) { + this._panel_blur.enable(); + } + if (this._prefs.BLUR_DASH.get()) { + this._dash_blur.enable(); + this._dash_to_dock_blur.enable(); + } + if (this._prefs.BLUR_OVERVIEW.get()) { + this._overview_blur.enable(); + } + if (this._prefs.BLUR_LOCKSCREEN.get()) { + this._lockscreen_blur.enable(); + } + if (this._prefs.BLUR_APPFOLDERS.get()) { + this._appfolders_blur.enable(); + } + if (this._prefs.BLUR_WINDOW_LIST.get()) { + this._window_list_blur.enable(); + } + if (this._prefs.BLUR_APPLICATIONS.get()) { + this._applications_blur.enable(); + } + + this._update_sigma(); + this._update_brightness(); + + this._log("extension enabled."); + } + + disable() { + this._log("disabling extension..."); + + this._panel_blur.disable(); + this._dash_blur.disable(); + this._dash_to_dock_blur.disable(); + this._overview_blur.disable(); + this._lockscreen_blur.disable(); + this._appfolders_blur.disable(); + this._window_list_blur.disable(); + this._applications_blur.disable(); + + this._panel_blur = null; + this._dash_blur = null; + this._dash_to_dock_blur = null; + this._overview_blur = null; + this._lockscreen_blur = null; + this._appfolders_blur = null; + this._window_list_blur = null; + this._applications_blur = null; + + this._disconnect_settings(); + + // in theory, this shouldn't be needed if we switch to making modules responsible for disconnecting their own + // signals. For now, I will leave this small bit of code in. Calling disable on all modules has already + // done the same thing + this._connections.forEach((connections) => { + connections.disconnect_all(); + }) + this._connections = []; + + this._log("extension disabled."); + + this._prefs = null; + } + + _connect_to_settings() { + this._prefs.SIGMA.changed(() => { + this._update_sigma(); + }); + this._prefs.BRIGHTNESS.changed(() => { + this._update_brightness(); + }); + + this._prefs.BLUR_DASH.changed(() => { + if (this._prefs.BLUR_DASH.get()) { + this._dash_blur.enable(); + this._dash_to_dock_blur.enable(); + } else { + this._dash_blur.disable(); + this._dash_to_dock_blur.disable(); + } + }); + this._prefs.BLUR_PANEL.changed(() => { + if (this._prefs.BLUR_PANEL.get()) { + this._panel_blur.enable(); + } else { + this._panel_blur.disable(); + } + }); + this._prefs.BLUR_OVERVIEW.changed(() => { + if (this._prefs.BLUR_OVERVIEW.get()) { + this._overview_blur.enable(); + } else { + this._overview_blur.disable(); + } + }); + this._prefs.BLUR_LOCKSCREEN.changed(() => { + if (this._prefs.BLUR_LOCKSCREEN.get()) { + this._lockscreen_blur.enable(); + } else { + this._lockscreen_blur.disable(); + } + }); + this._prefs.BLUR_APPFOLDERS.changed(() => { + if (this._prefs.BLUR_APPFOLDERS.get()) { + this._appfolders_blur.enable(); + } else { + this._appfolders_blur.disable(); + } + }); + this._prefs.BLUR_WINDOW_LIST.changed(() => { + if (this._prefs.BLUR_WINDOW_LIST.get()) { + this._window_list_blur.enable(); + } else { + this._window_list_blur.disable(); + } + }); + this._prefs.BLUR_APPLICATIONS.changed(() => { + if (this._prefs.BLUR_APPLICATIONS.get()) { + this._applications_blur.enable(); + } else { + this._applications_blur.disable(); + } + }) + this._prefs.DASH_OPACITY.changed(() => { + this._dash_blur.update(); + }); + this._prefs.APPFOLDER_DIALOG_OPACITY.changed(() => { + this._appfolders_blur.blur_appfolders(); + }); + this._prefs.STATIC_BLUR.changed(() => { + this._panel_blur.change_blur_type(); + }); + this._prefs.HIDETOPBAR.changed(() => { + this._panel_blur.connect_to_overview(); + }); + } + + _disconnect_settings() { + this._prefs.SIGMA.disconnect(); + this._prefs.BRIGHTNESS.disconnect(); + } + + _update_sigma() { + let sigma = this._prefs.SIGMA.get(); + + this._panel_blur.set_sigma(sigma); + this._dash_to_dock_blur.set_sigma(sigma); + this._overview_blur.set_sigma(sigma); + this._lockscreen_blur.set_sigma(sigma); + this._appfolders_blur.set_sigma(sigma); + this._window_list_blur.set_sigma(sigma); + this._applications_blur.set_sigma(sigma); + } + + _update_brightness() { + let brightness = this._prefs.BRIGHTNESS.get(); + + this._panel_blur.set_brightness(brightness); + this._dash_to_dock_blur.set_brightness(brightness); + this._overview_blur.set_brightness(brightness); + this._lockscreen_blur.set_brightness(brightness); + this._appfolders_blur.set_brightness(brightness); + this._window_list_blur.set_brightness(brightness); + this._applications_blur.set_brightness(brightness); + } + + _log(str) { + if (this._prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} + + +// Called on gnome-shell loading, even if extension is deactivated +function init() { + return new Extension(); +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/lockscreen.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/lockscreen.js new file mode 100644 index 0000000..e6d39b5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/lockscreen.js @@ -0,0 +1,64 @@ +'use strict'; + +const { St, Shell } = imports.gi; +const Main = imports.ui.main; +const Background = imports.ui.background; + +let sigma = 30; +let brightness = 0.6; + +const original_createBackground = imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects; + + +var LockscreenBlur = class LockscreenBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + } + + enable() { + this._log("blurring lockscreen"); + + this.update_lockscreen(); + } + + update_lockscreen() { + imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects = this._createBackground; + } + + _createBackground() { + for (const widget of this._backgroundGroup) { + const effect = widget.get_effect('blur'); + + if (effect) { + effect.set({ + brightness: brightness, + sigma: sigma, + }); + } + } + } + + set_sigma(s) { + sigma = s; + this.update_lockscreen(); + } + + set_brightness(b) { + brightness = b; + this.update_lockscreen(); + } + + disable() { + this._log("removing blur from lockscreen"); + + imports.ui.unlockDialog.UnlockDialog.prototype._updateBackgroundEffects = original_createBackground; + + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/metadata.json b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/metadata.json new file mode 100644 index 0000000..820fa02 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/metadata.json @@ -0,0 +1,12 @@ +{ + "_generated": "Generated by SweetTooth, do not edit", + "description": "Adds a blur look to different parts of the GNOME Shell, including the top panel, dash and overview.\n\nYou can support my work by sponsoring me on:\n- github: https://github.com/sponsors/aunetx\n- ko-fi: https://ko-fi.com/aunetx\n\nNote: if the extension shows an error after updating, please make sure to restart your session to see if it persists. This is due to a bug in gnome shell, which I can't fix by myself.", + "name": "Blur my Shell", + "shell-version": [ + "40", + "41" + ], + "url": "https://github.com/aunetx/gnome-shell-extension-blur-my-shell", + "uuid": "blur-my-shell@aunetx", + "version": 29 +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/overview.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/overview.js new file mode 100644 index 0000000..ffd86f9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/overview.js @@ -0,0 +1,161 @@ +'use strict'; + +const { Shell, Gio, Meta } = imports.gi; +const Main = imports.ui.main; +const WorkspaceAnimationController = imports.ui.workspaceAnimation.WorkspaceAnimationController; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; + + +var OverviewBlur = class OverviewBlur { + constructor(connections, prefs) { + this.connections = connections; + this.effects = []; + this.prefs = prefs; + this._workspace_switch_bg_actors = []; + } + + enable() { + this._log("blurring overview"); + + // connect to every background change (even without changing image) + this.connections.connect(Main.layoutManager._backgroundGroup, 'notify', () => { + this._log("updated background"); + this.update_backgrounds(); + }); + + // connect to monitors change + this.connections.connect(Main.layoutManager, 'monitors-changed', () => { + if (Main.screenShield && !Main.screenShield.locked) { + this._log("changed monitors"); + this.update_backgrounds(); + } + }); + + // add css class names, to change folders and workspace-switch background + Main.uiGroup.add_style_class_name("blurred-overview"); + + // update background on extension activation + // the try/catch behaviour is used to prevent bugs like #136 and #137 + try { + this.update_backgrounds(); + } catch (error) { this._log(`could not blur overview: ${error}`); } + + // store original methods for restoring them on disable() + this._origPrepareSwitch = WorkspaceAnimationController.prototype._prepareWorkspaceSwitch; + this._origFinishSwitch = WorkspaceAnimationController.prototype._finishWorkspaceSwitch; + + const outerThis = this; + + // create blurred background actors for each monitor during a workspace switch + WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = function (...params) { + outerThis._log("prepare workspace switch"); + outerThis._origPrepareSwitch.apply(this, params); + + Main.layoutManager.monitors.forEach(monitor => { + if (!(Meta.prefs_get_workspaces_only_on_primary() && (monitor != Main.layoutManager.primaryMonitor))) { + const bg_actor = outerThis.create_background_actor(monitor); + Main.uiGroup.insert_child_above(bg_actor, global.window_group); + + // store the actors so that we can delete them later + outerThis._workspace_switch_bg_actors.push(bg_actor); + } + }); + }; + + // remove the workspace-switch actors when the switch is done + WorkspaceAnimationController.prototype._finishWorkspaceSwitch = function (...params) { + outerThis._log("finish workspace switch"); + outerThis._origFinishSwitch.apply(this, params); + + outerThis._workspace_switch_bg_actors.forEach(actor => { + actor.destroy(); + }); + outerThis._workspace_switch_bg_actors = []; + }; + } + + update_backgrounds() { + // remove every old background + Main.layoutManager.overviewGroup.get_children().forEach(actor => { + if (actor.constructor.name == 'Meta_BackgroundActor') { + Main.layoutManager.overviewGroup.remove_child(actor); + actor.destroy(); + } + }); + this.effects = []; + + // add new backgrounds + Main.layoutManager.monitors.forEach(monitor => { + const bg_actor = this.create_background_actor(monitor); + Main.layoutManager.overviewGroup.insert_child_at_index(bg_actor, monitor.index); + }); + } + + create_background_actor(monitor) { + let bg_actor = new Meta.BackgroundActor; + + let background = Main.layoutManager._backgroundGroup.get_child_at_index(Main.layoutManager.monitors.length - monitor.index - 1); + + if (!background) { + this._log("could not get background for overview"); + return bg_actor; + } + + bg_actor.set_content(background.get_content()); + + let effect = new Shell.BlurEffect({ + brightness: this.prefs.BRIGHTNESS.get(), + sigma: this.prefs.SIGMA.get(), + mode: 0 + }); + bg_actor.add_effect(effect); + this.effects.push(effect); + + bg_actor.set_x(monitor.x); + bg_actor.set_y(monitor.y); + + return bg_actor; + } + + set_sigma(s) { + this.effects.forEach(effect => { + effect.sigma = s; + }); + } + + set_brightness(b) { + this.effects.forEach(effect => { + effect.brightness = b; + }); + } + + disable() { + this._log("removing blur from overview"); + Main.layoutManager.overviewGroup.get_children().forEach(actor => { + if (actor.constructor.name == 'Meta_BackgroundActor') { + Main.layoutManager.overviewGroup.remove_child(actor); + } + }); + Main.uiGroup.remove_style_class_name("blurred-overview"); + + this.effects = []; + this.connections.disconnect_all(); + + // restore original behavior + if (this._origPrepareSwitch) { + WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = this._origPrepareSwitch; + } + + if (this._origFinishSwitch) { + WorkspaceAnimationController.prototype._finishWorkspaceSwitch = this._origFinishSwitch; + } + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`); + } +}; diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/paint_signals.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/paint_signals.js new file mode 100644 index 0000000..0c3dc4f --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/paint_signals.js @@ -0,0 +1,59 @@ +'use strict' + +const { GObject, Clutter } = imports.gi; + + +var PaintSignals = class PaintSignals { + constructor(connections) { + this.buffer = []; + this.connections = connections + } + + connect(actor, blur_effect) { + let paint_effect = new EmitPaintSignal(); + let infos = { + actor: actor, + paint_effect: paint_effect + }; + let counter = 0; + + actor.add_effect(paint_effect); + this.connections.connect(paint_effect, 'update-blur', () => { + try { + // checking if blur_effect.queue_repaint() has been recently called + if (counter === 0) { + counter = 2; + blur_effect.queue_repaint(); + } + else counter--; + } catch (e) { } + }); + + this.buffer.push(infos) + } + + disconnect_all() { + this.buffer.forEach((infos) => { + this.connections.disconnect_all_for(infos.paint_effect); + infos.actor.remove_effect(infos.paint_effect); + }); + + this.buffer = [] + } +} + +var EmitPaintSignal = GObject.registerClass({ + GTypeName: 'EmitPaintSignal', + Signals: { + 'update-blur': { + param_types: [] + }, + } +}, + class EmitPaintSignal extends Clutter.Effect { + vfunc_paint(node, paint_context, paint_flags) { + this.emit("update-blur"); + super.vfunc_paint(node, paint_context, paint_flags); + } + } +); \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/panel.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/panel.js new file mode 100644 index 0000000..930ca4d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/panel.js @@ -0,0 +1,245 @@ +'use strict'; + +const { St, Shell, Meta, Gio, GLib } = imports.gi; +const Main = imports.ui.main; +const Config = imports.misc.config; +const backgroundSettings = new Gio.Settings({ schema: 'org.gnome.desktop.background' }) + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + +const [GS_MAJOR, GS_MINOR] = Config.PACKAGE_VERSION.split('.'); + + +var PanelBlur = class PanelBlur { + constructor(connections, prefs) { + this.connections = connections; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.prefs = prefs; + this.effect = new Shell.BlurEffect({ + brightness: prefs.BRIGHTNESS.get(), + sigma: prefs.SIGMA.get(), + mode: prefs.STATIC_BLUR.get() ? 0 : 1 + }); + this.background_parent = new St.Widget({ + name: 'topbar-blurred-background-parent', + style_class: 'topbar-blurred-background-parent', + x: this.monitor.x, + y: this.monitor.y, + width: this.monitor.width, + height: 0, + }); + this.background = prefs.STATIC_BLUR.get() ? new Meta.BackgroundActor : new St.Widget({ + style_class: 'topbar-blurred-background', + x: 0, + y: 0, + width: this.monitor.width, + height: Main.panel.height, + }); + this.background_parent.add_child(this.background); + } + + enable() { + this._log("blurring top panel"); + + if (GS_MAJOR < 42) { + // hide corners, can't style them + Main.panel._leftCorner.hide(); + Main.panel._rightCorner.hide(); + this.connections.connect(Main.panel._leftCorner, 'show', () => { Main.panel._leftCorner.hide(); }); + this.connections.connect(Main.panel._rightCorner, 'show', () => { Main.panel._rightCorner.hide(); }); + } + + // insert background parent + let children = Main.layoutManager.panelBox.get_children(); + for (let i = 0; i < children.length; ++i) + if (children[i].name == 'topbar-blurred-background-parent') + Main.layoutManager.panelBox.remove_child(children[i]); + Main.layoutManager.panelBox.insert_child_at_index(this.background_parent, 0); + + // remove background + Main.panel.add_style_class_name('transparent-panel'); + + // perform updates + this.change_blur_type(); + Utils.setTimeout(() => { this.change_blur_type() }, 500); + + // connect to panel size change + this.connections.connect(Main.panel, 'notify::height', () => { + this.update_size(this.prefs.STATIC_BLUR.get()); + }); + + // connect to every background change (even without changing image) + this.connections.connect(Main.layoutManager._backgroundGroup, 'notify', () => { + this.update_wallpaper(this.prefs.STATIC_BLUR.get()); + }) + + // connect to monitors change + this.connections.connect(Main.layoutManager, 'monitors-changed', () => { + if (Main.screenShield && !Main.screenShield.locked) { + this.update_wallpaper(this.prefs.STATIC_BLUR.get()); + this.update_size(this.prefs.STATIC_BLUR.get()); + } + }); + + this.connect_to_overview(); + } + + change_blur_type() { + let is_static = this.prefs.STATIC_BLUR.get(); + + // reset widgets to right state + this.background_parent.remove_child(this.background); + this.background.remove_effect(this.effect); + this.background = is_static ? new Meta.BackgroundActor : new St.Widget({ + style_class: 'topbar-blurred-background', + x: 0, + y: 0, + width: this.monitor.width, + height: Main.panel.height, + }); + this.effect.set_mode(is_static ? 0 : 1); + this.background.add_effect(this.effect); + this.background_parent.add_child(this.background); + + // perform updates + this.update_wallpaper(is_static); + this.update_size(is_static); + + // HACK + if (!is_static) { + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("panel hack level 1"); + this.paint_signals.disconnect_all(); + + let rp = () => { this.effect.queue_repaint() }; + + this.connections.connect(Main.panel, 'enter-event', rp); + this.connections.connect(Main.panel, 'leave-event', rp); + this.connections.connect(Main.panel, 'button-press-event', rp); + + Main.panel.get_children().forEach(child => { + this.connections.connect(child, 'enter-event', rp); + this.connections.connect(child, 'leave-event', rp); + this.connections.connect(child, 'button-press-event', rp); + }); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("panel hack level 2"); + this.paint_signals.disconnect_all(); + + this.paint_signals.connect(this.background, this.effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + } + } + + update_wallpaper(is_static) { + // if static blur, get right wallpaper and update blur with it + if (is_static) { + // the try/catch behaviour is used to prevent bugs like #136 and #137 + try { + let bg = Main.layoutManager._backgroundGroup.get_child_at_index(Main.layoutManager.monitors.length - this.monitor.index - 1); + this.background.set_content(bg.get_content()); + } catch (error) { this._log(`could not blur panel: ${error}`) } + } + } + + update_size(is_static) { + this.background_parent.width = Main.panel.width; + this.background.width = Main.panel.width; + let panel_box = Main.layoutManager.panelBox; + this.background.height = panel_box.height; + let clip_box = panel_box.get_parent(); + if (is_static) { + this.background.set_clip( + clip_box.x, + clip_box.y, + panel_box.width, + panel_box.height + ); + this.background.x = -clip_box.x; + this.background.y = -clip_box.y; + } + } + + // returns either the primary monitor, or a dummy one if none is connected + get monitor() { + if (Main.layoutManager.primaryMonitor != null) { + return Main.layoutManager.primaryMonitor + } else { + return { x: 0, y: 0, width: 0, index: 0 } + } + } + + // connect when overview if opened/closed to hide/show the blur in consequence + // if HIDETOPBAR set, we need just to hide the blur when showing appgrid (so no shadow is cropped) + connect_to_overview() { + this.connections.disconnect_all_for(Main.overview._overview._controls._appDisplay); + this.connections.disconnect_all_for(Main.overview); + + if (!this.prefs.HIDETOPBAR.get()) { + this.connections.connect(Main.overview, 'showing', () => { + this.hide(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } else { + this.connections.connect(Main.overview._overview._controls._appDisplay, 'show', () => { + this.hide(); + }); + this.connections.connect(Main.overview._overview._controls._appDisplay, 'hide', () => { + this.show(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } + } + + set_sigma(s) { + this.effect.sigma = s; + } + + set_brightness(b) { + this.effect.brightness = b; + } + + disable() { + this._log("removing blur from top panel"); + Main.panel.remove_style_class_name('transparent-panel'); + + if (GS_MAJOR < 42) { + Main.panel._leftCorner.show(); + Main.panel._rightCorner.show(); + } + + try { + Main.layoutManager.panelBox.remove_child(this.background_parent); + } catch (e) { } + + this.connections.disconnect_all(); + } + + show() { + this.background_parent.show(); + } + hide() { + this.background_parent.hide(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.js new file mode 100644 index 0000000..b8c1c41 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.js @@ -0,0 +1,187 @@ +'use strict'; + +const { GObject, Gtk } = imports.gi; + +const ExtensionUtils = imports.misc.extensionUtils; +const Extension = ExtensionUtils.getCurrentExtension(); +let Settings = Extension.imports.settings; +let config = new Settings.Prefs(); + + +const BlurMyShellPrefsWidget = GObject.registerClass({ + GTypeName: 'BlurMyShellPrefsWidget', + Template: Extension.dir.get_child('prefs.ui').get_uri(), + InternalChildren: [ + 'sigma_scale', + 'brightness_scale', + 'blur_dash', + 'blur_panel', + 'blur_overview', + 'blur_applications', + 'blur_lockscreen', + 'blur_appfolders', + 'blur_window_list', + 'hacks_level0', + 'hacks_level1', + 'hacks_level2', + 'dash_opacity_scale', + 'appfolder_dialog_opacity_scale', + 'static_blur', + 'hidetopbar', + 'debug_mode' + ], +}, class BlurMyShellPrefsWidget extends Gtk.Box { + _init(params = {}) { + super._init(params); + + // ! sigma + this._sigma_scale.set_value(config.SIGMA.get()); + + // ! brightness + this._brightness_scale.set_value(config.BRIGHTNESS.get()); + + // ! blur dash + this._blur_dash.set_active(config.BLUR_DASH.get()); + + // ! blur panel + this._blur_panel.set_active(config.BLUR_PANEL.get()); + + // ! blur overview + this._blur_overview.set_active(config.BLUR_OVERVIEW.get()); + + // ! blur applications + this._blur_applications.set_active(config.BLUR_APPLICATIONS.get()); + + // ! blur lockscreen + this._blur_lockscreen.set_active(config.BLUR_LOCKSCREEN.get()); + + // ! blur appfolders + this._blur_appfolders.set_active(config.BLUR_APPFOLDERS.get()); + + // ! blur window list + this._blur_window_list.set_active(config.BLUR_WINDOW_LIST.get()); + + // ! dash hacks + if (config.HACKS_LEVEL.get() == 0) { + this._hacks_level0.set_active(true); + } else if (config.HACKS_LEVEL.get() == 1) { + this._hacks_level1.set_active(true); + } else if (config.HACKS_LEVEL.get() == 2) { + this._hacks_level2.set_active(true); + } else { + this._log(`hack level out-of-bound: ${hack_level}, defaulting to 1.`); + this._hacks_level0.set_active(true); + } + + // ! dash opacity + this._dash_opacity_scale.set_value(config.DASH_OPACITY.get()); + + // ! appfolder dialog opacity + this._appfolder_dialog_opacity_scale.set_value(config.APPFOLDER_DIALOG_OPACITY.get()); + + // ! static panel blur + this._static_blur.set_active(config.STATIC_BLUR.get()); + + // ! hidetopbar compatibility + this._hidetopbar.set_active(config.HIDETOPBAR.get()); + + // ! debug mode + this._debug_mode.set_active(config.DEBUG.get()); + } + + sigma_changed(w) { + let value = w.get_value(); + config.SIGMA.set(value); + } + + brightness_changed(w) { + let value = w.get_value(); + config.BRIGHTNESS.set(value); + } + + blur_dash_toggled(w) { + let value = w.get_active(); + config.BLUR_DASH.set(value); + } + + blur_panel_toggled(w) { + let value = w.get_active(); + config.BLUR_PANEL.set(value); + } + + blur_overview_toggled(w) { + let value = w.get_active(); + config.BLUR_OVERVIEW.set(value); + } + + blur_applications_toggled(w) { + let value = w.get_active(); + config.BLUR_APPLICATIONS.set(value); + } + + blur_lockscreen_toggled(w) { + let value = w.get_active(); + config.BLUR_LOCKSCREEN.set(value); + } + + blur_appfolders_toggled(w) { + let value = w.get_active(); + config.BLUR_APPFOLDERS.set(value); + } + + blur_window_list_toggled(w) { + let value = w.get_active(); + config.BLUR_WINDOW_LIST.set(value); + } + + hacks_level0_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(0) } + } + + hacks_level1_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(1) } + } + + hacks_level2_toggled(w) { + let is_active = w.get_active(); + if (is_active) { config.HACKS_LEVEL.set(2) } + } + + dash_opacity_changed(w) { + let value = w.get_value(); + config.DASH_OPACITY.set(value); + } + + appfolder_dialog_opacity_changed(w) { + let value = w.get_value(); + config.APPFOLDER_DIALOG_OPACITY.set(value); + } + + static_blur_toggled(w) { + let value = w.get_active(); + config.STATIC_BLUR.set(value); + } + + hidetopbar_toggled(w) { + let value = w.get_active(); + config.HIDETOPBAR.set(value); + } + + debug_mode_toggled(w) { + let value = w.get_active(); + config.DEBUG.set(value); + } + + _log(str) { + if (config.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +}); + +function init() { } + +function buildPrefsWidget() { + return new BlurMyShellPrefsWidget(); +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.ui b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.ui new file mode 100644 index 0000000..a5d30c7 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/prefs.ui @@ -0,0 +1,410 @@ + + + + + diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..ca00e0c1e8f8d52f8e95fc81aade8ebd4d10af00 GIT binary patch literal 1064 zcmY*YJ!lj`7#)93P44uPLOd)|gcKXd-WGyrA=*ezuuzag6eM%EjrO&U!Z-<#WbX5jJOzMc7I_M5l!bs1|Jq#_>` z@XevN4(8qg@b=c9S7g4kL`^J#T}&vP6k-=+<}eI#Rgf(pjJ>KCgdJ5)TFUpU>VB$% zM2A6AZTQ{T?kw8o1r}M8T$&H=u?Ox?9LjM7d<+=NQ3RjJQ3kKR`&d5;=DCU@6A`!z z%-7D|qfb2se+j%yKb&5mPdyI*Dfk&M*S}JxPhEh&2JQnJ^=}{OQ%}GjfZqUj;`gic zsgJ||1pWeKw{B0+r)Hf^@D_F6GivsXJcEzCcK)R~Cv_R~&w(!hZy!D?vd7e{Qv-K_ zofmC~^{F|31^gIzvb$h>>Ph%(;68BU(r;6rn*DhV9sup_l~b%kU4p*>{tWEMug~dI zvp<{QpTOm5>ok4p3Veb4E&=Ov-yhJY=KKnnc}P;3>ZZ+m$K6_uS(5-)CN17Io?F^g zX&5zRjMaE{Rio=cnz1*(rvo?a*}hH~)=`}>Q*owMZ#didiS{~j_&i0j^epo+4lpy! z7jskqm>(Pw_sP2(W~~I~)i7@y=D2>?Y$wfFsla$)w%3cRx~ z@DBQ63>igtL*G?#!u6x?f$!@kI);CRZ`dD+y=`A*%IDenJ?x$xMzX2XMOuTYlcOP4%-{aK>2yye_PqEmVW5{w{YLOSbMEBPzm-uW5y3tkM;ioejD3L literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml new file mode 100644 index 0000000..4417dce --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml @@ -0,0 +1,95 @@ + + + + + + 30 + Global sigma (gaussian blur radius) to use + + + + + 0.6 + Global brightness to use + + + + + true + Boolean, whether to blur the dash or not + + + + + true + Boolean, whether to blur the panel or not + + + + + true + Boolean, whether to blur the overview or not + + + + + true + Boolean, whether to blur lockscreen or not + + + + + true + Boolean, whether to blur appfolders or not + + + + + true + Boolean, whether to blur window list extension or not + + + + + false + Boolean, whether to blur applications that request it or not + + + + + 1 + Level of hacks to use (from 0 to 2) + + + + + 0.12 + Opacity of dash to use + + + + + 0.12 + Opacity of appfolder dialog to use + + + + + true + Boolean, whether to have a static blur on panel or a dynamic one + + + + + false + Boolean, whether to try compatibility with hidetopbar@mathieu.bidon.ca or not + + + + + false + Boolean, set to true to activate debug mode (more verbose journalctl logs) + + + + \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/settings.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/settings.js new file mode 100644 index 0000000..69a0093 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/settings.js @@ -0,0 +1,274 @@ +'use strict'; + +const Gio = imports.gi.Gio; +const Extension = imports.misc.extensionUtils.getCurrentExtension(); + +const SCHEMA_PATH = 'org.gnome.shell.extensions.blur-my-shell'; + +function get_local_gsettings(schema_path) { + const GioSSS = Gio.SettingsSchemaSource; + let schemaDir = Extension.dir.get_child('schemas'); + let schemaSource = GioSSS.get_default(); + + if (schemaDir.query_exists(null)) { + schemaSource = GioSSS.new_from_directory( + schemaDir.get_path(), + schemaSource, + false); + } + + let schemaObj = schemaSource.lookup(schema_path, true); + if (!schemaObj) { + throw new Error( + `Schema ${schema_path} could not be found for extension ${Extension.metadata.uuid}` + ); + } + return new Gio.Settings({ + settings_schema: schemaObj + }); +}; + +var Prefs = class Prefs { + constructor() { + var settings = this.settings = get_local_gsettings(SCHEMA_PATH); + this.SIGMA = { + key: 'sigma', + get: function () { + return settings.get_int(this.key); + }, + set: function (v) { + settings.set_int(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.BRIGHTNESS = { + key: 'brightness', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.BLUR_DASH = { + key: 'blur-dash', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_PANEL = { + key: 'blur-panel', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_OVERVIEW = { + key: 'blur-overview', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_LOCKSCREEN = { + key: 'blur-lockscreen', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_APPLICATIONS = { + key: 'blur-applications', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_APPFOLDERS = { + key: 'blur-appfolders', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.BLUR_WINDOW_LIST = { + key: 'blur-window-list', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.HACKS_LEVEL = { + key: 'hacks-level', + get: function () { + return settings.get_int(this.key); + }, + set: function (v) { + settings.set_int(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.DASH_OPACITY = { + key: 'dash-opacity', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.APPFOLDER_DIALOG_OPACITY = { + key: 'appfolder-dialog-opacity', + get: function () { + return settings.get_double(this.key); + }, + set: function (v) { + settings.set_double(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + }, + }; + + this.STATIC_BLUR = { + key: 'static-blur', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.HIDETOPBAR = { + key: 'hidetopbar', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + + this.DEBUG = { + key: 'debug', + get: function () { + return settings.get_boolean(this.key); + }, + set: function (v) { + settings.set_boolean(this.key, v); + }, + changed: function (cb) { + return settings.connect('changed::' + this.key, cb); + }, + disconnect: function () { + return settings.disconnect.apply(settings, arguments); + } + }; + } +}; \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/stylesheet.css b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/stylesheet.css new file mode 100644 index 0000000..a094537 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/stylesheet.css @@ -0,0 +1,436 @@ +#panel.transparent-panel { + background: transparent; + transition-duration: 500ms; +} + +.blurred-overview .app-folder { + background-color: rgba(0, 0, 0, 0.12); +} + + +.blurred-overview .workspace-animation { + background-color: transparent !important; +} + +.transparent-app-folder-dialogs .edit-folder-button { + background: transparent; + border-radius: 19px; +} + +.blurred-dash .dash-background { + background: transparent; +} + +/* +! TRANSPARENT APPFOLDER DIALOGS + +python generator: + +```py +for e in range(0,101):print(".transparent-app-folder-dialogs-"+str(e)+"\n{background-color: rgba(0, 0, 0, "+str(round(e/100,2))+");}") +``` +*/ + +.transparent-app-folder-dialogs-0 { + background-color: rgba(0, 0, 0, 0.0); +} + +.transparent-app-folder-dialogs-1 { + background-color: rgba(0, 0, 0, 0.01); +} + +.transparent-app-folder-dialogs-2 { + background-color: rgba(0, 0, 0, 0.02); +} + +.transparent-app-folder-dialogs-3 { + background-color: rgba(0, 0, 0, 0.03); +} + +.transparent-app-folder-dialogs-4 { + background-color: rgba(0, 0, 0, 0.04); +} + +.transparent-app-folder-dialogs-5 { + background-color: rgba(0, 0, 0, 0.05); +} + +.transparent-app-folder-dialogs-6 { + background-color: rgba(0, 0, 0, 0.06); +} + +.transparent-app-folder-dialogs-7 { + background-color: rgba(0, 0, 0, 0.07); +} + +.transparent-app-folder-dialogs-8 { + background-color: rgba(0, 0, 0, 0.08); +} + +.transparent-app-folder-dialogs-9 { + background-color: rgba(0, 0, 0, 0.09); +} + +.transparent-app-folder-dialogs-10 { + background-color: rgba(0, 0, 0, 0.1); +} + +.transparent-app-folder-dialogs-11 { + background-color: rgba(0, 0, 0, 0.11); +} + +.transparent-app-folder-dialogs-12 { + background-color: rgba(0, 0, 0, 0.12); +} + +.transparent-app-folder-dialogs-13 { + background-color: rgba(0, 0, 0, 0.13); +} + +.transparent-app-folder-dialogs-14 { + background-color: rgba(0, 0, 0, 0.14); +} + +.transparent-app-folder-dialogs-15 { + background-color: rgba(0, 0, 0, 0.15); +} + +.transparent-app-folder-dialogs-16 { + background-color: rgba(0, 0, 0, 0.16); +} + +.transparent-app-folder-dialogs-17 { + background-color: rgba(0, 0, 0, 0.17); +} + +.transparent-app-folder-dialogs-18 { + background-color: rgba(0, 0, 0, 0.18); +} + +.transparent-app-folder-dialogs-19 { + background-color: rgba(0, 0, 0, 0.19); +} + +.transparent-app-folder-dialogs-20 { + background-color: rgba(0, 0, 0, 0.2); +} + +.transparent-app-folder-dialogs-21 { + background-color: rgba(0, 0, 0, 0.21); +} + +.transparent-app-folder-dialogs-22 { + background-color: rgba(0, 0, 0, 0.22); +} + +.transparent-app-folder-dialogs-23 { + background-color: rgba(0, 0, 0, 0.23); +} + +.transparent-app-folder-dialogs-24 { + background-color: rgba(0, 0, 0, 0.24); +} + +.transparent-app-folder-dialogs-25 { + background-color: rgba(0, 0, 0, 0.25); +} + +.transparent-app-folder-dialogs-26 { + background-color: rgba(0, 0, 0, 0.26); +} + +.transparent-app-folder-dialogs-27 { + background-color: rgba(0, 0, 0, 0.27); +} + +.transparent-app-folder-dialogs-28 { + background-color: rgba(0, 0, 0, 0.28); +} + +.transparent-app-folder-dialogs-29 { + background-color: rgba(0, 0, 0, 0.29); +} + +.transparent-app-folder-dialogs-30 { + background-color: rgba(0, 0, 0, 0.3); +} + +.transparent-app-folder-dialogs-31 { + background-color: rgba(0, 0, 0, 0.31); +} + +.transparent-app-folder-dialogs-32 { + background-color: rgba(0, 0, 0, 0.32); +} + +.transparent-app-folder-dialogs-33 { + background-color: rgba(0, 0, 0, 0.33); +} + +.transparent-app-folder-dialogs-34 { + background-color: rgba(0, 0, 0, 0.34); +} + +.transparent-app-folder-dialogs-35 { + background-color: rgba(0, 0, 0, 0.35); +} + +.transparent-app-folder-dialogs-36 { + background-color: rgba(0, 0, 0, 0.36); +} + +.transparent-app-folder-dialogs-37 { + background-color: rgba(0, 0, 0, 0.37); +} + +.transparent-app-folder-dialogs-38 { + background-color: rgba(0, 0, 0, 0.38); +} + +.transparent-app-folder-dialogs-39 { + background-color: rgba(0, 0, 0, 0.39); +} + +.transparent-app-folder-dialogs-40 { + background-color: rgba(0, 0, 0, 0.4); +} + +.transparent-app-folder-dialogs-41 { + background-color: rgba(0, 0, 0, 0.41); +} + +.transparent-app-folder-dialogs-42 { + background-color: rgba(0, 0, 0, 0.42); +} + +.transparent-app-folder-dialogs-43 { + background-color: rgba(0, 0, 0, 0.43); +} + +.transparent-app-folder-dialogs-44 { + background-color: rgba(0, 0, 0, 0.44); +} + +.transparent-app-folder-dialogs-45 { + background-color: rgba(0, 0, 0, 0.45); +} + +.transparent-app-folder-dialogs-46 { + background-color: rgba(0, 0, 0, 0.46); +} + +.transparent-app-folder-dialogs-47 { + background-color: rgba(0, 0, 0, 0.47); +} + +.transparent-app-folder-dialogs-48 { + background-color: rgba(0, 0, 0, 0.48); +} + +.transparent-app-folder-dialogs-49 { + background-color: rgba(0, 0, 0, 0.49); +} + +.transparent-app-folder-dialogs-50 { + background-color: rgba(0, 0, 0, 0.5); +} + +.transparent-app-folder-dialogs-51 { + background-color: rgba(0, 0, 0, 0.51); +} + +.transparent-app-folder-dialogs-52 { + background-color: rgba(0, 0, 0, 0.52); +} + +.transparent-app-folder-dialogs-53 { + background-color: rgba(0, 0, 0, 0.53); +} + +.transparent-app-folder-dialogs-54 { + background-color: rgba(0, 0, 0, 0.54); +} + +.transparent-app-folder-dialogs-55 { + background-color: rgba(0, 0, 0, 0.55); +} + +.transparent-app-folder-dialogs-56 { + background-color: rgba(0, 0, 0, 0.56); +} + +.transparent-app-folder-dialogs-57 { + background-color: rgba(0, 0, 0, 0.57); +} + +.transparent-app-folder-dialogs-58 { + background-color: rgba(0, 0, 0, 0.58); +} + +.transparent-app-folder-dialogs-59 { + background-color: rgba(0, 0, 0, 0.59); +} + +.transparent-app-folder-dialogs-60 { + background-color: rgba(0, 0, 0, 0.6); +} + +.transparent-app-folder-dialogs-61 { + background-color: rgba(0, 0, 0, 0.61); +} + +.transparent-app-folder-dialogs-62 { + background-color: rgba(0, 0, 0, 0.62); +} + +.transparent-app-folder-dialogs-63 { + background-color: rgba(0, 0, 0, 0.63); +} + +.transparent-app-folder-dialogs-64 { + background-color: rgba(0, 0, 0, 0.64); +} + +.transparent-app-folder-dialogs-65 { + background-color: rgba(0, 0, 0, 0.65); +} + +.transparent-app-folder-dialogs-66 { + background-color: rgba(0, 0, 0, 0.66); +} + +.transparent-app-folder-dialogs-67 { + background-color: rgba(0, 0, 0, 0.67); +} + +.transparent-app-folder-dialogs-68 { + background-color: rgba(0, 0, 0, 0.68); +} + +.transparent-app-folder-dialogs-69 { + background-color: rgba(0, 0, 0, 0.69); +} + +.transparent-app-folder-dialogs-70 { + background-color: rgba(0, 0, 0, 0.7); +} + +.transparent-app-folder-dialogs-71 { + background-color: rgba(0, 0, 0, 0.71); +} + +.transparent-app-folder-dialogs-72 { + background-color: rgba(0, 0, 0, 0.72); +} + +.transparent-app-folder-dialogs-73 { + background-color: rgba(0, 0, 0, 0.73); +} + +.transparent-app-folder-dialogs-74 { + background-color: rgba(0, 0, 0, 0.74); +} + +.transparent-app-folder-dialogs-75 { + background-color: rgba(0, 0, 0, 0.75); +} + +.transparent-app-folder-dialogs-76 { + background-color: rgba(0, 0, 0, 0.76); +} + +.transparent-app-folder-dialogs-77 { + background-color: rgba(0, 0, 0, 0.77); +} + +.transparent-app-folder-dialogs-78 { + background-color: rgba(0, 0, 0, 0.78); +} + +.transparent-app-folder-dialogs-79 { + background-color: rgba(0, 0, 0, 0.79); +} + +.transparent-app-folder-dialogs-80 { + background-color: rgba(0, 0, 0, 0.8); +} + +.transparent-app-folder-dialogs-81 { + background-color: rgba(0, 0, 0, 0.81); +} + +.transparent-app-folder-dialogs-82 { + background-color: rgba(0, 0, 0, 0.82); +} + +.transparent-app-folder-dialogs-83 { + background-color: rgba(0, 0, 0, 0.83); +} + +.transparent-app-folder-dialogs-84 { + background-color: rgba(0, 0, 0, 0.84); +} + +.transparent-app-folder-dialogs-85 { + background-color: rgba(0, 0, 0, 0.85); +} + +.transparent-app-folder-dialogs-86 { + background-color: rgba(0, 0, 0, 0.86); +} + +.transparent-app-folder-dialogs-87 { + background-color: rgba(0, 0, 0, 0.87); +} + +.transparent-app-folder-dialogs-88 { + background-color: rgba(0, 0, 0, 0.88); +} + +.transparent-app-folder-dialogs-89 { + background-color: rgba(0, 0, 0, 0.89); +} + +.transparent-app-folder-dialogs-90 { + background-color: rgba(0, 0, 0, 0.9); +} + +.transparent-app-folder-dialogs-91 { + background-color: rgba(0, 0, 0, 0.91); +} + +.transparent-app-folder-dialogs-92 { + background-color: rgba(0, 0, 0, 0.92); +} + +.transparent-app-folder-dialogs-93 { + background-color: rgba(0, 0, 0, 0.93); +} + +.transparent-app-folder-dialogs-94 { + background-color: rgba(0, 0, 0, 0.94); +} + +.transparent-app-folder-dialogs-95 { + background-color: rgba(0, 0, 0, 0.95); +} + +.transparent-app-folder-dialogs-96 { + background-color: rgba(0, 0, 0, 0.96); +} + +.transparent-app-folder-dialogs-97 { + background-color: rgba(0, 0, 0, 0.97); +} + +.transparent-app-folder-dialogs-98 { + background-color: rgba(0, 0, 0, 0.98); +} + +.transparent-app-folder-dialogs-99 { + background-color: rgba(0, 0, 0, 0.99); +} + +.transparent-app-folder-dialogs-100 { + background-color: rgba(0, 0, 0, 1.0); +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/utilities.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/utilities.js new file mode 100644 index 0000000..5dbc319 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/utilities.js @@ -0,0 +1,39 @@ +'use strict' + +const GLib = imports.gi.GLib; + +let clearTimeout, clearInterval; +clearInterval = clearTimeout = GLib.Source.remove; + +var setTimeout = function(func, delay, ...args) { + return GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { + func(...args); + return GLib.SOURCE_REMOVE; + }); +}; + +var setInterval = function(func, delay, ...args) { + return GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { + func(...args); + return GLib.SOURCE_CONTINUE; + }); +}; + +var easeOutQuad = function(t, begin, end, duration) { + t /= duration + return begin + (t * (2 - t) * (end - begin)) +}; + +var ease_property = function(object, property, begin, end, duration, update) { + let start = Date.now(); + GLib.timeout_add(GLib.PRIORITY_DEFAULT, update, () => { + let time = Date.now() - start; + if (time < duration) { + object[property] = easeOutQuad(time, begin, end, duration); + return GLib.SOURCE_CONTINUE; + } else { + object[property] = end; + return GLib.SOURCE_REMOVE; + } + }); +}; \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/window_list.js b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/window_list.js new file mode 100644 index 0000000..ca8708d --- /dev/null +++ b/src/gnome-ui/gnome-extensions/blur-my-shell@aunetx/window_list.js @@ -0,0 +1,128 @@ +'use strict'; + +const { St, Shell, Meta, Gio } = imports.gi; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Settings = Me.imports.settings; +const Utils = Me.imports.utilities; +const PaintSignals = Me.imports.paint_signals; + + +var WindowListBlur = class WindowListBlur { + constructor(connections, prefs) { + this.connections = connections; + this.prefs = prefs; + this.paint_signals = new PaintSignals.PaintSignals(connections); + this.blur_effects = []; + } + + enable() { + this._log("blurring window list"); + + // add the blur if window-list found + Main.layoutManager.uiGroup.get_children().forEach(child => this.try_blur(child)); + + // listen to new actors in `Main.layoutManager.uiGroup` and blur if window-list + this.connections.connect(Main.layoutManager.uiGroup, 'actor-added', (_, child) => this.try_blur(child)); + + // connect to overview + this.connections.connect(Main.overview, 'showing', () => { + this.hide(); + }); + this.connections.connect(Main.overview, 'hidden', () => { + this.show(); + }); + } + + try_blur(child) { + if (child.constructor.name == "WindowList" && child.style != "background:transparent;") { + this._log("found window list to blur"); + + child.style = "background:transparent;"; + let effect = new Shell.BlurEffect({ + name: 'window-list-blur', + sigma: this.prefs.SIGMA.get(), + brightness: this.prefs.BRIGHTNESS.get(), + mode: 1 + }); + child.add_effect(effect); + this.blur_effects.push(effect); + + // ! DIRTY PART: hack because `Shell.BlurEffect` does not repaint when shadows are under it + // ! this does not entirely fix this bug (shadows caused by windows still cause artefacts) + // ! but it prevents the shadows of the panel buttons to cause artefacts on the panel itself + // ! note: issue opened at https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 + + if (this.prefs.HACKS_LEVEL.get() == 1) { + this._log("window list hack level 1"); + + child._windowList.get_children().forEach(child => { + this.connections.connect(child, 'button-press-event', () => { effect.queue_repaint(); }); + }); + } else if (this.prefs.HACKS_LEVEL.get() == 2) { + this._log("window list hack level 2"); + + this.paint_signals.connect(child, effect); + } else { + this.paint_signals.disconnect_all(); + } + + // ! END OF DIRTY PART + + child._windowList.get_children().forEach(window => this.blur_window_button(window)); + this.connections.connect(child._windowList, 'actor-added', (_, window) => { + this.blur_window_button(window); + }) + } + } + + blur_window_button(window) { + window.get_child_at_index(0).style = "box-shadow:none;background-color:rgba(0,0,0,0.2);border-radius:5px;"; + } + + try_remove_blur(child) { + if (child.constructor.name == "WindowList" && child.style == "background:transparent;") { + child.style = null; + child.remove_effect_by_name('window-list-blur'); + + child._windowList.get_children().forEach(child => { + child.get_child_at_index(0).style = null; + }); + } + } + + set_sigma(s) { + this.blur_effects.forEach(effect => { + effect.sigma = s; + }); + } + + set_brightness(b) { + this.blur_effects.forEach(effect => { + effect.brightness = b; + }); + } + + hide() { + this.set_sigma(0); + } + + show() { + this.set_sigma(this.prefs.SIGMA.get()); + } + + disable() { + this._log("removing blur from window list"); + + Main.layoutManager.uiGroup.get_children().forEach(child => this.try_remove_blur(child)) + + this.blur_effects = []; + this.connections.disconnect_all(); + } + + _log(str) { + if (this.prefs.DEBUG.get()) + log(`[Blur my Shell] ${str}`) + } +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING new file mode 100644 index 0000000..8d61b15 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/COPYING @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/README.md b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/README.md new file mode 100644 index 0000000..5000de1 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/README.md @@ -0,0 +1,189 @@ +

      + +

      +

      + + + + +

      + +![](media/design/png/dtp-main-p2.png) + +### Introduction + +Dash to Panel is an icon taskbar for Gnome Shell. This extension moves the dash into the gnome main panel so that the application launchers and system tray are combined into a single panel, similar to that found in KDE Plasma and Windows 7+. A separate dock is no longer needed for easy access to running and favorited applications. + +Beyond that, just about every aspect of the panel is fully customizable. From positioning and scaling panel elements to running indicators to multi-monitor display, to window previews and even intellihide, Dash to Panel has everything you need to make your workspace feel like home. + +### Features + +|Customizable appearance| +|:-----:| +|![screenshot](media/design/gif/customizable.gif)| +|Hide & show panel elements and set their positions, sizes & colors| + +## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Customizable running indicators
      MetroCiliora/Dashes
      CilioraSquares/Segmented
      DashesDots/Solid
      Set position, style, weight & color of running indicators to easily and quickly identify focused and unfocused applications
      + +## + +|Live Previews on Hover| +|:-----:| +|![screenshot](media/design/gif/previews.gif)| +|Hover over the launcher icon for an open application to get a live window preview| + +## +|Launch by Number| +|:-----:| +|![](media/design/png/indicators-num.png.png)| +|Optionally launch your favorite applications via keyboard| + +## + +|Panel Intellihide| +|:-----:| +|![Intellihide](media/design/gif/Intellihide.gif)| +|Hide and reveal the panel according to your set preferences| + +## +|Additional Features|Feature Implemented| +|:-----|:-----:| +|Add "Show Desktop" button to panel|![](media/design/png/done.png)| +|Isolate running apps by workspaces and/or monitors|![](media/design/png/done.png)| +|Custom click behaviors (launch new window, cycle open windows, minimize, etc)|![](media/design/png/done.png)| +|Integrate native Gnome appMenu into right-click secondary menu|![](media/design/png/done.png)| +|Multi-monitor support|![](media/design/png/done.png)| +|Dynamic transparency|![](media/design/png/done.png)| +|Ungroup application windows|![](media/design/png/done.png)| +|Export and import settings|![](media/design/png/done.png)| +## + +### Installation + +**To install the most recent official release: +[Visit Dash-to-Panel at GNOME Extensions](https://extensions.gnome.org/extension/1160/dash-to-panel/)** + +To install a development version from source, please see the [Installation wiki page](https://github.com/jderose9/dash-to-panel/wiki/Installation). + +## +### FAQ + +How do I customize the panel? [See the Wiki](https://github.com/home-sweet-gnome/dash-to-panel/wiki/Enable-and-Customize#customize-it) + +How do I embed my bottom left notification drawer into the panel like a system tray? [Top Icons Plus](https://extensions.gnome.org/extension/2311/topicons-plus) or [(K)StatusNotifierItem/AppIndicator Support](https://extensions.gnome.org/extension/615/appindicator-support) + +How do I add a traditional start menu? [Arc Menu](https://extensions.gnome.org/extension/3628/arcmenu/) + +How do I disable the hot corner? [No Topleft Hot Corner](https://extensions.gnome.org/extension/118/no-topleft-hot-corner) + +How do I move the notifications to somewhere other than the top center? [Panel OSD](https://extensions.gnome.org/extension/708/panel-osd) + +How do I display Minimize & Maximize buttons? In the Tweak Tool application, turn on `Windows > Titlebar Buttons > Minimize & Maximize`. + +How do I reset the extension to its default settings? `dconf reset -f /org/gnome/shell/extensions/dash-to-panel/`. + +## +### Themes +While this extension works well with most popular Gnome Shell themes, the following themes are known to have explicitly added custom styles for this extension: +- [Ciliora Tertia](https://github.com/zagortenay333/ciliora-tertia-shell) / [Ciliora Secunda](https://github.com/zagortenay333/ciliora-secunda-shell) +- [Plano](https://github.com/lassekongo83/plano-theme) + + +## +### Compatibility + +This extension has been tested with Gnome 3.18+. + +This extension manipulates the Gnome Main Panel, aka Top Bar. So, most other extensions which operate on the top bar should be compatible. + +## +### Volunteers needed! + +This extension could be even better with your help! Any items in the issue tracker labelled `help wanted` or `good first issue` are up for grabs. For more info, see the [Contributing wiki page](https://github.com/jderose9/dash-to-panel/wiki/Contributing). + +## +### Credits + +This extension is developed and maintained by [@jderose9](https://github.com/jderose9) and [@charlesg99](https://github.com/charlesg99). + +Significant portions of code in this extension were derived from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html). + +Additional credits: This extension leverages the work for [ZorinOS Taskbar](https://github.com/ZorinOS/zorin-taskbar) (used in [ZorinOS](https://zorinos.com/)) to show window previews and allow the dash from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html) to be embedded in the Gnome main panel. +Code to set anchor position taken from [Thoma5/gnome-shell-extension-bottompanel](https://github.com/Thoma5/gnome-shell-extension-bottompanel). +Pattern for moving panel contents based on [Frippery Move Clock](http://frippery.org/extensions/) by R M Yorston. +Ideas for recursing child actors and assigning inline styles are based on code from the extension [StatusAreaHorizontalSpacing](https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension). +## + +#### Thanks to the following people for contributing via pull requests: + +- @franglais125 for launching apps by number (w/ overlay), bug fixes, and issue support +- @LinxGem33 and @sbarrett322 for artwork, logos, screenshots and design effort +- @dziku1337 for peek mode in window previews +- @robrobinbin for configuring appMenu on/off in the panel +- @MartinPL for toggling favorites on/off in panel +- @jackwickham for thumbnail middle and right click actions +- @abakkk for centering the taskbar icons in the panel, and animated taskbar hovering +- @quasoft for changing of font weight of ungrouped application titles +- @jordanribera for using icon's dominant color as running indicator color +- @tper0700 for dynamically building context menu based on system capabilities +- @levacic for configurable minimized application title font color +- @l3nn4rt for toggling workspace switch popup +- @hlechner for adjustable show desktop line color and window preview icon size +- @ArtyomZorin for animated urgent icons +- @jvpessoa10 for additional click window cycle options +- @marksvc for assigning percent of display for panel length +- @philippun1 for GNOME 40 support :rocket: + +#### Bug Fixes: +@imrvelj, @Teslator, @bil-elmoussaoui, @brandon-schumann, @sw9, @rockon999 , @lexruee, @3v1n0, @freeroot, @moqmar, @ArtyomZorin, @lkc0987, @saibotk, @vanillajonathan, @Zkdc, @leebickmtu, @l3nn4rt, @Melix19, @Aikatsui, @melix99, @kyrillzorin, @oneshadab, , @CorvetteCole + +#### Documentation Improvements: +@BoQsc, @zakkak, @dandv + +#### Translations: +@frnogueira / @victorwpbastos (pt_BR), @zeten30 (cs), @franglais125 / @calotam / @oeramirez (es), @LaurentTreguier / @SolarLiner (fr), @elsieholmes (uk), @hosiet (zh\_CN), @jonnius / @linuxr01 (de), @urbalazs / @pappfer (hu), @crayxt (kk), @pkomur / @MartinPL / @alex4401 (pl), @AlexGluck / @GoodNike / @rjapolov / @vantu5z (ru), @sicklylife-jp / @ryonakano (ja), @oltulu / @TeknoMobil / @daenney (tr), @sbadux / @kowalski7cc / @l3nn4rt (it), @OriginCode / @pan93412 (zh\_TW), @ojn (sv), @frandieguez (gl) + + +## +### License & Terms ![](media/design/png/copyleft-16.png) + +Dash to Panel is available under the terms of the GPL-v2 or later license See [`COPYING`](https://github.com/jderose9/dash-to-panel/blob/master/COPYING) for details. + +![](https://img.shields.io/badge/Language-JavaScript-yellow.svg) ![](https://img.shields.io/badge/Licence-GPL--2.0-blue.svg) diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui new file mode 100644 index 0000000..ed7ef90 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/Settings.ui @@ -0,0 +1,7508 @@ + + + + + + True + False + vertical + 1 + 1 + + + True + True + False + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Animation type + 0 + + + + + True + False + center + + Simple + Ripple + Plank + + + + + + + + + + True + True + False + + + True + False + 12 + 12 + 12 + 12 + 24 + 32 + + + True + False + 12 + Duration + True + 0 + end + + 0 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_duration_adjustment + 0 + 0 + right + True + + 0 + 1 + + + + + + True + False + Rotation + 0 + end + + 1 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_rotation_adjustment + 0 + 0 + right + True + + 1 + 1 + + + + + + True + False + Travel + 0 + end + + 2 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_travel_adjustment + 0 + 0 + right + True + + 2 + 1 + + + + + + True + False + Zoom + 0 + end + + 3 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_zoom_adjustment + 0 + 0 + right + True + + 3 + 1 + + + + + + True + False + Convexity + 0 + end + + 4 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_convexity_adjustment + 1 + 1 + right + True + + 4 + 1 + + + + + + True + False + Extent + 0 + end + + 5 + 0 + + + + + + True + True + end + True + animate_appicon_hover_options_extent_adjustment + 0 + 0 + right + True + + 5 + 1 + + + + + + + + + + 100 + 1 + 10 + + + 0 + 300 + 1 + 5 + + + -30 + 30 + 1 + 5 + + + 0 + 100 + 1 + 5 + + + 100 + 250 + 1 + 5 + + + 0 + 3 + 0.1 + 1 + + + 1 + 10 + 0.1 + 1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + True + Nothing yet! + True + + + + + + + + + + + True + False + 12 + 12 + 12 + 12 + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + When set to minimize, double clicking minimizes all the windows of the application. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Shift+Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Toggle single / Cycle multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Middle-Click. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Middle-Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Shift+Middle-Click. + True + 40 + 0 + + + 1 + 0 + + + + + + True + False + True + Shift+Middle-Click action + 0 + + 0 + 0 + + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + 0 + 1 + 2 + + + + + + + + + + + + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + center + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Integrate <i>AppMenu</i> items + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + 100 + 80 + True + True + + + True + False + center + 12 + 12 + 12 + 12 + 32 + + + True + False + True + <i>Show Details</i> menu item + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + 10 + 1 + 5 + + + 5 + 1 + 5 + + + 50 + 9999 + 25 + 100 + + + 5 + 100 + 5 + 5 + + + True + False + 12 + 12 + vertical + 1 + 1 + + + True + False + 12 + 12 + 12 + 12 + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Highlight focused application + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 8 + + + True + False + True + Icon dominant color + 0 + + 0 + 0 + + + + + + True + True + end + center + + + + + True + False + True + Custom color + 0 + + 1 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + False + True + Highlight opacity + 0 + + 2 + 0 + + + + + + True + True + end + 5 + focus_highlight_opacity_adjustment + 5 + + 2 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Indicator size (px) + 0 + + 0 + 0 + + + + + + True + True + end + 0 + dot_size_adjustment + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Indicator color - Icon Dominant + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + vertical + + + True + False + + + True + False + True + Indicator color - Override Theme + 0 + + + + + True + True + end + center + + + + + + + True + False + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 1 window open (or ungrouped) + 0 + + 0 + 0 + + + + + + True + False + end + + + Apply to all + True + True + True + + + + + True + True + True + end + + + + 0 + 1 + + + + + + True + False + True + 2 windows open + 0 + + 1 + 0 + + + + + + True + False + True + 3 windows open + 0 + + 2 + 0 + + + + + + True + False + True + 4+ windows open + 0 + + 3 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + True + True + end + + 2 + 1 + + + + + + True + True + True + end + + 3 + 1 + + + + + + + + True + False + vertical + + + True + False + 12 + + + True + False + True + Use different for unfocused + 0 + + + + + True + True + end + center + + + + + + + True + False + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 1 window open (or ungrouped) + 0 + + 0 + 0 + + + + + + True + False + end + + + Apply to all + True + True + True + + + + + True + True + True + end + + + + 0 + 1 + + + + + + True + False + True + 2 windows open + 0 + + 1 + 0 + + + + + + True + True + True + end + + 1 + 1 + + + + + + True + False + True + 3 windows open + 0 + + 2 + 0 + + + + + + True + True + True + end + + 2 + 1 + + + + + + True + False + True + 4+ windows open + 0 + + 3 + 0 + + + + + + True + True + True + end + + 3 + 1 + + + + + + + + + + + + + + + + + + 6 + 24 + 1 + 100 + + + 1000 + 10 + 100 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 0 + group_apps_label_font_size_adjustment + True + + 0 + 1 + + + + + + True + False + True + Font size (px) of the application titles (default is 14) + True + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font weight of application titles + 0 + + 0 + 0 + + + + + + True + False + center + + inherit from theme + normal + lighter + bold + bolder + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font color of the application titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Font color of the minimized application titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Maximum width (px) of the application titles (default is 160) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + group_apps_label_max_width_adjustment + True + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use a fixed width for the application titles + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Display running indicators on unfocused applications + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use the favorite icons as application launchers + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + 10 + 2000 + 10 + 100 + + + 10 + 4000 + 10 + 100 + + + 10000 + 10 + 100 + + + 1 + 9990 + 10 + 100 + + + 1 + 5000 + 10 + 100 + + + True + False + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + True + + + True + False + True + Only hide the panel when it is obstructed by windows + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 4 + + + True + False + True + The panel hides from + 0 + + 0 + 0 + + + + + + True + False + center + + All windows + Focused windows + Maximized windows + + + 0 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Require pressure at the edge of the screen to reveal the panel + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 4 + + + True + False + True + Required pressure threshold (px) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_pressure_threshold_adjustment + True + + 0 + 1 + + + + + + True + False + True + Required pressure timeout (ms) + True + 0 + + 1 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_pressure_time_adjustment + True + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Allow the panel to be revealed while in fullscreen mode + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Only hide secondary panels (requires multi-monitors option) + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>i + + 0 + 1 + 2 + + + + + + True + False + True + Keyboard shortcut to reveal and hold the panel + 0 + + 0 + 0 + + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Hide and reveal animation duration (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + intellihide_animation_time_adjustment + True + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Delay before hiding the panel (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 10 + intellihide_close_delay_adjustment + True + 10 + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Delay before enabling intellihide on start (ms) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 10 + intellihide_enable_hide_delay_adjustment + True + 10 + + 0 + 1 + + + + + + + + + + + + + + 9999 + 25 + 100 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + 255 + 10 + 25 + + + 1000 + 10 + 50 + + + 50 + 500 + 10 + 50 + + + 100 + 5 + 10 + + + 50 + 1 + 5 + + + 100 + 800 + 10 + 50 + + + 9999 + 25 + 100 + + + 6 + 24 + 1 + 100 + + + 8 + 48 + 1 + 100 + + + True + True + 460 + 480 + + + True + False + True + True + natural + natural + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 0 + preview_timeout_adjustment + True + + 0 + 1 + + + + + + True + False + True + Time (ms) before showing (400 is default) + True + 0 + + 0 + 0 + + + + + + True + False + True + Animation time (ms) + 0 + + 2 + 0 + + + + + + True + True + end + 4 + 0 + preview_animation_time_adjustment + True + + 2 + 1 + + + + + + True + False + vertical + + + True + False + True + Time (ms) before hiding (100 is default) + 0 + + + + + True + True + False + 12 + 4 + + + 4 + True + False + start + 4 + Immediate on application icon click + True + + + + + + 1 + 0 + + + + + + True + True + end + center + 4 + 25 + leave_timeout_adjustment + True + 25 + + 1 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Middle click on the preview to close the window + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Window previews preferred size (px) + True + 0 + + 0 + 0 + 2 + + + + + + True + True + end + 4 + 100 + preview_size_adjustment + True + 100 + + + + + True + False + True + Window previews aspect ratio Y (height) + True + 0 + + 2 + 0 + + + + + + True + False + True + Window previews padding (px) + True + 0 + + 3 + 0 + + + + + + True + True + end + 4 + 50 + preview_padding_adjustment + True + 50 + + 3 + 1 + + + + + + True + False + end + 2 + True + + + True + False + end + center + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + + + + + + Fixed + True + True + True + end + + + + 1 + 1 + + + + + + True + False + True + Window previews aspect ratio X (width) + True + 0 + + 1 + 0 + + + + + + True + False + end + 2 + True + + + True + False + end + center + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + + + + + + Fixed + True + True + True + end + + + + 2 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use custom opacity for the previews background + True + 0 + + 0 + 0 + + + + + + True + False + True + If disabled, the previews background have the same opacity as the panel + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + True + False + 8 + + + True + True + end + center + + + + + True + True + end + center + 5 + preview_opacity_adjustment + 5 + + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Close button and header position + 0 + + + + + True + False + end + 32 + + + Bottom + True + True + False + center + center + True + + + + + + Top + True + True + False + center + center + preview_title_position_bottom_button + + + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Display window preview headers + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 32 + + + True + False + 8 + + + True + True + end + center + + + + + True + True + end + 4 + 6 + preview_custom_icon_size_adjustment + True + 6 + + + + 0 + 1 + + + + + + True + False + True + Icon size (px) of the window preview + True + 0 + + 1 + 0 + + + + + + True + False + True + If disabled, the previews icon size will be based on headerbar size + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 1 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + True + end + 4 + 6 + preview_title_font_size_adjustment + True + 6 + + 0 + 1 + + + + + + True + False + True + Font size (px) of the preview titles + True + 0 + + 0 + 0 + + + + + 2 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Font weight of the preview titles + 0 + + 0 + 0 + + + + + + True + False + end + center + + inherit from theme + normal + lighter + bold + bolder + + + 0 + 1 + + + + + 3 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Font color of the preview titles + True + 0 + + 0 + 0 + + + + + + True + True + True + end + + 0 + 1 + + + + + 4 + 0 + 2 + + + + + + + + + + True + True + 6 + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable window peeking + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + When hovering over a window preview for some time, the window gets distinguished. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Enter window peeking mode timeout (ms) + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 50 + enter_peek_mode_timeout_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Time of inactivity while hovering over a window preview needed to enter the window peeking mode. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 2 + 0 + 2 + + + + + + True + False + 12 + 32 + + + True + False + True + Window peeking mode opacity + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 0 + peek_mode_opacity_adjustment + True + + 0 + 1 + + + + + + True + False + True + All windows except for the peeked one have their opacity set to the same value. + True + 40 + 0 + + + 1 + 0 + 2 + + + + + 3 + 0 + 2 + + + + + + + + + + + + + + 2000 + 10 + 50 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + 4 + 50 + scroll_icon_options_delay_adjustment + True + 50 + + 0 + 1 + 2 + + + + + + True + False + True + Delay between mouse scroll events (ms) + True + 0 + + 0 + 0 + + + + + + True + False + True + Use this value to limit the number of captured mouse scroll events. + True + 0 + + + 1 + 0 + + + + + + + + + + + + 2000 + 10 + 50 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + 4 + 50 + scroll_panel_options_delay_adjustment + True + 50 + + 0 + 1 + 2 + + + + + + True + False + True + Delay between mouse scroll events (ms) + True + 0 + + 0 + 0 + + + + + + True + False + True + Use this value to limit the number of captured mouse scroll events. + True + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show popup when changing workspace + True + 0 + + 0 + 0 + + + + + + True + False + True + This affects workspace popup when scrolling on the panel only. + True + 0 + + + 1 + 0 + + + + + + True + True + end + center + + 0 + 1 + 2 + + + + + + + + + + + + 10000 + 250 + 1000 + + + True + False + 12 + 12 + 12 + 12 + vertical + 1 + 1 + + + True + False + 0 + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Super + Super + Alt + + + 0 + 1 + 2 + + + + + + True + False + True + Hotkeys prefix + 0 + + 0 + 0 + + + + + + True + False + Hotkeys will either be Super+Number or Super+Alt+Num + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Never + Show temporarily + Always visible + + + 0 + 1 + 2 + + + + + + True + False + True + Number overlay + 0 + + 0 + 0 + + + + + + True + False + Temporarily show the application numbers over the icons when using the hotkeys. + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + True + 6 + 32 + + + True + True + end + shortcut_time_adjustment + + 0 + 1 + + + + + + True + False + True + Hide timeout (ms) + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>q + + 0 + 1 + 2 + + + + + + True + False + True + Shortcut to show the overlay for 2 seconds + 0 + + 0 + 0 + + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show window previews on hotkey + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + 2 + + + + + + True + False + True + Show previews when the application have multiple instances + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + end + center + + Number row + Numeric keypad + Both + + + 0 + 1 + 2 + + + + + + True + False + True + Hotkeys are activated with + 0 + + 0 + 0 + + + + + + True + False + Select which keyboard number keys are used to activate the hotkeys + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + + + + + 100 + 1 + 10 + + + True + False + vertical + 1 + 1 + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Current Show Applications icon + True + 0 + + 0 + 0 + + + + + + 32 + 32 + True + False + end + gtk-missing-image + 32 + + 0 + 1 + + + + + + 140 + True + + 1 + 1 + + + + + + True + False + True + Custom Show Applications image icon + True + 0 + + 1 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + True + 6 + 32 + + + True + True + end + 0 + show_applications_side_padding_adjustment + + 0 + 1 + + + + + + True + False + True + Show Applications icon side padding (px) + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Override escape key and return to desktop + True + 0 + + 0 + 0 + + + + + + + + + + 5000 + 10 + 100 + + + 5000 + 10 + 100 + + + 1 + 40 + 1 + 10 + + + True + False + vertical + + + True + False + none + 1 + 1 + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_width_adjustment + True + 1 + + 0 + 1 + + + + + + True + False + True + Override Show Desktop line color + 0 + + 1 + 0 + + + + + + True + False + 12 + end + + + True + True + True + end + True + + + + + True + True + end + center + + + + 1 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Reveal the desktop when hovering the Show Desktop button + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 4 + + + True + False + True + Delay before revealing the desktop (ms) + True + 0 + + 0 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_delay_adjustment + True + 1 + + 0 + 1 + + + + + + True + False + True + Fade duration (ms) + True + 0 + + 1 + 0 + + + + + + True + True + end + 4 + 1 + show_showdesktop_time_adjustment + True + 1 + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + 0.33 + 1 + 0.01 + 0.1 + + + 2000 + 1 + 10 + + + 200 + 1 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + 100 + 5 + 10 + + + True + False + vertical + 1 + 1 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + + + True + False + True + The panel background opacity is affected by + 0 + + 0 + 0 + + + + + + True + False + center + + All windows + Focused windows + Maximized windows + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 50 + trans_distance_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Change opacity when a window gets closer than (px) + True + 0 + + 0 + 0 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + + + True + False + 12 + Change opacity to (%) + True + 0 + + + + + True + True + end + 0 + trans_opacity_min_adjustment + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + 4 + 50 + trans_anim_time_adjustment + True + 50 + + 0 + 1 + + + + + + True + False + True + Opacity change animation duration (ms) + True + 0 + + 0 + 0 + + + + + + + + + + + + 0.33 + 1 + 0.01 + 0.1 + + + 0.33 + 1 + 0.01 + 0.1 + + + True + True + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + 32 + + + True + False + True + Display the main panel on + 0 + + 0 + 0 + + + + + + True + False + center + + 0 + 1 + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Display panels on all monitors + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Panel Intellihide + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + 2 + + + + + + True + False + True + Hide and reveal the panel according to preferences + True + 40 + 0 + + + 1 + 0 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + + + True + False + True + Order and positions on monitor + 0 + + 0 + 0 + + + + + + True + False + center + + 0 + 1 + + + + + + Apply changes to all monitors + True + True + False + 12 + 4 + 4 + + 1 + 0 + 2 + + + + + + True + False + 6 + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 6 + 6 + 12 + 32 + + + True + True + baseline + True + panel_size_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + True + False + Panel thickness (default is 48) + 0 + + 1 + 0 + + + + + + True + False + Panel length (%) (default is 100) + 0 + + 2 + 0 + + + + + + True + True + baseline + True + panel_length_adjustment + 0 + 0 + right + True + + 2 + 1 + + + + + + True + False + center + + Start + Middle + End + + + 3 + 1 + + + + + + True + False + Anchor + 0 + + 3 + 0 + + + + + + True + False + True + Panel screen position + 0 + + 0 + 0 + + + + + + True + False + 32 + + + Bottom + True + True + False + center + center + + True + + + + + + Top + True + True + False + center + center + + position_bottom_button + + + + + + Left + True + True + False + center + center + + position_bottom_button + + + + + + Right + True + True + False + center + center + + position_bottom_button + + + + 0 + 1 + + + + + + + 1 + 0 + + + + + + + + + + 2 + 0 + 2 + + + + + + + + True + False + 6 + none + + + + + + + + + + + + + + + + True + False + Position + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 12 + 32 + + + True + False + App Icon Margin (default is 8) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + appicon_margin_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 32 + + + True + False + App Icon Padding (default is 4) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + appicon_padding_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator position + 0 + + + + + True + False + 32 + + + Bottom + True + True + False + center + True + + + + + + Top + True + True + False + center + dots_bottom_button + + + + + + Left + True + True + False + center + dots_bottom_button + + + + + + Right + True + True + False + center + dots_bottom_button + + + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator style (Focused app) + 0 + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + False + end + center + + Dots + Squares + Dashes + Segmented + Solid + Ciliora + Metro + + + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Running indicator style (Unfocused apps) + 0 + + + + + True + False + end + center + + Dots + Squares + Dashes + Segmented + Solid + Ciliora + Metro + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme background color + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + end + + + + + True + True + end + center + + + + 0 + 1 + + + + + + + + + + True + True + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme background opacity + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 12 + 6 + + + True + False + True + Panel background opacity (%) + True + 0 + + 0 + 0 + + + + + + True + True + end + center + 0 + trans_opacity_adjustment + + 0 + 1 + + + + + + True + False + True + vertical + + + True + False + True + Dynamic background opacity + True + 0 + + + + + True + False + True + Change opacity when a window gets close to the panel + True + 40 + 0 + + + + + 1 + 0 + + + + + + True + False + end + center + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme gradient + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + 12 + 12 + 6 + + + True + False + True + Gradient top color and opacity (%) + 0 + + 0 + 0 + + + + + + True + False + True + Gradient bottom color and opacity (%) + 0 + + 1 + 0 + + + + + + True + False + 6 + + + True + True + True + + + + + True + True + end + center + 0 + trans_gradient_opacity1_adjustment + + + + 0 + 1 + + + + + + True + False + 6 + + + True + True + True + + + + + True + True + end + center + 0 + trans_gradient_opacity2_adjustment + + + + 1 + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Animate hovering app icons + 0 + + 2 + 0 + + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 2 + 1 + + + + + + + + + + + + + + + + + + True + False + Style + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Show favorite applications + 0 + + 0 + 0 + + + + + + True + False + True + Show running applications + 0 + + 2 + 0 + + + + + + True + True + end + center + + 2 + 1 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Show favorite applications on secondary panels + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + + 0 + 1 + 2 + + + + + + True + False + True + Show <i>AppMenu</i> button + True + 0 + + 0 + 0 + + + + + + True + False + True + Top Bar > Show App Menu must be enabled in Tweak Tool + True + True + 0 + + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + + + + + + True + False + True + Show window previews on hover + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Show tooltip on hover + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Isolate Workspaces + True + 0 + + 0 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Isolate monitors + True + 0 + + 1 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Click empty space to close overview + True + 0 + + 0 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Disable show overview on startup + True + 0 + + 0 + 0 + + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Ungroup applications + True + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + + + + + + + + + + + + + + + + + + + + + True + False + Behavior + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behaviour when clicking on the icon of a running application. + True + 0 + + + 1 + 0 + + + + + + True + False + True + Click action + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + + + True + False + center + + Cycle windows + minimize + Cycle through windows + Toggle single / Preview multiple + Toggle windows + Raise windows + Launch new instance + + + + + 0 + 1 + 2 + + + + + + + + + + + + + + + + + False + 0 + + + True + False + 12 + 12 + 12 + 12 + 16 + 6 + + + True + False + vertical + + + True + False + True + Scroll panel action + 0 + + + + + True + False + True + Behavior when mouse scrolling over the panel. + True + 0 + + + + + 0 + 0 + + + + + + True + False + vertical + + + True + False + True + Scroll icon action + 0 + + + + + True + False + True + Behavior when mouse scrolling over an application icon. + True + 0 + + + + + 1 + 0 + + + + + + True + True + True + end + center + + + True + False + emblem-system-symbolic + + + + + 0 + 1 + + + + + + True + False + center + True + + Do nothing + Switch workspace + Cycle windows + Change volume + + + 0 + 2 + + + + + + True + False + center + True + + Do nothing + Cycle windows + Same as panel + + + 1 + 2 + + + + + + True + True + True + end + center + + + True + False + emblem-system-symbolic + + + + + 1 + 1 + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl. + True + True + 0 + + + 1 + 0 + + + + + + True + False + True + Use hotkeys to activate apps + 0 + + 0 + 0 + + + + + + True + False + 6 + + + True + True + True + center + center + + + True + False + emblem-system-symbolic + + + + + + + + True + True + end + center + + + + 0 + 1 + 2 + + + + + + + + + + + + + + + + + + + + + True + False + Action + + + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + + + True + True + none + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 12 + 32 + + + True + False + Tray Font Size (0 = theme default) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + tray_size_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + True + False + LeftBox Font Size (0 = theme default) + 0 + + 1 + 0 + + + + + + True + True + baseline + True + leftbox_size_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + Tray Item Padding (-1 = theme default) + 0 + + 0 + 0 + + + + + + True + True + baseline + True + tray_padding_adjustment + 0 + 0 + right + True + + + 0 + 1 + + + + + + True + False + Status Icon Padding (-1 = theme default) + 0 + + 1 + 0 + + + + + + True + True + baseline + True + statusicon_padding_adjustment + 0 + 0 + right + True + + + 1 + 1 + + + + + + True + False + LeftBox Padding (-1 = theme default) + 0 + + 2 + 0 + + + + + + True + True + baseline + True + leftbox_padding_adjustment + 0 + 0 + right + True + + + 2 + 1 + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Animate switching applications + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + True + end + center + + 1 + 1 + + + + + + True + False + True + Animate launching new windows + 0 + + 1 + 0 + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Keep original gnome-shell dash (overview) + 0 + + 0 + 0 + + + + + + True + True + end + center + + 0 + 1 + + + + + + True + False + True + Force Activities hot corner on primary monitor + 0 + + 3 + 0 + + + + + + True + True + end + center + + 3 + 1 + + + + + + True + False + True + Activate panel menu buttons (e.g. date menu) on click only + 0 + + 2 + 0 + + + + + + True + True + end + center + + 2 + 1 + + + + + + True + False + True + Keep original gnome-shell top panel + 0 + + 1 + 0 + + + + + + True + True + end + center + + 1 + 1 + + + + + + + + + + + + + + + + + True + False + 0 + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 20 + 32 + + + True + False + True + App icon secondary (right-click) menu + 0 + + 0 + 0 + + + + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + 0 + 1 + + + + + + + + + + + + + + + + + Advanced Options + False + True + True + start + + + + + + + + + True + False + center + Fine-Tune + + + + + + + False + 24 + 24 + 24 + 24 + True + True + vertical + 5 + + + True + False + vertical + + + True + False + <b>Dash-to-Panel</b> + True + + + + + True + False + center + + + True + False + end + version: + + + + + True + False + start + ... + + + + + + + GitHub + True + True + True + center + https://github.com/jderose9/dash-to-panel + + + + + + + False + 20 + 0 + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + 12 + True + Use the buttons below to create a settings file from your current preferences that can be imported on a different machine. + True + 0 + + + 1 + 0 + 2 + + + + + + True + False + start + Export and import settings + + 0 + 0 + 2 + + + + + + Export to file + True + True + True + + 2 + 0 + + + + + + Import from file + True + True + True + + 2 + 1 + + + + + + + + + + + + + + + + + True + True + end + <span size="small">This program comes with ABSOLUTELY NO WARRANTY. See the <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2 or later</a> for details.</span> + True + center + True + + + + + + + + + True + False + About + + + + diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js new file mode 100644 index 0000000..e79eae8 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/appIcons.js @@ -0,0 +1,1964 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + + +const Clutter = imports.gi.Clutter; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const Signals = imports.signals; +const Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; + +const Config = imports.misc.config; +const AppDisplay = imports.ui.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Util = imports.misc.util; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; +const Panel = Me.imports.panel; +const PanelSettings = Me.imports.panelSettings; +const Taskbar = Me.imports.taskbar; +const Progress = Me.imports.progress; +const _ = imports.gettext.domain(Utils.TRANSLATION_DOMAIN).gettext; + +//timeout names +const T1 = 'setStyleTimeout'; +const T2 = 'mouseScrollTimeout'; +const T3 = 'showDotsTimeout'; +const T4 = 'overviewWindowDragEndTimeout'; +const T5 = 'switchWorkspaceTimeout'; +const T6 = 'displayProperIndicatorTimeout'; + +//right padding defined for .overview-label in stylesheet.css +const TITLE_RIGHT_PADDING = 8; + +let LABEL_GAP = 5; +let MAX_INDICATORS = 4; +var DEFAULT_PADDING_SIZE = 4; + +let DOT_STYLE = { + DOTS: "DOTS", + SQUARES: "SQUARES", + DASHES: "DASHES", + SEGMENTED: "SEGMENTED", + CILIORA: "CILIORA", + METRO: "METRO", + SOLID: "SOLID" +} + +let DOT_POSITION = { + TOP: "TOP", + BOTTOM: "BOTTOM", + LEFT: 'LEFT', + RIGHT: 'RIGHT' +} + +let recentlyClickedAppLoopId = 0; +let recentlyClickedApp = null; +let recentlyClickedAppWindows = null; +let recentlyClickedAppIndex = 0; +let recentlyClickedAppMonitorIndex; + +let tracker = Shell.WindowTracker.get_default(); +let menuRedisplayFunc = !!(AppDisplay.AppMenu || AppDisplay.AppIconMenu).prototype._rebuildMenu ? '_rebuildMenu' : '_redisplay'; + +/** + * Extend AppIcon + * + * - Apply a css class based on the number of windows of each application (#N); + * - Draw a dot for each window of the application based on the default "dot" style which is hidden (#N); + * a class of the form "running#N" is applied to the AppWellIcon actor. + * like the original .running one. + * - add a .focused style to the focused app + * - Customize click actions. + * - Update minimization animation target + * + */ + +var taskbarAppIcon = Utils.defineClass({ + Name: 'DashToPanel.TaskbarAppIcon', + Extends: AppDisplay.AppIcon, + ParentConstrParams: [[0, 'app'], [2]], + + _init: function(appInfo, panel, iconParams, previewMenu, iconAnimator) { + this.dtpPanel = panel; + this._nWindows = 0; + this.window = appInfo.window; + this.isLauncher = appInfo.isLauncher; + this._previewMenu = previewMenu; + this.iconAnimator = iconAnimator; + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + // Fix touchscreen issues before the listener is added by the parent constructor. + this._onTouchEvent = function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) { + // Open the popup menu on long press. + this._setPopupTimeout(); + } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { + // Activate/launch the application. + this.activate(1); + this._removeMenuTimeout(); + } + // Disable dragging via touch screen as it's buggy as hell. Not perfect for tablet users, but the alternative is way worse. + // Also, EVENT_PROPAGATE launches applications twice with this solution, so this.activate(1) above must only be called if there's already a window. + return Clutter.EVENT_STOP; + }; + // Hack for missing TOUCH_END event. + this._onLeaveEvent = function(actor, event) { + this.actor.fake_release(); + if (this._menuTimeoutId != 0) this.activate(1); // Activate/launch the application if TOUCH_END didn't fire. + this._removeMenuTimeout(); + }; + + this.callParent('_init', appInfo.app, iconParams); + + Utils.wrapActor(this.icon); + Utils.wrapActor(this); + + this._dot.set_width(0); + this._isGroupApps = Me.settings.get_boolean('group-apps'); + + this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); + this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._dtpIconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), style: getIconContainerStyle(panel.checkIfVertical()) }); + + this.actor.remove_actor(this._iconContainer); + + this._dtpIconContainer.add_child(this._iconContainer); + + if (appInfo.window) { + let box = new St.BoxLayout(); + + this._windowTitle = new St.Label({ + y_align: Clutter.ActorAlign.CENTER, + x_align: Clutter.ActorAlign.START, + style_class: 'overview-label' + }); + + this._updateWindowTitle(); + this._updateWindowTitleStyle(); + + this._scaleFactorChangedId = Utils.getStageTheme().connect('changed', () => this._updateWindowTitleStyle()); + + box.add_child(this._dtpIconContainer); + box.add_child(this._windowTitle); + + this._dotsContainer.add_child(box); + } else { + this._dotsContainer.add_child(this._dtpIconContainer); + } + + this._container.add_child(this._dotsContainer); + this.actor.set_child(this._container); + + if (panel.checkIfVertical()) { + this.actor.set_width(panel.geom.w); + } + + // Monitor windows-changes instead of app state. + // Keep using the same Id and function callback (that is extended) + if(this._stateChangedId > 0) { + this.app.disconnect(this._stateChangedId); + this._stateChangedId = 0; + } + + this._onAnimateAppiconHoverChanged(); + this._setAppIconPadding(); + this._showDots(); + + this._focusWindowChangedId = global.display.connect('notify::focus-window', + Lang.bind(this, this._onFocusAppChanged)); + + this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; + this._stateChangedId = this.app.connect('windows-changed', Lang.bind(this, this.onWindowsChanged)); + + if (!this.window) { + if (Me.settings.get_boolean('isolate-monitors')) { + this._windowEnteredMonitorId = Utils.DisplayWrapper.getScreen().connect('window-entered-monitor', this.onWindowEnteredOrLeft.bind(this)); + this._windowLeftMonitorId = Utils.DisplayWrapper.getScreen().connect('window-left-monitor', this.onWindowEnteredOrLeft.bind(this)); + } + + this._titleWindowChangeId = 0; + this._minimizedWindowChangeId = 0; + } else { + this._titleWindowChangeId = this.window.connect('notify::title', + Lang.bind(this, this._updateWindowTitle)); + + this._minimizedWindowChangeId = this.window.connect('notify::minimized', + Lang.bind(this, this._updateWindowTitleStyle)); + } + + this._scrollEventId = this.actor.connect('scroll-event', this._onMouseScroll.bind(this)); + + this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', + Lang.bind(this, this._onOverviewWindowDragEnd)); + + this._switchWorkspaceId = global.window_manager.connect('switch-workspace', + Lang.bind(this, this._onSwitchWorkspace)); + + this._hoverChangeId = this.actor.connect('notify::hover', () => this._onAppIconHoverChanged()); + + this._dtpSettingsSignalIds = [ + Me.settings.connect('changed::animate-appicon-hover', Lang.bind(this, this._onAnimateAppiconHoverChanged)), + Me.settings.connect('changed::dot-position', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-size', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-focused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-unfocused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-dominant', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-override', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-1', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-2', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-3', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-4', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-different', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-1', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-2', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-3', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-unfocused-4', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-dominant', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-color', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::focus-highlight-opacity', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::group-apps-label-font-size', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-weight', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-color', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-font-color-minimized', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-label-max-width', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-use-fixed-width', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-underline-unfocused', Lang.bind(this, this._settingsChangeRefresh)) + ] + + this.forcedOverview = false; + + this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); + + this._numberOverlay(); + }, + + getDragActor: function() { + return this.app.create_icon_texture(this.dtpPanel.taskbar.iconSize); + }, + + // Used by TaskbarItemContainer to animate appIcons on hover + getCloneButton: function() { + // The source of the clone is this._container, + // using this.actor directly would break DnD style. + let clone = new Clutter.Clone({ + source: this.actor.child, + x: this.actor.child.x, y: this.actor.child.y, + width: this.actor.child.width, height: this.actor.child.height, + pivot_point: new Utils.getPoint({ x: 0.5, y: 0.5 }), + opacity: 255, + reactive: false, + x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, + }); + + // "clone" of this.actor + return new St.Button({ + child: clone, + x: this.actor.x, y: this.actor.y, + width: this.actor.width, height: this.actor.height, + reactive: false, + }); + }, + + shouldShowTooltip: function() { + if (!Me.settings.get_boolean('show-tooltip') || + (!this.isLauncher && Me.settings.get_boolean("show-window-previews") && + this.getAppIconInterestingWindows().length > 0)) { + return false; + } else { + return this.actor.hover && !this.window && + (!this._menu || !this._menu.isOpen) && + (this._previewMenu.getCurrentAppIcon() !== this); + } + }, + + _onAppIconHoverChanged: function() { + if (!Me.settings.get_boolean('show-window-previews') || + (!this.window && !this._nWindows)) { + return; + } + + if (this.actor.hover) { + this._previewMenu.requestOpen(this); + } else { + this._previewMenu.requestClose(); + } + }, + + _onDestroy: function() { + this.callParent('_onDestroy'); + this._destroyed = true; + + this._timeoutsHandler.destroy(); + + this._previewMenu.close(true); + + // Disconect global signals + // stateChangedId is already handled by parent) + + if(this._overviewWindowDragEndId) + Main.overview.disconnect(this._overviewWindowDragEndId); + + if(this._focusWindowChangedId) + global.display.disconnect(this._focusWindowChangedId); + + if(this._titleWindowChangeId) + this.window.disconnect(this._titleWindowChangeId); + + if(this._minimizedWindowChangeId) + this.window.disconnect(this._minimizedWindowChangeId); + + if (this._windowEnteredMonitorId) { + Utils.DisplayWrapper.getScreen().disconnect(this._windowEnteredMonitorId); + Utils.DisplayWrapper.getScreen().disconnect(this._windowLeftMonitorId); + } + + if(this._switchWorkspaceId) + global.window_manager.disconnect(this._switchWorkspaceId); + + if(this._scaleFactorChangedId) + Utils.getStageTheme().disconnect(this._scaleFactorChangedId); + + if (this._hoverChangeId) { + this.actor.disconnect(this._hoverChangeId); + } + + if (this._scrollEventId) { + this.actor.disconnect(this._scrollEventId); + } + + for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { + Me.settings.disconnect(this._dtpSettingsSignalIds[i]); + } + }, + + onWindowsChanged: function() { + this._updateWindows(); + this.updateIcon(); + }, + + onWindowEnteredOrLeft: function() { + if (this._checkIfFocusedApp()) { + this._updateWindows(); + this._displayProperIndicator(); + } + }, + + updateTitleStyle: function() { + this._updateWindowTitleStyle(); + }, + + // Update indicator and target for minimization animation + updateIcon: function() { + + // If (for unknown reason) the actor is not on the stage the reported size + // and position are random values, which might exceeds the integer range + // resulting in an error when assigned to the a rect. This is a more like + // a workaround to prevent flooding the system with errors. + if (this.actor.get_stage() == null) + return; + + let rect = new Meta.Rectangle(); + + [rect.x, rect.y] = this.actor.get_transformed_position(); + [rect.width, rect.height] = this.actor.get_transformed_size(); + + let windows = this.window ? [this.window] : this.getAppIconInterestingWindows(true); + windows.forEach(function(w) { + w.set_icon_geometry(rect); + }); + }, + + _onAnimateAppiconHoverChanged: function() { + if (Me.settings.get_boolean('animate-appicon-hover')) { + this._container.add_style_class_name('animate-appicon-hover'); + + // Workaround to prevent scaled icon from being ugly when it is animated on hover. + // It increases the "resolution" of the icon without changing the icon size. + this.icon.createIcon = (iconSize) => this.app.create_icon_texture(2 * iconSize); + this._iconIconBinActorAddedId = this.icon._iconBin.connect('actor-added', () => { + if (this.icon._iconBin.child.mapped) { + this.icon._iconBin.child.set_size(this.icon.iconSize, this.icon.iconSize); + } else { + let iconMappedId = this.icon._iconBin.child.connect('notify::mapped', () => { + this.icon._iconBin.child.set_size(this.icon.iconSize, this.icon.iconSize); + this.icon._iconBin.child.disconnect(iconMappedId); + }); + } + }); + if (this.icon._iconBin.child) + this.icon._createIconTexture(this.icon.iconSize); + } else { + this._container.remove_style_class_name('animate-appicon-hover'); + + if (this._iconIconBinActorAddedId) { + this.icon._iconBin.disconnect(this._iconIconBinActorAddedId); + this._iconIconBinActorAddedId = 0; + this.icon.createIcon = Lang.bind(this, this._createIcon); + } + } + }, + + _onMouseScroll: function(actor, event) { + let scrollAction = Me.settings.get_string('scroll-icon-action'); + + if (scrollAction === 'PASS_THROUGH') { + return this.dtpPanel._onPanelMouseScroll(actor, event); + } else if (scrollAction === 'NOTHING' || (!this.window && !this._nWindows)) { + return; + } + + let direction = Utils.getMouseScrollDirection(event); + + if (direction && !this._timeoutsHandler.getId(T2)) { + this._timeoutsHandler.add([T2, Me.settings.get_int('scroll-icon-delay'), () => {}]); + + let windows = this.getAppIconInterestingWindows(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + Utils.activateSiblingWindow(windows, direction, this.window); + } + }, + + _showDots: function() { + // Just update style if dots already exist + if (this._focusedDots && this._unfocusedDots) { + this._updateWindows(); + return; + } + + if (!this._isGroupApps) { + this._focusedDots = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + visible: false + }); + + let mappedId = this.actor.connect('notify::mapped', () => { + this._displayProperIndicator(); + this.actor.disconnect(mappedId); + }); + } else { + this._focusedDots = new St.DrawingArea(), + this._unfocusedDots = new St.DrawingArea(); + this._focusedDots._tweeningToSize = null, + this._unfocusedDots._tweeningToSize = null; + + this._focusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._focusedDots, Me.settings.get_string('dot-style-focused'), true); + this._displayProperIndicator(); + })); + + this._unfocusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._unfocusedDots, Me.settings.get_string('dot-style-unfocused'), false); + this._displayProperIndicator(); + })); + + this._dotsContainer.add_child(this._unfocusedDots); + + this._updateWindows(); + + this._timeoutsHandler.add([T3, 0, () => { + this._resetDots(); + this._displayProperIndicator(); + }]); + } + + this._dotsContainer.add_child(this._focusedDots); + }, + + _resetDots: function() { + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + [this._focusedDots, this._unfocusedDots].forEach(d => { + d._tweeningToSize = null; + d.set_size(-1, -1); + d.x_expand = d.y_expand = false; + + d[isHorizontalDots ? 'width' : 'height'] = 1; + d[(isHorizontalDots ? 'y' : 'x') + '_expand'] = true; + }); + }, + + _settingsChangeRefresh: function() { + if (this._isGroupApps) { + this._updateWindows(); + this._resetDots(); + this._focusedDots.queue_repaint(); + this._unfocusedDots.queue_repaint(); + } + + this._displayProperIndicator(true); + }, + + _updateWindowTitleStyle: function() { + if (this._windowTitle) { + let useFixedWidth = Me.settings.get_boolean('group-apps-use-fixed-width'); + let variableWidth = !useFixedWidth || this.dtpPanel.checkIfVertical() || this.dtpPanel.taskbar.fullScrollView; + let fontWeight = Me.settings.get_string('group-apps-label-font-weight'); + let fontScale = Me.desktopSettings.get_double('text-scaling-factor'); + let fontColor = this.window.minimized ? + Me.settings.get_string('group-apps-label-font-color-minimized') : + Me.settings.get_string('group-apps-label-font-color'); + let scaleFactor = Utils.getScaleFactor(); + let maxLabelWidth = Me.settings.get_int('group-apps-label-max-width') * scaleFactor; + + this._windowTitle[(maxLabelWidth > 0 ? 'show' : 'hide')](); + + this._windowTitle.clutter_text.natural_width = useFixedWidth ? maxLabelWidth : 0; + this._windowTitle.clutter_text.natural_width_set = useFixedWidth; + this._windowTitle.set_width(variableWidth ? -1 : maxLabelWidth + TITLE_RIGHT_PADDING * scaleFactor); + + this._windowTitle.set_style('font-size: ' + Me.settings.get_int('group-apps-label-font-size') * fontScale + 'px;' + + 'font-weight: ' + fontWeight + ';' + + (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + + 'color: ' + fontColor); + } + }, + + _updateWindowTitle: function() { + if (this._windowTitle.text != this.window.title) { + this._windowTitle.text = (this.window.title ? this.window.title : this.app.get_name()).replace(/\r?\n|\r/g, '').trim(); + + if (this._focusedDots) { + this._displayProperIndicator(); + } + } + }, + + _setIconStyle: function(isFocused) { + let inlineStyle = 'margin: 0;'; + + if(Me.settings.get_boolean('focus-highlight') && + this._checkIfFocusedApp() && !this.isLauncher && + (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { + let focusedDotStyle = Me.settings.get_string('dot-style-focused'); + let isWide = this._isWideDotStyle(focusedDotStyle); + let pos = Me.settings.get_string('dot-position'); + let highlightMargin = isWide ? Me.settings.get_int('dot-size') : 0; + + if(!this.window) { + let containerWidth = this._dtpIconContainer.get_width() / Utils.getScaleFactor();; + let backgroundSize = containerWidth + "px " + + (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; + + if (focusedDotStyle == DOT_STYLE.CILIORA || focusedDotStyle == DOT_STYLE.SEGMENTED) + highlightMargin += 1; + + if (this._nWindows > 1 && focusedDotStyle == DOT_STYLE.METRO) { + let bgSvg = '/img/highlight_stacked_bg'; + + if (pos == DOT_POSITION.LEFT || pos == DOT_POSITION.RIGHT) { + bgSvg += (this.dtpPanel.checkIfVertical() ? '_2' : '_3'); + } + + inlineStyle += "background-image: url('" + Me.path + bgSvg + ".svg');" + + "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + + "background-size: " + backgroundSize; + } + } + + let highlightColor = this._getFocusHighlightColor(); + inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, Me.settings.get_int('focus-highlight-opacity') * 0.01); + } + + if(this._dotsContainer.get_style() != inlineStyle && this._dotsContainer.mapped) { + if (!this._isGroupApps) { + //when the apps are ungrouped, set the style synchronously so the icons don't jump around on taskbar redraw + this._dotsContainer.set_style(inlineStyle); + } else if (!this._timeoutsHandler.getId(T1)) { + //graphical glitches if i dont set this on a timeout + this._timeoutsHandler.add([T1, 0, () => this._dotsContainer.set_style(inlineStyle)]); + } + } + }, + + _checkIfFocusedApp: function() { + return tracker.focus_app == this.app; + }, + + _checkIfMonitorHasFocus: function() { + return global.display.focus_window && + (!Me.settings.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. + !Me.settings.get_boolean('isolate-monitors') || + global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); + }, + + _setAppIconPadding: function() { + let padding = getIconPadding(this.dtpPanel.monitor.index); + let margin = Me.settings.get_int('appicon-margin'); + + this.actor.set_style('padding:' + (this.dtpPanel.checkIfVertical() ? margin + 'px 0' : '0 ' + margin + 'px;')); + this._iconContainer.set_style('padding: ' + padding + 'px;'); + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + + if (this._draggable) { + this._draggable.fakeRelease(); + } + + if (this.isDragged) { + return; + } + + if (!this._menu) { + this._menu = new taskbarSecondaryMenu(this, this.dtpPanel); + this._menu.connect('activate-window', Lang.bind(this, function (menu, window) { + this.activateWindow(window, Me.settings); + })); + this._menu.connect('open-state-changed', Lang.bind(this, function (menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + + this._menuManager.addMenu(this._menu); + } + + this.emit('menu-state-changed', true); + + this._previewMenu.close(true); + + this.actor.set_hover(true); + this._menu.actor.add_style_class_name('dashtopanelSecondaryMenu'); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + _onFocusAppChanged: function(windowTracker) { + this._displayProperIndicator(true); + }, + + _onOverviewWindowDragEnd: function(windowTracker) { + this._timeoutsHandler.add([T4, 0, () => this._displayProperIndicator()]); + }, + + _onSwitchWorkspace: function(windowTracker) { + if (this._isGroupApps) { + this._timeoutsHandler.add([T5, 0, () => this._displayProperIndicator(true)]); + } else { + this._displayProperIndicator(); + } + }, + + _displayProperIndicator: function (force) { + let isFocused = this._isFocusedWindow(); + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + this._setIconStyle(isFocused); + + if(!this._isGroupApps) { + if (this.window && (Me.settings.get_boolean('group-apps-underline-unfocused') || isFocused)) { + let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; + + this._focusedDots.set_size(0, 0); + this._focusedDots[isHorizontalDots ? 'height' : 'width'] = this._getRunningIndicatorSize(); + + this._focusedDots.y_align = this._focusedDots.x_align = Clutter.ActorAlign.FILL; + this._focusedDots[(isHorizontalDots ? 'y' : 'x') + '_align'] = align; + this._focusedDots.background_color = this._getRunningIndicatorColor(isFocused); + this._focusedDots.show(); + } else if (this._focusedDots.visible) { + this._focusedDots.hide(); + } + } else { + let sizeProp = isHorizontalDots ? 'width' : 'height'; + let containerSize = this._container[sizeProp]; + let focusedDotStyle = Me.settings.get_string('dot-style-focused'); + let unfocusedDotStyle = Me.settings.get_string('dot-style-unfocused'); + let focusedIsWide = this._isWideDotStyle(focusedDotStyle); + let unfocusedIsWide = this._isWideDotStyle(unfocusedDotStyle); + + let newFocusedDotsSize = 0; + let newFocusedDotsOpacity = 0; + let newUnfocusedDotsSize = 0; + let newUnfocusedDotsOpacity = 0; + + isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + this._timeoutsHandler.add([T6, 0, () => { + if (!this._destroyed) { + if(isFocused) + this.actor.add_style_class_name('focused'); + else + this.actor.remove_style_class_name('focused'); + } + }]); + + if(focusedIsWide) { + newFocusedDotsSize = (isFocused && this._nWindows > 0) ? containerSize : 0; + newFocusedDotsOpacity = 255; + } else { + newFocusedDotsSize = containerSize; + newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; + } + + if(unfocusedIsWide) { + newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? containerSize : 0; + newUnfocusedDotsOpacity = 255; + } else { + newUnfocusedDotsSize = containerSize; + newUnfocusedDotsOpacity = (!isFocused && this._nWindows > 0) ? 255 : 0; + } + + // Only animate if... + // animation is enabled in settings + // AND (going from a wide style to a narrow style indicator or vice-versa + // OR going from an open app to a closed app or vice versa) + if(Me.settings.get_boolean('animate-app-switch') && + ((focusedIsWide != unfocusedIsWide) || + (this._focusedDots[sizeProp] != newUnfocusedDotsSize || this._unfocusedDots[sizeProp] != newFocusedDotsSize))) { + this._animateDotDisplay(this._focusedDots, newFocusedDotsSize, this._unfocusedDots, newUnfocusedDotsOpacity, force, sizeProp); + this._animateDotDisplay(this._unfocusedDots, newUnfocusedDotsSize, this._focusedDots, newFocusedDotsOpacity, force, sizeProp); + } else { + this._focusedDots.opacity = newFocusedDotsOpacity; + this._unfocusedDots.opacity = newUnfocusedDotsOpacity; + this._focusedDots[sizeProp] = newFocusedDotsSize; + this._unfocusedDots[sizeProp] = newUnfocusedDotsSize; + } + } + }, + + _animateDotDisplay: function (dots, newSize, otherDots, newOtherOpacity, force, sizeProp) { + if((dots[sizeProp] != newSize && dots._tweeningToSize !== newSize) || force) { + let tweenOpts = { + time: Taskbar.DASH_ANIMATION_TIME, + transition: 'easeInOutCubic', + onComplete: Lang.bind(this, function() { + if(newOtherOpacity > 0) + otherDots.opacity = newOtherOpacity; + dots._tweeningToSize = null; + }) + }; + + if(newOtherOpacity == 0) + otherDots.opacity = newOtherOpacity; + + tweenOpts[sizeProp] = newSize; + dots._tweeningToSize = newSize; + + Utils.animate(dots, tweenOpts); + } + }, + + _isFocusedWindow: function() { + let focusedWindow = global.display.focus_window; + + while (focusedWindow) { + if (focusedWindow == this.window) { + return true; + } + + focusedWindow = focusedWindow.get_transient_for(); + } + + return false; + }, + + _isWideDotStyle: function(dotStyle) { + return dotStyle == DOT_STYLE.SEGMENTED || + dotStyle == DOT_STYLE.CILIORA || + dotStyle == DOT_STYLE.METRO || + dotStyle == DOT_STYLE.SOLID; + }, + + _isThemeProvidingIndicator: function () { + // This is an attempt to determine if the theme is providing their own + // running indicator by way of a border image on the icon, for example in + // the theme Ciliora + return (this.icon.actor.get_stage() && + this.icon.actor.get_theme_node().get_border_image()); + }, + + activate: function(button, handleAsGrouped) { + let event = Clutter.get_current_event(); + let modifiers = event ? event.get_state() : 0; + + // Only consider SHIFT and CONTROL as modifiers (exclude SUPER, CAPS-LOCK, etc.) + modifiers = modifiers & (Clutter.ModifierType.SHIFT_MASK | Clutter.ModifierType.CONTROL_MASK); + + // We don't change the CTRL-click behaviour: in such case we just chain + // up the parent method and return. + if (modifiers & Clutter.ModifierType.CONTROL_MASK) { + // Keep default behaviour: launch new window + // By calling the parent method I make it compatible + // with other extensions tweaking ctrl + click + this.callParent('activate', button); + return; + } + + // We check what type of click we have and if the modifier SHIFT is + // being used. We then define what buttonAction should be for this + // event. + let buttonAction = 0; + if (button && button == 2 ) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = Me.settings.get_string('shift-middle-click-action'); + else + buttonAction = Me.settings.get_string('middle-click-action'); + } + else if (button && button == 1) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = Me.settings.get_string('shift-click-action'); + else + buttonAction = Me.settings.get_string('click-action'); + } + + let appCount = this.getAppIconInterestingWindows().length; + let previewedAppIcon = this._previewMenu.getCurrentAppIcon(); + this._previewMenu.close(Me.settings.get_boolean('window-preview-hide-immediate-click')); + + // We check if the app is running, and that the # of windows is > 0 in + // case we use workspace isolation, + let appIsRunning = this.app.state == Shell.AppState.RUNNING && appCount > 0; + + // We customize the action only when the application is already running + if (appIsRunning && !this.isLauncher) { + if (this.window && !handleAsGrouped) { + //ungrouped applications behaviors + switch (buttonAction) { + case 'RAISE': case 'CYCLE': case 'CYCLE-MIN': case 'MINIMIZE': case 'TOGGLE-SHOWPREVIEW': case 'TOGGLE-CYCLE': + if (!Main.overview._shown && + (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && + (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { + this.window.minimize(); + } else { + Main.activateWindow(this.window); + } + + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "QUIT": + this.window.delete(global.get_current_time()); + break; + } + } else { + //grouped application behaviors + let monitor = this.dtpPanel.monitor; + let appHasFocus = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + switch (buttonAction) { + case "RAISE": + activateAllWindows(this.app, monitor); + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "MINIMIZE": + // In overview just activate the app, unless the acion is explicitely + // requested with a keyboard modifier + if (!Main.overview._shown || modifiers){ + // If we have button=2 or a modifier, allow minimization even if + // the app is not focused + if (appHasFocus || button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK) { + // minimize all windows on double click and always in the case of primary click without + // additional modifiers + let all_windows = (button == 1 && ! modifiers) || event.get_click_count() > 1; + minimizeWindow(this.app, all_windows, monitor); + } + else + activateAllWindows(this.app, monitor); + } + else + this.app.activate(); + break; + + case "CYCLE": + if (!Main.overview._shown){ + if (appHasFocus) + cycleThroughWindows(this.app, false, false, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "CYCLE-MIN": + if (!Main.overview._shown){ + if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) + cycleThroughWindows(this.app, false, true, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "TOGGLE-SHOWPREVIEW": + if (!Main.overview._shown) { + if (appCount == 1) { + if (appHasFocus) + minimizeWindow(this.app, false, monitor); + else + activateFirstWindow(this.app, monitor); + } else { + if (event.get_click_count() > 1) { + // minimize all windows if double clicked + minimizeWindow(this.app, true, monitor); + } else if (previewedAppIcon != this) { + this._previewMenu.open(this); + } + + this.emit('sync-tooltip'); + } + } + else + this.app.activate(); + break; + case "TOGGLE-CYCLE": + if (!Main.overview._shown) { + if (appCount == 1) { + if (appHasFocus) + minimizeWindow(this.app, false, monitor); + else + activateFirstWindow(this.app, monitor); + } else { + cycleThroughWindows(this.app, false, false, monitor); + } + } + else + this.app.activate(); + break; + case "QUIT": + closeAllWindows(this.app, monitor); + break; + } + } + } + else { + this._launchNewInstance(); + } + + Main.overview.hide(); + }, + + _launchNewInstance: function() { + if (this.app.can_open_new_window()) { + let appActions = this.app.get_app_info().list_actions(); + let newWindowIndex = appActions.indexOf('new-window'); + + if(Me.settings.get_boolean('animate-window-launch')) { + this.animateLaunch(); + } + + if (newWindowIndex < 0) { + this.app.open_new_window(-1); + } else { + this.app.launch_action(appActions[newWindowIndex], global.get_current_time(), -1); + } + } else { + let windows = this.window ? [this.window] : this.app.get_windows(); + + if (windows.length) { + Main.activateWindow(windows[0]); + } else { + this.app.activate(); + } + } + }, + + _updateWindows: function() { + let windows = [this.window]; + + if (!this.window) { + windows = this.getAppIconInterestingWindows(); + + this._nWindows = windows.length; + + for (let i = 1; i <= MAX_INDICATORS; i++){ + let className = 'running'+i; + if(i != this._nWindows) + this.actor.remove_style_class_name(className); + else + this.actor.add_style_class_name(className); + } + } + + this._previewMenu.update(this, windows); + }, + + _getRunningIndicatorCount: function() { + return Math.min(this._nWindows, MAX_INDICATORS); + }, + + _getRunningIndicatorSize: function() { + return Me.settings.get_int('dot-size') * Utils.getScaleFactor(); + }, + + _getRunningIndicatorColor: function(isFocused) { + let color; + const fallbackColor = new Clutter.Color({ red: 82, green: 148, blue: 226, alpha: 255 }); + + if (Me.settings.get_boolean('dot-color-dominant')) { + let dce = new Utils.DominantColorExtractor(this.app); + let palette = dce._getColorPalette(); + if (palette) { + color = Clutter.color_from_string(palette.original)[1]; + } else { // unable to determine color, fall back to theme + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + } else if(Me.settings.get_boolean('dot-color-override')) { + let dotColorSettingPrefix = 'dot-color-'; + + if(!isFocused && Me.settings.get_boolean('dot-color-unfocused-different')) + dotColorSettingPrefix = 'dot-color-unfocused-'; + + color = Clutter.color_from_string(Me.settings.get_string(dotColorSettingPrefix + (this._getRunningIndicatorCount() || 1) ))[1]; + } else { + // Re-use the style - background color, and border width and color - + // of the default dot + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + + return color; + }, + + _getFocusHighlightColor: function() { + if (Me.settings.get_boolean('focus-highlight-dominant')) { + let dce = new Utils.DominantColorExtractor(this.app); + let palette = dce._getColorPalette(); + if (palette) return palette.original; + } + return Me.settings.get_string('focus-highlight-color'); + }, + + _drawRunningIndicator: function(area, type, isFocused) { + let n = this._getRunningIndicatorCount(); + + if (!n) { + return; + } + + let position = Me.settings.get_string('dot-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + let bodyColor = this._getRunningIndicatorColor(isFocused); + let [areaWidth, areaHeight] = area.get_surface_size(); + let cr = area.get_context(); + let size = this._getRunningIndicatorSize(); + + let areaSize = areaWidth; + let startX = 0; + let startY = 0; + + if (isHorizontalDots) { + if (position == DOT_POSITION.BOTTOM) { + startY = areaHeight - size; + } + } else { + areaSize = areaHeight; + + if (position == DOT_POSITION.RIGHT) { + startX = areaWidth - size; + } + } + + if (type == DOT_STYLE.SOLID || type == DOT_STYLE.METRO) { + if (type == DOT_STYLE.SOLID || n <= 1) { + cr.translate(startX, startY); + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [areaSize, size] : [size, areaSize])); + cr.fill(); + } else { + let blackenedLength = (1 / 48) * areaSize; // need to scale with the SVG for the stacked highlight + let darkenedLength = isFocused ? (2 / 48) * areaSize : (10 / 48) * areaSize; + let blackenedColor = bodyColor.shade(.3); + let darkenedColor = bodyColor.shade(.7); + let solidDarkLength = areaSize - darkenedLength; + let solidLength = solidDarkLength - blackenedLength; + + cr.translate(startX, startY); + + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [solidLength, size] : [size, solidLength])); + cr.fill(); + Clutter.cairo_set_source_color(cr, blackenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidLength, 0, 1, size] : [0, solidLength, size, 1]); + cr.fill(); + Clutter.cairo_set_source_color(cr, darkenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidDarkLength, 0, darkenedLength, size] : [0, solidDarkLength, size, darkenedLength]); + cr.fill(); + } + } else { + let spacing = Math.ceil(areaSize / 18); // separation between the indicators + let length; + let dist; + let indicatorSize; + let translate; + let preDraw = () => {}; + let draw; + let drawDash = (i, dashLength) => { + dist = i * dashLength + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0, dashLength, size] : [0, dist, size, dashLength])); + }; + + switch (type) { + case DOT_STYLE.CILIORA: + spacing = size; + length = areaSize - (size * (n - 1)) - (spacing * (n - 1)); + translate = () => cr.translate(startX, startY); + preDraw = () => { + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [length, size] : [size, length])); + }; + draw = i => { + dist = length + (i * spacing) + ((i - 1) * size); + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DOTS: + let radius = size / 2; + + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = (2 * i + 1) * radius + i * spacing; + cr.arc.apply(cr, (isHorizontalDots ? [dist, radius] : [radius, dist]).concat([radius, 0, 2 * Math.PI])); + }; + break; + case DOT_STYLE.SQUARES: + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = i * size + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DASHES: + length = Math.floor(areaSize / 4) - spacing; + translate = () => { + indicatorSize = Math.floor((areaSize - n * length - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => drawDash(i, length); + break; + case DOT_STYLE.SEGMENTED: + length = Math.ceil((areaSize - ((n - 1) * spacing)) / n); + translate = () => cr.translate(startX, startY); + draw = i => drawDash(i, length); + break; + } + + translate(); + + Clutter.cairo_set_source_color(cr, bodyColor); + preDraw(); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + draw(i); + } + cr.fill(); + } + + cr.$dispose(); + }, + + _numberOverlay: function() { + // Add label for a Hot-Key visual aid + this._numberOverlayLabel = new St.Label({ style_class: 'badge' }); + this._numberOverlayBin = new St.Bin({ + child: this._numberOverlayLabel, y: 2 + }); + this._numberOverlayLabel.add_style_class_name('number-overlay'); + this._numberOverlayOrder = -1; + this._numberOverlayBin.hide(); + + this._dtpIconContainer.add_child(this._numberOverlayBin); + }, + + updateHotkeyNumberOverlay: function() { + this.updateNumberOverlay(this._numberOverlayBin, true); + }, + + updateNumberOverlay: function(bin, fixedSize) { + // We apply an overall scale factor that might come from a HiDPI monitor. + // Clutter dimensions are in physical pixels, but CSS measures are in logical + // pixels, so make sure to consider the scale. + // Set the font size to something smaller than the whole icon so it is + // still visible. The border radius is large to make the shape circular + let [minWidth, natWidth] = this._dtpIconContainer.get_preferred_width(-1); + let font_size = Math.round(Math.max(12, 0.3 * natWidth) / Utils.getScaleFactor()); + let size = Math.round(font_size * 1.3); + let label = bin.child; + let style = 'font-size: ' + font_size + 'px;' + + 'border-radius: ' + this.icon.iconSize + 'px;' + + 'height: ' + size +'px;'; + + if (fixedSize || label.get_text().length == 1) { + style += 'width: ' + size + 'px;'; + } else { + style += 'padding: 0 2px;'; + } + + bin.x = fixedSize ? natWidth - size - 2 : 2; + label.set_style(style); + }, + + setNumberOverlay: function(number) { + this._numberOverlayOrder = number; + this._numberOverlayLabel.set_text(number.toString()); + }, + + toggleNumberOverlay: function(activate) { + if (activate && this._numberOverlayOrder > -1) + this._numberOverlayBin.show(); + else + this._numberOverlayBin.hide(); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + this._previewMenu.close(true); + } + + return DND.DragMotionResult.CONTINUE; + }, + + // Disable all DnD methods on gnome-shell 3.34 + _onDragBegin: function() {}, + _onDragEnd: function() {}, + acceptDrop: function() { return false; }, + + getAppIconInterestingWindows: function(isolateMonitors) { + return getInterestingWindows(this.app, this.dtpPanel.monitor, isolateMonitors); + } +}); +taskbarAppIcon.prototype.scaleAndFade = taskbarAppIcon.prototype.undoScaleAndFade = () => {}; + +function minimizeWindow(app, param, monitor){ + // Param true make all app windows minimize + let windows = getInterestingWindows(app, monitor); + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + for (let i = 0; i < windows.length; i++) { + let w = windows[i]; + if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()){ + w.minimize(); + // Just minimize one window. By specification it should be the + // focused window on the current workspace. + if(!param) + break; + } + } +} + +/* + * By default only non minimized windows are activated. + * This activates all windows in the current workspace. + */ +function activateAllWindows(app, monitor){ + + // First activate first window so workspace is switched if needed, + // then activate all other app windows in the current workspace. + let windows = getInterestingWindows(app, monitor); + let w = windows[0]; + Main.activateWindow(w); + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + + if (windows.length <= 0) + return; + + for (let i = windows.length - 1; i >= 0; i--){ + if (windows[i].get_workspace().index() == activeWorkspace){ + Main.activateWindow(windows[i]); + } + } +} + +function activateFirstWindow(app, monitor){ + + let windows = getInterestingWindows(app, monitor); + Main.activateWindow(windows[0]); +} + +function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { + // Store for a little amount of time last clicked app and its windows + // since the order changes upon window interaction + let MEMORY_TIME=3000; + + let app_windows = getInterestingWindows(app, monitor); + + if(shouldMinimize) + app_windows.push("MINIMIZE"); + + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId = Mainloop.timeout_add(MEMORY_TIME, resetRecentlyClickedApp); + + // If there isn't already a list of windows for the current app, + // or the stored list is outdated, use the current windows list. + if (!recentlyClickedApp || + recentlyClickedApp.get_id() != app.get_id() || + recentlyClickedAppWindows.length != app_windows.length || + recentlyClickedAppMonitorIndex != monitor.index) { + recentlyClickedApp = app; + recentlyClickedAppWindows = app_windows; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = monitor.index; + } + + if (reversed) { + recentlyClickedAppIndex--; + if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; + } else { + recentlyClickedAppIndex++; + } + let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; + + if(recentlyClickedAppWindows[index] === "MINIMIZE") + minimizeWindow(app, true, monitor); + else + Main.activateWindow(recentlyClickedAppWindows[index]); +} + +function resetRecentlyClickedApp() { + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId=0; + recentlyClickedApp =null; + recentlyClickedAppWindows = null; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = null; + + return false; +} + +function closeAllWindows(app, monitor) { + let windows = getInterestingWindows(app, monitor); + for (let i = 0; i < windows.length; i++) + windows[i].delete(global.get_current_time()); +} + +// Filter out unnecessary windows, for instance +// nautilus desktop window. +function getInterestingWindows(app, monitor, isolateMonitors) { + let windows = app.get_windows().filter(function(w) { + return !w.skip_taskbar; + }); + + // When using workspace or monitor isolation, we filter out windows + // that are not in the current workspace or on the same monitor as the appicon + if (Me.settings.get_boolean('isolate-workspaces')) + windows = windows.filter(function(w) { + return w.get_workspace().index() == Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + }); + + if (monitor && Me.settings.get_boolean('multi-monitors') && (isolateMonitors || Me.settings.get_boolean('isolate-monitors'))) { + windows = windows.filter(function(w) { + return w.get_monitor() == monitor.index; + }); + } + + return windows; +} + +function cssHexTocssRgba(cssHex, opacity) { + var bigint = parseInt(cssHex.slice(1), 16); + var r = (bigint >> 16) & 255; + var g = (bigint >> 8) & 255; + var b = bigint & 255; + + return 'rgba(' + [r, g, b].join(',') + ',' + opacity + ')'; +} + +function getIconPadding(monitorIndex) { + let panelSize = PanelSettings.getPanelSize(Me.settings, monitorIndex); + let padding = Me.settings.get_int('appicon-padding'); + let availSize = panelSize - Taskbar.MIN_ICON_SIZE - panelSize % 2; + + if (padding * 2 > availSize) { + padding = availSize * .5; + } + + return padding; +} + +/** + * Extend AppMenu (AppIconMenu for pre gnome 41) + * + * - set popup arrow side based on taskbar orientation + * - Add close windows option based on quitfromdash extension + * (https://github.com/deuill/shell-extension-quitfromdash) + */ + +var taskbarSecondaryMenu = Utils.defineClass({ + Name: 'DashToPanel.SecondaryMenu', + Extends: (AppDisplay.AppMenu || AppDisplay.AppIconMenu), + ParentConstrParams: [[0]], + + _init: function(source, panel) { + // Damm it, there has to be a proper way of doing this... + // As I can't call the parent parent constructor (?) passing the side + // parameter, I overwite what I need later + this.callParent('_init', source); + + let side = panel.getPosition(); + // Change the initialized side where required. + this._arrowSide = side; + this._boxPointer._arrowSide = side; + this._boxPointer._userArrowSide = side; + }, + + // helper function for the quit windows abilities + _closeWindowInstance: function(metaWindow) { + metaWindow.delete(global.get_current_time()); + }, + + _dtpRedisplay: function(parentFunc) { + this.callParent(parentFunc); + + // Remove "Show Details" menu item + if(!Me.settings.get_boolean('secondarymenu-contains-showdetails')) { + let existingMenuItems = this._getMenuItems(); + for(let idx in existingMenuItems) { + if(existingMenuItems[idx].actor.label_actor.text == _("Show Details")) { + this.box.remove_child(existingMenuItems[idx].actor); + if(existingMenuItems[idx-1] instanceof PopupMenu.PopupSeparatorMenuItem) + this.box.remove_child(existingMenuItems[idx-1].actor); + break; + } + } + } + + // prepend items from the appMenu (for native gnome apps) + if(Me.settings.get_boolean('secondarymenu-contains-appmenu')) { + let appMenu = this._source.app.menu; + if(appMenu) { + let remoteMenu = new imports.ui.remoteMenu.RemoteMenu(this._source.actor, this._source.app.menu, this._source.app.action_group); + let appMenuItems = remoteMenu._getMenuItems(); + for(var i = 0, l = appMenuItems.length || 0; i < l; ++i) { + let menuItem = appMenuItems[i]; + let labelText = menuItem.actor.label_actor.text; + if(labelText == _("New Window") || labelText == _("Quit")) + continue; + + if(menuItem instanceof PopupMenu.PopupSeparatorMenuItem) + continue; + + // this ends up getting called multiple times, and bombing due to the signal id's being invalid + // on a 2nd pass. disconnect the base handler and attach our own that wraps the id's in if statements + menuItem.disconnect(menuItem._popupMenuDestroyId) + menuItem._popupMenuDestroyId = menuItem.connect('destroy', Lang.bind(this, function(menuItem) { + if(menuItem._popupMenuDestroyId) { + menuItem.disconnect(menuItem._popupMenuDestroyId); + menuItem._popupMenuDestroyId = 0; + } + if(menuItem._activateId) { + menuItem.disconnect(menuItem._activateId); + menuItem._activateId = 0; + } + if(menuItem._activeChangeId) { + menuItem.disconnect(menuItem._activeChangeId); + menuItem._activeChangeId = 0; + } + if(menuItem._sensitiveChangeId) { + menuItem.disconnect(menuItem._sensitiveChangeId); + menuItem._sensitiveChangeId = 0; + } + this.disconnect(menuItem._parentSensitiveChangeId); + if (menuItem == this._activeMenuItem) + this._activeMenuItem = null; + })); + + menuItem.actor.get_parent().remove_child(menuItem.actor); + if(menuItem instanceof PopupMenu.PopupSubMenuMenuItem) { + let newSubMenuMenuItem = new PopupMenu.PopupSubMenuMenuItem(labelText); + let appSubMenuItems = menuItem.menu._getMenuItems(); + for(let appSubMenuIdx in appSubMenuItems){ + let subMenuItem = appSubMenuItems[appSubMenuIdx]; + subMenuItem.actor.get_parent().remove_child(subMenuItem.actor); + newSubMenuMenuItem.menu.addMenuItem(subMenuItem); + } + this.addMenuItem(newSubMenuMenuItem, i); + } else + this.addMenuItem(menuItem, i); + } + + if(i > 0) { + let separator = new PopupMenu.PopupSeparatorMenuItem(); + this.addMenuItem(separator, i); + } + } + } + + // quit menu + let app = this._source.app; + let window = this._source.window; + let count = window ? 1 : getInterestingWindows(app).length; + if ( count > 0) { + this._appendSeparator(); + let quitFromTaskbarMenuText = ""; + if (count == 1) + quitFromTaskbarMenuText = _("Quit"); + else + quitFromTaskbarMenuText = _("Quit") + ' ' + count + ' ' + _("Windows"); + + this._quitfromTaskbarMenuItem = this._appendMenuItem(quitFromTaskbarMenuText); + this._quitfromTaskbarMenuItem.connect('activate', Lang.bind(this, function() { + let app = this._source.app; + let windows = window ? [window] : app.get_windows(); + for (i = 0; i < windows.length; i++) { + this._closeWindowInstance(windows[i]) + } + })); + } + } +}); +Signals.addSignalMethods(taskbarSecondaryMenu.prototype); +adjustMenuRedisplay(taskbarSecondaryMenu.prototype); + +/** + * This function is used for extendDashItemContainer + */ +function ItemShowLabel() { + if (!this._labelText) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.get_transformed_position(); + let node = this.label.get_theme_node(); + + let itemWidth = this.allocation.x2 - this.allocation.x1; + let itemHeight = this.allocation.y2 - this.allocation.y1; + + let labelWidth = this.label.get_width(); + let labelHeight = this.label.get_height(); + + let position = this._dtpPanel.getPosition(); + let labelOffset = node.get_length('-x-offset'); + + // From TaskbarItemContainer + if (this._getIconAnimationOffset) + labelOffset += this._getIconAnimationOffset(); + + let xOffset = Math.floor((itemWidth - labelWidth) / 2); + let x = stageX + xOffset + let y = stageY + (itemHeight - labelHeight) * .5; + + switch(position) { + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + break; + case St.Side.BOTTOM: + y = stageY - labelHeight - labelOffset; + break; + case St.Side.LEFT: + x = stageX + labelOffset + itemWidth; + break; + case St.Side.RIGHT: + x = stageX - labelWidth - labelOffset; + break; + } + + // keep the label inside the screen border + // Only needed for the x coordinate. + + // Leave a few pixel gap + let gap = LABEL_GAP; + let monitor = Main.layoutManager.findMonitorForActor(this); + if ( x - monitor.x < gap) + x += monitor.x - x + labelOffset; + else if ( x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth -( monitor.x + monitor.width) + gap; + + this.label.set_position(Math.round(x), Math.round(y)); + + let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; + + if (duration > 1) { + duration /= 1000; + } + + Utils.animate(this.label, { + opacity: 255, + time: duration, + transition: 'easeOutQuad', + }); +}; + +/** + * A wrapper class around the ShowAppsIcon class. + * + * - Pass settings to the constructor + * - set label position based on dash orientation (Note, I am reusing most machinery of the appIcon class) + * - implement a popupMenu based on the AppIcon code (Note, I am reusing most machinery of the appIcon class) + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this pattern where the real showAppsIcon object is encaptulated, and a reference to it will be properly wired upon + * use of this class in place of the original showAppsButton. + * + */ +var ShowAppsIconWrapper = Utils.defineClass({ + Name: 'DashToPanel.ShowAppsIconWrapper', + + _init: function(dtpPanel) { + this.realShowAppsIcon = new Dash.ShowAppsIcon(); + + Utils.wrapActor(this.realShowAppsIcon); + Utils.wrapActor(this.realShowAppsIcon.toggleButton); + + /* the variable equivalent to toggleButton has a different name in the appIcon class + (actor): duplicate reference to easily reuse appIcon methods */ + this.actor = this.realShowAppsIcon.toggleButton; + this.realShowAppsIcon.show(false); + + // Re-use appIcon methods + this._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; + this._setPopupTimeout = AppDisplay.AppIcon.prototype._setPopupTimeout; + this._onKeyboardPopupMenu = AppDisplay.AppIcon.prototype._onKeyboardPopupMenu; + + // No action on clicked (showing of the appsview is controlled elsewhere) + this._onClicked = Lang.bind(this, function(actor, button) { + this._removeMenuTimeout(); + }); + + this.actor.connect('leave-event', Lang.bind(this, this._onLeaveEvent)); + this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); + this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent)); + this.actor.connect('clicked', Lang.bind(this, this._onClicked)); + this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu)); + + this._menu = null; + this._menuManager = new PopupMenu.PopupMenuManager(this.actor); + this._menuTimeoutId = 0; + + this.realShowAppsIcon._dtpPanel = dtpPanel; + Taskbar.extendDashItemContainer(this.realShowAppsIcon); + + let customIconPath = Me.settings.get_string('show-apps-icon-file'); + + this.realShowAppsIcon.icon.createIcon = function(size) { + this._iconActor = new St.Icon({ icon_name: 'view' + (Config.PACKAGE_VERSION < '3.20' ? '' : '-app') + '-grid-symbolic', + icon_size: size, + style_class: 'show-apps-icon', + track_hover: true }); + + if (customIconPath) { + this._iconActor.gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(customIconPath) }); + } + + return this._iconActor; + }; + + this._changedShowAppsIconId = Me.settings.connect('changed::show-apps-icon-file', () => { + customIconPath = Me.settings.get_string('show-apps-icon-file'); + this.realShowAppsIcon.icon._createIconTexture(this.realShowAppsIcon.icon.iconSize); + }); + + this._changedAppIconPaddingId = Me.settings.connect('changed::appicon-padding', () => this.setShowAppsPadding()); + this._changedAppIconSidePaddingId = Me.settings.connect('changed::show-apps-icon-side-padding', () => this.setShowAppsPadding()); + + this.setShowAppsPadding(); + }, + + _onButtonPress: function(_actor, event) { + let button = event.get_button(); + if (button == 1) { + this._setPopupTimeout(); + } else if (button == 3) { + this.popupMenu(); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + }, + + _onLeaveEvent: function(_actor, _event) { + this.actor.fake_release(); + this._removeMenuTimeout(); + }, + + _onTouchEvent: function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) + this._setPopupTimeout(); + + return Clutter.EVENT_PROPAGATE; + }, + + _onMenuPoppedDown: function() { + this._menu.sourceActor = this.actor; + this.actor.sync_hover(); + this.emit('menu-state-changed', false); + }, + + setShowAppsPadding: function() { + let padding = getIconPadding(this.realShowAppsIcon._dtpPanel.monitor.index); + let sidePadding = Me.settings.get_int('show-apps-icon-side-padding'); + let isVertical = this.realShowAppsIcon._dtpPanel.checkIfVertical(); + + this.actor.set_style('padding:' + (padding + (isVertical ? sidePadding : 0)) + 'px ' + (padding + (isVertical ? 0 : sidePadding)) + 'px;'); + }, + + createMenu: function() { + if (!this._menu) { + this._menu = new MyShowAppsIconMenu(this.actor, this.realShowAppsIcon._dtpPanel); + this._menu.connect('open-state-changed', Lang.bind(this, function(menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function() { + this._menu.close(); + })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + this._menuManager.addMenu(this._menu); + } + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + this.createMenu(this.actor); + + //this.emit('menu-state-changed', true); + + this.actor.set_hover(true); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + shouldShowTooltip: function() { + return Me.settings.get_boolean('show-tooltip') && + (this.actor.hover && (!this._menu || !this._menu.isOpen)); + }, + + destroy: function() { + Me.settings.disconnect(this._changedShowAppsIconId); + Me.settings.disconnect(this._changedAppIconSidePaddingId); + Me.settings.disconnect(this._changedAppIconPaddingId); + + this.realShowAppsIcon.destroy(); + } +}); +Signals.addSignalMethods(ShowAppsIconWrapper.prototype); + +/** + * A menu for the showAppsIcon + */ +var MyShowAppsIconMenu = Utils.defineClass({ + Name: 'DashToPanel.ShowAppsIconMenu', + Extends: taskbarSecondaryMenu, + ParentConstrParams: [[0], [1]], + + _dtpRedisplay: function() { + this.removeAll(); + + // Only add menu entries for commands that exist in path + function _appendItem(obj, info) { + if (Utils.checkIfCommandExists(info.cmd[0])) { + let item = obj._appendMenuItem(_(info.title)); + + item.connect('activate', function() { + Util.spawn(info.cmd); + }); + return item; + } + + return null; + } + + function _appendList(obj, commandList, titleList) { + if (commandList.length != titleList.length) { + return; + } + + for (var entry = 0; entry < commandList.length; entry++) { + _appendItem(obj, { + title: titleList[entry], + cmd: commandList[entry].split(' ') + }); + } + } + + if (this.sourceActor != Main.layoutManager.dummyCursor) { + _appendItem(this, { + title: 'Power options', + cmd: ['gnome-control-center', 'power'] + }); + + _appendItem(this, { + title: 'Event logs', + cmd: ['gnome-logs'] + }); + + _appendItem(this, { + title: 'System', + cmd: ['gnome-control-center', 'info-overview'] + }); + + _appendItem(this, { + title: 'Device Management', + cmd: ['gnome-control-center', 'display'] + }); + + _appendItem(this, { + title: 'Disk Management', + cmd: ['gnome-disks'] + }); + + _appendList( + this, + Me.settings.get_strv('show-apps-button-context-menu-commands'), + Me.settings.get_strv('show-apps-button-context-menu-titles') + ) + + this._appendSeparator(); + } + + _appendItem(this, { + title: 'Terminal', + cmd: ['gnome-terminal'] + }); + + _appendItem(this, { + title: 'System monitor', + cmd: ['gnome-system-monitor'] + }); + + _appendItem(this, { + title: 'Files', + cmd: ['nautilus'] + }); + + _appendItem(this, { + title: 'Extensions', + cmd: ['gnome-shell-extension-prefs'] + }); + + _appendItem(this, { + title: 'Settings', + cmd: ['gnome-control-center', 'wifi'] + }); + + _appendList( + this, + Me.settings.get_strv('panel-context-menu-commands'), + Me.settings.get_strv('panel-context-menu-titles') + ) + + this._appendSeparator(); + + let lockTaskbarMenuItem = this._appendMenuItem(Me.settings.get_boolean('taskbar-locked') ? _('Unlock taskbar') : _('Lock taskbar')); + lockTaskbarMenuItem.connect('activate', () => { + Me.settings.set_boolean('taskbar-locked', !Me.settings.get_boolean('taskbar-locked')); + }); + + let settingsMenuItem = this._appendMenuItem(_('Dash to Panel Settings')); + settingsMenuItem.connect('activate', function () { + let command = ["gnome-shell-extension-prefs"]; + + if (Config.PACKAGE_VERSION > '3.36') { + command = ["gnome-extensions", "prefs"]; + } + + Util.spawn(command.concat([Me.metadata.uuid])); + }); + + if(this._source._dtpPanel) { + this._appendSeparator(); + let item = this._appendMenuItem(this._source._dtpPanel._restoreWindowList ? _('Restore Windows') : _('Show Desktop')); + item.connect('activate', Lang.bind(this._source._dtpPanel, this._source._dtpPanel._onShowDesktopButtonPress)); + } + } +}); +adjustMenuRedisplay(MyShowAppsIconMenu.prototype); + +function adjustMenuRedisplay(menuProto) { + menuProto[menuRedisplayFunc] = function() { this._dtpRedisplay(menuRedisplayFunc) }; +} + +var getIconContainerStyle = function(isVertical) { + let style = 'padding: '; + + if (Me.settings.get_boolean('group-apps')) { + style += (isVertical ? '0;' : '0 ' + DEFAULT_PADDING_SIZE + 'px;'); + } else { + style += (isVertical ? '' : '0 ') + DEFAULT_PADDING_SIZE + 'px;'; + } + + return style; +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js new file mode 100644 index 0000000..57d2f13 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/convenience.js @@ -0,0 +1,89 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Config = imports.misc.config; +const ExtensionUtils = imports.misc.extensionUtils; +const Gettext = imports.gettext; +const Gio = imports.gi.Gio; + +/** + * initTranslations: + * @domain: (optional): the gettext domain to use + * + * Initialize Gettext to load translations from extensionsdir/locale. + * If @domain is not provided, it will be taken from metadata['gettext-domain'] + */ +function initTranslations(domain) { + let extension = ExtensionUtils.getCurrentExtension(); + + domain = domain || extension.metadata['gettext-domain']; + + // Check if this extension was built with "make zip-file", and thus + // has the locale files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell + let localeDir = extension.dir.get_child('locale'); + if (localeDir.query_exists(null)) + Gettext.bindtextdomain(domain, localeDir.get_path()); + else + Gettext.bindtextdomain(domain, Config.LOCALEDIR); +} + +/** + * getSettings: + * @schema: (optional): the GSettings schema id + * + * Builds and return a GSettings schema for @schema, using schema files + * in extensionsdir/schemas. If @schema is not provided, it is taken from + * metadata['settings-schema']. + */ +function getSettings(schema) { + let extension = ExtensionUtils.getCurrentExtension(); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Check if this extension was built with "make zip-file", and thus + // has the schema files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell (and therefore schemas are available + // in the standard folders) + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + else + schemaSource = GioSSS.get_default(); + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error('Schema ' + schema + ' could not be found for extension ' + + extension.metadata.uuid + '. Please check your installation.'); + + return new Gio.Settings({ + settings_schema: schemaObj + }); +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js new file mode 100644 index 0000000..7ab80f2 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/extension.js @@ -0,0 +1,149 @@ +/* + * Dash-To-Panel extension for Gnome 3 + * Copyright 2016 Jason DeRose (jderose9) and Charles Gagnon (charlesg99) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const Lang = imports.lang; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const WindowManager = imports.ui.windowManager; +const ExtensionUtils = imports.misc.extensionUtils; +const Mainloop = imports.mainloop; +const Signals = imports.signals; + +const Me = ExtensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const PanelManager = Me.imports.panelManager; +const Utils = Me.imports.utils; + +const UBUNTU_DOCK_UUID = 'ubuntu-dock@ubuntu.com'; + +let panelManager; +let extensionChangedHandler; +let disabledUbuntuDock; +let extensionSystem = (Main.extensionManager || imports.ui.extensionSystem); + +function init() { + this._realHasOverview = Main.sessionMode.hasOverview; + + Convenience.initTranslations(Utils.TRANSLATION_DOMAIN); + + //create an object that persists until gnome-shell is restarted, even if the extension is disabled + Me.persistentStorage = {}; +} + +function enable() { + // The Ubuntu Dock extension might get enabled after this extension + extensionChangedHandler = extensionSystem.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === UBUNTU_DOCK_UUID && extension.state === 1) { + _enable(); + } + }); + + //create a global object that can emit signals and conveniently expose functionalities to other extensions + global.dashToPanel = {}; + Signals.addSignalMethods(global.dashToPanel); + + _enable(); +} + +function _enable() { + let ubuntuDock = Main.extensionManager ? + Main.extensionManager.lookup(UBUNTU_DOCK_UUID) : //gnome-shell >= 3.33.4 + ExtensionUtils.extensions[UBUNTU_DOCK_UUID]; + + if (ubuntuDock && ubuntuDock.stateObj && ubuntuDock.stateObj.dockManager) { + // Disable Ubuntu Dock + let extensionOrder = (extensionSystem.extensionOrder || extensionSystem._extensionOrder); + + Utils.getStageTheme().get_theme().unload_stylesheet(ubuntuDock.stylesheet); + ubuntuDock.stateObj.disable(); + disabledUbuntuDock = true; + ubuntuDock.state = 2; //ExtensionState.DISABLED + extensionOrder.splice(extensionOrder.indexOf(UBUNTU_DOCK_UUID), 1); + + //reset to prevent conflicts with the ubuntu-dock + if (panelManager) { + disable(true); + } + } + + if (panelManager) return; //already initialized + + Me.settings = Convenience.getSettings('org.gnome.shell.extensions.dash-to-panel'); + Me.desktopSettings = Convenience.getSettings('org.gnome.desktop.interface'); + + Main.layoutManager.startInOverview = !Me.settings.get_boolean('hide-overview-on-startup'); + + if (Me.settings.get_boolean('hide-overview-on-startup') && Main.layoutManager._startingUp) { + Main.sessionMode.hasOverview = false; + Main.layoutManager.connect('startup-complete', () => { + Main.sessionMode.hasOverview = this._realHasOverview + }); + } + + panelManager = new PanelManager.dtpPanelManager(); + + panelManager.enable(); + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(this, function() { + if(Me.settings.get_boolean('show-appmenu')) + Main.wm._toggleAppMenu(); + else + panelManager.primaryPanel.taskbar.popupFocusedAppSecondaryMenu(); + }), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP + ); +} + +function disable(reset) { + panelManager.disable(); + Me.settings.run_dispose(); + Me.desktopSettings.run_dispose(); + + delete Me.settings; + panelManager = null; + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(Main.wm, Main.wm._toggleAppMenu), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP + ); + + if (!reset) { + extensionSystem.disconnect(extensionChangedHandler); + delete global.dashToPanel; + + // Re-enable Ubuntu Dock if it was disabled by dash to panel + if (disabledUbuntuDock && Main.sessionMode.allowExtensions) { + (extensionSystem._callExtensionEnable || extensionSystem.enableExtension).call(extensionSystem, UBUNTU_DOCK_UUID); + } + } + + Main.sessionMode.hasOverview = this._realHasOverview; +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg new file mode 100644 index 0000000..977146b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg new file mode 100644 index 0000000..47aa802 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg new file mode 100644 index 0000000..80420fd --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js new file mode 100644 index 0000000..8fb1e97 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/intellihide.js @@ -0,0 +1,401 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Lang = imports.lang; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +var GrabHelper = imports.ui.grabHelper; +const Layout = imports.ui.layout; +const Main = imports.ui.main; +const OverviewControls = imports.ui.overviewControls; +const PointerWatcher = imports.ui.pointerWatcher; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +//timeout intervals +const CHECK_POINTER_MS = 200; +const CHECK_GRAB_MS = 400; +const POST_ANIMATE_MS = 50; +const MIN_UPDATE_MS = 250; + +//timeout names +const T1 = 'checkGrabTimeout'; +const T2 = 'limitUpdateTimeout'; +const T3 = 'postAnimateTimeout'; +const T4 = 'panelBoxClipTimeout'; + +var SIDE_CONTROLS_ANIMATION_TIME = OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / (OverviewControls.SIDE_CONTROLS_ANIMATION_TIME > 1 ? 1000 : 1); + +var Hold = { + NONE: 0, + TEMPORARY: 1, + PERMANENT: 2 +}; + +var Intellihide = Utils.defineClass({ + Name: 'DashToPanel.Intellihide', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this._panelBox = dtpPanel.panelBox; + this._panelManager = dtpPanel.panelManager; + this._proximityManager = this._panelManager.proximityManager; + this._holdStatus = Hold.NONE; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._intellihideChangedId = Me.settings.connect('changed::intellihide', () => this._changeEnabledStatus()); + this._intellihideOnlySecondaryChangedId = Me.settings.connect('changed::intellihide-only-secondary', () => this._changeEnabledStatus()); + + this.enabled = false; + this._changeEnabledStatus(); + }, + + enable: function() { + this.enabled = true; + this._monitor = this._dtpPanel.monitor; + this._animationDestination = -1; + this._pendingUpdate = false; + this._hoveredOut = false; + this._windowOverlap = false; + this._translationProp = 'translation_' + (this._dtpPanel.checkIfVertical() ? 'x' : 'y'); + + this._panelBox.translation_y = 0; + this._panelBox.translation_x = 0; + + this._setTrackPanel(true); + this._bindGeneralSignals(); + + if (Me.settings.get_boolean('intellihide-hide-from-windows')) { + this._proximityWatchId = this._proximityManager.createWatch( + this._panelBox.get_parent(), + Proximity.Mode[Me.settings.get_string('intellihide-behaviour')], + 0, 0, + overlap => { + this._windowOverlap = overlap; + this._queueUpdatePanelPosition(); + } + ); + } + + this._setRevealMechanism(); + this._queueUpdatePanelPosition(); + }, + + disable: function(reset) { + if (this._proximityWatchId) { + this._proximityManager.removeWatch(this._proximityWatchId); + } + + this._setTrackPanel(false); + + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + + this._removeRevealMechanism(); + + this._revealPanel(!reset); + + this.enabled = false; + }, + + destroy: function() { + Me.settings.disconnect(this._intellihideChangedId); + Me.settings.disconnect(this._intellihideOnlySecondaryChangedId); + + if (this.enabled) { + this.disable(); + } + }, + + toggle: function() { + this[this._holdStatus & Hold.PERMANENT ? 'release' : 'revealAndHold'](Hold.PERMANENT); + }, + + revealAndHold: function(holdStatus) { + if (this.enabled && !this._holdStatus) { + this._revealPanel(); + } + + this._holdStatus |= holdStatus; + }, + + release: function(holdStatus) { + this._holdStatus -= holdStatus; + + if (this.enabled && !this._holdStatus) { + this._queueUpdatePanelPosition(); + } + }, + + reset: function() { + this.disable(true); + this.enable(); + }, + + _changeEnabledStatus: function() { + let intellihide = Me.settings.get_boolean('intellihide'); + let onlySecondary = Me.settings.get_boolean('intellihide-only-secondary'); + let enabled = intellihide && !(this._dtpPanel.isPrimary && onlySecondary); + + if (this.enabled !== enabled) { + this[enabled ? 'enable' : 'disable'](); + } + }, + + _bindGeneralSignals: function() { + this._signalsHandler.add( + [ + this._dtpPanel.taskbar, + 'menu-closed', + () => this._panelBox.sync_hover() + ], + [ + Me.settings, + [ + 'changed::intellihide-use-pressure', + 'changed::intellihide-hide-from-windows', + 'changed::intellihide-behaviour', + 'changed::intellihide-pressure-threshold', + 'changed::intellihide-pressure-time' + ], + () => this.reset() + ], + [ + this._panelBox, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._dtpPanel.taskbar.previewMenu, + 'open-state-changed', + () => this._queueUpdatePanelPosition() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._queueUpdatePanelPosition() + ] + ); + }, + + _onHoverChanged: function() { + this._hoveredOut = !this._panelBox.hover; + this._queueUpdatePanelPosition(); + }, + + _setTrackPanel: function(enable) { + let trackedIndex = Main.layoutManager._findActor(this._panelBox); + let actorData = Main.layoutManager._trackedActors[trackedIndex] + + actorData.affectsStruts = !enable; + actorData.trackFullscreen = !enable; + + this._panelBox.track_hover = enable; + this._panelBox.reactive = enable; + this._panelBox.visible = enable ? enable : this._panelBox.visible; + + Main.layoutManager._queueUpdateRegions(); + }, + + _setRevealMechanism: function() { + if (global.display.supports_extended_barriers() && Me.settings.get_boolean('intellihide-use-pressure')) { + this._edgeBarrier = this._createBarrier(); + this._pressureBarrier = new Layout.PressureBarrier( + Me.settings.get_int('intellihide-pressure-threshold'), + Me.settings.get_int('intellihide-pressure-time'), + Shell.ActionMode.NORMAL + ); + this._pressureBarrier.addBarrier(this._edgeBarrier); + this._signalsHandler.add([this._pressureBarrier, 'trigger', () => this._queueUpdatePanelPosition(true)]); + } else { + this._pointerWatch = PointerWatcher.getPointerWatcher() + .addWatch(CHECK_POINTER_MS, (x, y) => this._checkMousePointer(x, y)); + } + }, + + _removeRevealMechanism: function() { + if (this._pointerWatch) { + PointerWatcher.getPointerWatcher()._removeWatch(this._pointerWatch); + } + + if (this._pressureBarrier) { + this._pressureBarrier.destroy(); + this._edgeBarrier.destroy(); + } + }, + + _createBarrier: function() { + let position = this._dtpPanel.geom.position; + let opts = { display: global.display }; + + if (this._dtpPanel.checkIfVertical()) { + opts.y1 = this._monitor.y; + opts.y2 = this._monitor.y + this._monitor.height; + opts.x1 = opts.x2 = this._monitor.x; + } else { + opts.x1 = this._monitor.x; + opts.x2 = this._monitor.x + this._monitor.width; + opts.y1 = opts.y2 = this._monitor.y; + } + + if (position == St.Side.TOP) { + opts.directions = Meta.BarrierDirection.POSITIVE_Y; + } else if (position == St.Side.BOTTOM) { + opts.y1 = opts.y2 = opts.y1 + this._monitor.height; + opts.directions = Meta.BarrierDirection.NEGATIVE_Y; + } else if (position == St.Side.LEFT) { + opts.directions = Meta.BarrierDirection.POSITIVE_X; + } else { + opts.x1 = opts.x2 = opts.x1 + this._monitor.width; + opts.directions = Meta.BarrierDirection.NEGATIVE_X; + } + + return new Meta.Barrier(opts); + }, + + _checkMousePointer: function(x, y) { + let position = this._dtpPanel.geom.position; + + if (!this._panelBox.hover && !Main.overview.visible && + ((position == St.Side.TOP && y <= this._monitor.y + 1) || + (position == St.Side.BOTTOM && y >= this._monitor.y + this._monitor.height - 1) || + (position == St.Side.LEFT && x <= this._monitor.x + 1) || + (position == St.Side.RIGHT && x >= this._monitor.x + this._monitor.width - 1)) && + ((x >= this._monitor.x && x < this._monitor.x + this._monitor.width) && + (y >= this._monitor.y && y < this._monitor.y + this._monitor.height))) { + this._queueUpdatePanelPosition(true); + } + }, + + _queueUpdatePanelPosition: function(fromRevealMechanism) { + if (!fromRevealMechanism && this._timeoutsHandler.getId(T2) && !Main.overview.visible) { + //unless this is a mouse interaction or entering/leaving the overview, limit the number + //of updates, but remember to update again when the limit timeout is reached + this._pendingUpdate = true; + } else if (!this._holdStatus) { + this._checkIfShouldBeVisible(fromRevealMechanism) ? this._revealPanel() : this._hidePanel(); + this._timeoutsHandler.add([T2, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + } + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdatePanelPosition(); + } + }, + + _checkIfShouldBeVisible: function(fromRevealMechanism) { + if (Main.overview.visibleTarget || this._dtpPanel.taskbar.previewMenu.opened || + this._panelBox.get_hover() || this._checkIfGrab()) { + return true; + } + + if (fromRevealMechanism) { + let mouseBtnIsPressed = global.get_pointer()[2] & Clutter.ModifierType.BUTTON1_MASK; + + //the user is trying to reveal the panel + if (this._monitor.inFullscreen && !mouseBtnIsPressed) { + return Me.settings.get_boolean('intellihide-show-in-fullscreen'); + } + + return !mouseBtnIsPressed; + } + + if (!Me.settings.get_boolean('intellihide-hide-from-windows')) { + return this._panelBox.hover; + } + + return !this._windowOverlap; + }, + + _checkIfGrab: function() { + if (GrabHelper._grabHelperStack.some(gh => gh._owner == this._dtpPanel.panel.actor)) { + //there currently is a grab on a child of the panel, check again soon to catch its release + this._timeoutsHandler.add([T1, CHECK_GRAB_MS, () => this._queueUpdatePanelPosition()]); + + return true; + } + }, + + _revealPanel: function(immediate) { + if (!this._panelBox.visible) { + this._panelBox.visible = true; + this._dtpPanel.taskbar._shownInitially = false; + } + + this._animatePanel(0, immediate); + }, + + _hidePanel: function(immediate) { + let position = this._dtpPanel.geom.position; + let size = this._panelBox[position == St.Side.LEFT || position == St.Side.RIGHT ? 'width' : 'height']; + let coefficient = position == St.Side.TOP || position == St.Side.LEFT ? -1 : 1; + + this._animatePanel(size * coefficient, immediate); + }, + + _animatePanel: function(destination, immediate) { + let animating = Utils.isAnimating(this._panelBox, this._translationProp); + + if (!((animating && destination === this._animationDestination) || + (!animating && destination === this._panelBox[this._translationProp]))) { + //the panel isn't already at, or animating to the asked destination + if (animating) { + Utils.stopAnimations(this._panelBox); + } + + this._animationDestination = destination; + + if (immediate) { + this._panelBox[this._translationProp] = destination; + this._panelBox.visible = !destination; + } else { + let tweenOpts = { + //when entering/leaving the overview, use its animation time instead of the one from the settings + time: Main.overview.visible ? + SIDE_CONTROLS_ANIMATION_TIME : + Me.settings.get_int('intellihide-animation-time') * 0.001, + //only delay the animation when hiding the panel after the user hovered out + delay: destination != 0 && this._hoveredOut ? Me.settings.get_int('intellihide-close-delay') * 0.001 : 0, + transition: 'easeOutQuad', + onComplete: () => { + this._panelBox.visible = !destination; + Main.layoutManager._queueUpdateRegions(); + this._timeoutsHandler.add([T3, POST_ANIMATE_MS, () => this._queueUpdatePanelPosition()]); + } + }; + + tweenOpts[this._translationProp] = destination; + Utils.animate(this._panelBox, tweenOpts); + } + } + + this._hoveredOut = false; + }, +}); \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..8425f68f480807a0f85b51fb2a7812ad4271e863 GIT binary patch literal 23608 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..86da0901734cccffb3c9738613df62e63e2ac9d7 GIT binary patch literal 23744 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..7a5af2f7f27f2c1482a9cf432d36a09b553e7585 GIT binary patch literal 24908 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..70da5fa6ab1ea329c3990f04d36aa469bbbe7059 GIT binary patch literal 25001 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..f52e89a0a8e4dc2cab4c719004e41f0905b9e154 GIT binary patch literal 25609 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 LJEN#}&g=dQ{A}HA literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..2fd26daf6b08acccdb555c361278dd1daea97deb GIT binary patch literal 26323 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 D&K29v literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..c467e930366da9b24cce69ef6718e8a372680f0d GIT binary patch literal 28449 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..3bd1a468cae2b0bec1f917166717c28cb417707d GIT binary patch literal 27840 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 bzfGO#w`?@otzfvWcr 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�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 EKhimw=>Px# literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..e7cacbb732e3e62a95da290aa525c5ba835b14f3 GIT binary patch literal 24167 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..3bc58a5277609d714b9d95054126090ad7ae9411 GIT binary patch literal 24795 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 UNiY_TBqRR5pQwQi;B4pr1AQs8b^rhX literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..29933049b93eea13da4d170ca1ab1f716912de07 GIT binary patch literal 10635 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 literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo new file mode 100644 index 0000000000000000000000000000000000000000..ed1cc6da97db5f57d6297e3959e1f1e3011de329 GIT binary patch literal 19323 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 Titlebar Buttons > Minimize & Maximize.\n\nFor the best support, please report any issues on Github. Dash-to-panel is developed and maintained by @jderose9 and @charlesg99.", + "extension-id": "dash-to-panel", + "gettext-domain": "dash-to-panel", + "name": "Dash to Panel", + "shell-version": [ + "40" + ], + "url": "https://github.com/home-sweet-gnome/dash-to-panel", + "uuid": "dash-to-panel@jderose9.github.com", + "version": 44 +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js new file mode 100644 index 0000000..57600a5 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/overview.js @@ -0,0 +1,708 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Intellihide = Me.imports.intellihide; +const Utils = Me.imports.utils; + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Lang = imports.lang; +const Main = imports.ui.main; +const Shell = imports.gi.Shell; +const Gtk = imports.gi.Gtk; +const Gdk = imports.gi.Gdk; +const Gio = imports.gi.Gio; +const Mainloop = imports.mainloop; +const IconGrid = imports.ui.iconGrid; +const OverviewControls = imports.ui.overviewControls; +const Workspace = imports.ui.workspace; +const St = imports.gi.St; +const WorkspaceThumbnail = imports.ui.workspaceThumbnail; + +const Meta = imports.gi.Meta; + +const GS_HOTKEYS_KEY = 'switch-to-application-'; +const BACKGROUND_MARGIN = 12; +const SMALL_WORKSPACE_RATIO = 0.15; +const DASH_MAX_HEIGHT_RATIO = 0.15; + + +//timeout names +const T1 = 'swipeEndTimeout'; + +var dtpOverview = Utils.defineClass({ + Name: 'DashToPanel.Overview', + + _init: function() { + this._numHotkeys = 10; + this._timeoutsHandler = new Utils.TimeoutsHandler(); + }, + + enable : function(panel) { + this._panel = panel; + this.taskbar = panel.taskbar; + + this._injectionsHandler = new Utils.InjectionsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._optionalWorkspaceIsolation(); + this._optionalHotKeys(); + this._optionalNumberOverlay(); + this._optionalClickToExit(); + this._toggleDash(); + this._hookupAllocation(); + + this._signalsHandler.add([ + Me.settings, + 'changed::stockgs-keep-dash', + () => this._toggleDash() + ]); + + }, + + disable: function () { + Utils.hookVfunc(Workspace.WorkspaceBackground.prototype, 'allocate', Workspace.WorkspaceBackground.prototype.vfunc_allocate); + Utils.hookVfunc(OverviewControls.ControlsManagerLayout.prototype, 'allocate', OverviewControls.ControlsManagerLayout.prototype.vfunc_allocate); + OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState = this._oldComputeWorkspacesBoxForState; + + this._signalsHandler.destroy(); + this._injectionsHandler.destroy(); + + this._toggleDash(true); + + // Remove key bindings + this._disableHotKeys(); + this._disableExtraShortcut(); + this._disableClickToExit(); + }, + + _toggleDash: function(visible) { + // To hide the dash, set its width to 1, so it's almost not taken into account by code + // calculaing the reserved space in the overview. The reason to keep it at 1 is + // to allow its visibility change to trigger an allocaion of the appGrid which + // in turn is triggergin the appsIcon spring animation, required when no other + // actors has this effect, i.e in horizontal mode and without the workspaceThumnails + // 1 static workspace only) + + if (visible === undefined) { + visible = Me.settings.get_boolean('stockgs-keep-dash'); + } + + let visibilityFunc = visible ? 'show' : 'hide'; + let width = visible ? -1 : 1; + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + + overviewControls.dash.actor[visibilityFunc](); + overviewControls.dash.actor.set_width(width); + + // This force the recalculation of the icon size + overviewControls.dash._maxHeight = -1; + }, + + /** + * Isolate overview to open new windows for inactive apps + */ + _optionalWorkspaceIsolation: function() { + let label = 'optionalWorkspaceIsolation'; + + this._signalsHandler.add([ + Me.settings, + 'changed::isolate-workspaces', + Lang.bind(this, function() { + this._panel.panelManager.allPanels.forEach(p => p.taskbar.resetAppIcons()); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + else + Lang.bind(this, disable)(); + }) + ]); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + + function enable() { + this._injectionsHandler.removeWithLabel(label); + + this._injectionsHandler.addWithLabel(label, [ + Shell.App.prototype, + 'activate', + IsolatedOverview + ]); + + this._signalsHandler.removeWithLabel(label); + + this._signalsHandler.addWithLabel(label, [ + global.window_manager, + 'switch-workspace', + () => this._panel.panelManager.allPanels.forEach(p => p.taskbar.handleIsolatedWorkspaceSwitch()) + ]); + } + + function disable() { + this._signalsHandler.removeWithLabel(label); + this._injectionsHandler.removeWithLabel(label); + } + + function IsolatedOverview() { + // These lines take care of Nautilus for icons on Desktop + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = this.get_windows().filter(w => w.get_workspace().index() == activeWorkspace.index()); + + if (windows.length > 0 && + (!(windows.length == 1 && windows[0].skip_taskbar) || + this.is_on_workspace(activeWorkspace))) + return Main.activateWindow(windows[0]); + + return this.open_new_window(-1); + } + }, + + // Hotkeys + _activateApp: function(appIndex) { + let seenApps = {}; + let apps = []; + + this.taskbar._getAppIcons().forEach(function(appIcon) { + if (!seenApps[appIcon.app]) { + apps.push(appIcon); + } + + seenApps[appIcon.app] = (seenApps[appIcon.app] || 0) + 1; + }); + + this._showOverlay(); + + if (appIndex < apps.length) { + let appIcon = apps[appIndex]; + let seenAppCount = seenApps[appIcon.app]; + let windowCount = appIcon.window || appIcon._hotkeysCycle ? seenAppCount : appIcon._nWindows; + + if (Me.settings.get_boolean('shortcut-previews') && windowCount > 1 && + !(Clutter.get_current_event().get_state() & ~(Clutter.ModifierType.MOD1_MASK | Clutter.ModifierType.MOD4_MASK))) { //ignore the alt (MOD1_MASK) and super key (MOD4_MASK) + if (this._hotkeyPreviewCycleInfo && this._hotkeyPreviewCycleInfo.appIcon != appIcon) { + this._endHotkeyPreviewCycle(); + } + + if (!this._hotkeyPreviewCycleInfo) { + this._hotkeyPreviewCycleInfo = { + appIcon: appIcon, + currentWindow: appIcon.window, + keyFocusOutId: appIcon.actor.connect('key-focus-out', () => appIcon.actor.grab_key_focus()), + capturedEventId: global.stage.connect('captured-event', (actor, e) => { + if (e.type() == Clutter.EventType.KEY_RELEASE && e.get_key_symbol() == (Clutter.KEY_Super_L || Clutter.Super_L)) { + this._endHotkeyPreviewCycle(true); + } + + return Clutter.EVENT_PROPAGATE; + }) + }; + + appIcon._hotkeysCycle = appIcon.window; + appIcon.window = null; + appIcon._previewMenu.open(appIcon); + appIcon.actor.grab_key_focus(); + } + + appIcon._previewMenu.focusNext(); + } else { + // Activate with button = 1, i.e. same as left click + let button = 1; + this._endHotkeyPreviewCycle(); + appIcon.activate(button, true); + } + } + }, + + _endHotkeyPreviewCycle: function(focusWindow) { + if (this._hotkeyPreviewCycleInfo) { + global.stage.disconnect(this._hotkeyPreviewCycleInfo.capturedEventId); + this._hotkeyPreviewCycleInfo.appIcon.actor.disconnect(this._hotkeyPreviewCycleInfo.keyFocusOutId); + + if (focusWindow) { + this._hotkeyPreviewCycleInfo.appIcon._previewMenu.activateFocused(); + } + + this._hotkeyPreviewCycleInfo.appIcon.window = this._hotkeyPreviewCycleInfo.currentWindow; + delete this._hotkeyPreviewCycleInfo.appIcon._hotkeysCycle; + this._hotkeyPreviewCycleInfo = 0; + } + }, + + _optionalHotKeys: function() { + this._hotKeysEnabled = false; + if (Me.settings.get_boolean('hot-keys')) + this._enableHotKeys(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys')) + Lang.bind(this, this._enableHotKeys)(); + else + Lang.bind(this, this._disableHotKeys)(); + }) + ]); + }, + + _resetHotkeys: function() { + this._disableHotKeys(); + this._enableHotKeys(); + }, + + _enableHotKeys: function() { + if (this._hotKeysEnabled) + return; + + //3.32 introduced app hotkeys, disable them to prevent conflicts + if (Main.wm._switchToApplication) { + for (let i = 1; i < 10; ++i) { + Utils.removeKeybinding(GS_HOTKEYS_KEY + i); + } + } + + // Setup keyboard bindings for taskbar elements + let shortcutNumKeys = Me.settings.get_string('shortcut-num-keys'); + let bothNumKeys = shortcutNumKeys == 'BOTH'; + let keys = []; + + if (bothNumKeys || shortcutNumKeys == 'NUM_ROW') { + keys.push('app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-'); // Regular numbers + } + + if (bothNumKeys || shortcutNumKeys == 'NUM_KEYPAD') { + keys.push('app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-'); // Key-pad numbers + } + + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) { + let appNum = i; + + Utils.addKeybinding(key + (i + 1), Me.settings, () => this._activateApp(appNum)); + } + }, this); + + this._hotKeysEnabled = true; + + if (Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(true); + }, + + _disableHotKeys: function() { + if (!this._hotKeysEnabled) + return; + + let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-', // Regular numbers + 'app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-']; // Key-pad numbers + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) { + Utils.removeKeybinding(key + (i + 1)); + } + }, this); + + if (Main.wm._switchToApplication) { + let gsSettings = new Gio.Settings({ schema_id: imports.ui.windowManager.SHELL_KEYBINDINGS_SCHEMA }); + + for (let i = 1; i < 10; ++i) { + Utils.addKeybinding(GS_HOTKEYS_KEY + i, gsSettings, Main.wm._switchToApplication.bind(Main.wm)); + } + } + + this._hotKeysEnabled = false; + + this.taskbar.toggleNumberOverlay(false); + }, + + _optionalNumberOverlay: function() { + // Enable extra shortcut + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, this._checkHotkeysOptions) + ], [ + Me.settings, + 'changed::hotkeys-overlay-combo', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys') && Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(true); + else + this.taskbar.toggleNumberOverlay(false); + }) + ], [ + Me.settings, + 'changed::shortcut-num-keys', + () => this._resetHotkeys() + ]); + }, + + _checkHotkeysOptions: function() { + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + else + this._disableExtraShortcut(); + }, + + _enableExtraShortcut: function() { + Utils.addKeybinding('shortcut', Me.settings, () => this._showOverlay(true)); + }, + + _disableExtraShortcut: function() { + Utils.removeKeybinding('shortcut'); + }, + + _showOverlay: function(overlayFromShortcut) { + //wait for intellihide timeout initialization + if (!this._panel.intellihide) { + return; + } + + // Restart the counting if the shortcut is pressed again + if (this._numberOverlayTimeoutId) { + Mainloop.source_remove(this._numberOverlayTimeoutId); + this._numberOverlayTimeoutId = 0; + } + + let hotkey_option = Me.settings.get_string('hotkeys-overlay-combo'); + + if (hotkey_option === 'NEVER') + return; + + if (hotkey_option === 'TEMPORARILY' || overlayFromShortcut) + this.taskbar.toggleNumberOverlay(true); + + this._panel.intellihide.revealAndHold(Intellihide.Hold.TEMPORARY); + + let timeout = Me.settings.get_int('overlay-timeout'); + + if (overlayFromShortcut) { + timeout = Me.settings.get_int('shortcut-timeout'); + } + + // Hide the overlay/dock after the timeout + this._numberOverlayTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, function() { + this._numberOverlayTimeoutId = 0; + + if (hotkey_option != 'ALWAYS') { + this.taskbar.toggleNumberOverlay(false); + } + + this._panel.intellihide.release(Intellihide.Hold.TEMPORARY); + })); + }, + + _optionalClickToExit: function() { + this._clickToExitEnabled = false; + if (Me.settings.get_boolean('overview-click-to-exit')) + this._enableClickToExit(); + + this._signalsHandler.add([ + Me.settings, + 'changed::overview-click-to-exit', + Lang.bind(this, function() { + if (Me.settings.get_boolean('overview-click-to-exit')) + Lang.bind(this, this._enableClickToExit)(); + else + Lang.bind(this, this._disableClickToExit)(); + }) + ]); + }, + + _enableClickToExit: function() { + if (this._clickToExitEnabled) + return; + + let view = imports.ui.appDisplay; + this._oldOverviewReactive = Main.overview._overview.reactive + + Main.overview._overview.reactive = true; + + this._clickAction = new Clutter.ClickAction(); + this._clickAction.connect('clicked', () => { + + if (this._swiping) + return Clutter.EVENT_PROPAGATE; + + let [x, y] = global.get_pointer(); + let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); + + Main.overview.toggle(); + }); + Main.overview._overview.add_action(this._clickAction); + + this._clickToExitEnabled = true; + }, + + _disableClickToExit: function () { + if (!this._clickToExitEnabled) + return; + + Main.overview._overview.remove_action(this._clickAction); + Main.overview._overview.reactive = this._oldOverviewReactive; + + this._signalsHandler.removeWithLabel('clickToExit'); + + this._clickToExitEnabled = false; + }, + + _onSwipeBegin: function() { + this._swiping = true; + return true; + }, + + _onSwipeEnd: function() { + this._timeoutsHandler.add([ + T1, + 0, + () => this._swiping = false + ]); + return true; + }, + + _hookupAllocation: function() { + Utils.hookVfunc(OverviewControls.ControlsManagerLayout.prototype, 'allocate', function vfunc_allocate(container, box) { + const childBox = new Clutter.ActorBox(); + + const { spacing } = this; + + let startY = 0; + let startX = 0; + + if (Me.settings.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.panelBox.y === Main.layoutManager.primaryMonitor.y) { + startY = Main.layoutManager.panelBox.height; + box.y1 += startY; + } + + const panel = global.dashToPanel.panels[0]; + if(panel) { + switch (panel.getPosition()) { + case St.Side.TOP: + startY = panel.panelBox.height; + box.y1 += startY; + break; + case St.Side.LEFT: + startX = panel.panelBox.width; + box.x1 += startX; + break; + case St.Side.RIGHT: + box.x2 -= panel.panelBox.width; + break; + + } + } + + + const [width, height] = box.get_size(); + let availableHeight = height; + + // Search entry + let [searchHeight] = this._searchEntry.get_preferred_height(width); + childBox.set_origin(startX, startY); + childBox.set_size(width, searchHeight); + this._searchEntry.allocate(childBox); + + availableHeight -= searchHeight + spacing; + + // Dash + const maxDashHeight = Math.round(box.get_height() * DASH_MAX_HEIGHT_RATIO); + this._dash.setMaxSize(width, maxDashHeight); + + let [, dashHeight] = this._dash.get_preferred_height(width); + if (Me.settings.get_boolean('stockgs-keep-dash')) + dashHeight = Math.min(dashHeight, maxDashHeight); + else + dashHeight = spacing*5; // todo: determine proper spacing for window labels on maximized windows on workspace display + childBox.set_origin(startX, startY + height - dashHeight); + childBox.set_size(width, dashHeight); + this._dash.allocate(childBox); + + availableHeight -= dashHeight + spacing; + + // Workspace Thumbnails + let thumbnailsHeight = 0; + if (this._workspacesThumbnails.visible) { + const { expandFraction } = this._workspacesThumbnails; + [thumbnailsHeight] = + this._workspacesThumbnails.get_preferred_height(width); + thumbnailsHeight = Math.min( + thumbnailsHeight * expandFraction, + height * WorkspaceThumbnail.MAX_THUMBNAIL_SCALE); + childBox.set_origin(startX, startY + searchHeight + spacing); + childBox.set_size(width, thumbnailsHeight); + this._workspacesThumbnails.allocate(childBox); + } + + // Workspaces + let params = [box, startX, startY, searchHeight, dashHeight, thumbnailsHeight]; + const transitionParams = this._stateAdjustment.getStateTransitionParams(); + + // Update cached boxes + for (const state of Object.values(OverviewControls.ControlsState)) { + this._cachedWorkspaceBoxes.set( + state, this._computeWorkspacesBoxForState(state, ...params)); + } + + let workspacesBox; + if (!transitionParams.transitioning) { + workspacesBox = this._cachedWorkspaceBoxes.get(transitionParams.currentState); + } else { + const initialBox = this._cachedWorkspaceBoxes.get(transitionParams.initialState); + const finalBox = this._cachedWorkspaceBoxes.get(transitionParams.finalState); + workspacesBox = initialBox.interpolate(finalBox, transitionParams.progress); + } + + this._workspacesDisplay.allocate(workspacesBox); + + // AppDisplay + if (this._appDisplay.visible) { + const workspaceAppGridBox = + this._cachedWorkspaceBoxes.get(OverviewControls.ControlsState.APP_GRID); + + if (Config.PACKAGE_VERSION > '40.3') { + const monitor = Main.layoutManager.findMonitorForActor(this._container); + const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index); + const workAreaBox = new Clutter.ActorBox(); + + workAreaBox.set_origin(startX, startY); + workAreaBox.set_size(workArea.width, workArea.height); + + params = [workAreaBox, searchHeight, dashHeight, workspaceAppGridBox] + } else { + params = [box, startX, searchHeight, dashHeight, workspaceAppGridBox]; + } + + let appDisplayBox; + if (!transitionParams.transitioning) { + appDisplayBox = + this._getAppDisplayBoxForState(transitionParams.currentState, ...params); + } else { + const initialBox = + this._getAppDisplayBoxForState(transitionParams.initialState, ...params); + const finalBox = + this._getAppDisplayBoxForState(transitionParams.finalState, ...params); + + appDisplayBox = initialBox.interpolate(finalBox, transitionParams.progress); + } + + this._appDisplay.allocate(appDisplayBox); + } + + // Search + childBox.set_origin(0, startY + searchHeight + spacing); + childBox.set_size(width, availableHeight); + + this._searchController.allocate(childBox); + + this._runPostAllocation(); + }); + + this._oldComputeWorkspacesBoxForState = OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState; + OverviewControls.ControlsManagerLayout.prototype._computeWorkspacesBoxForState = function _computeWorkspacesBoxForState(state, box, startX, startY, searchHeight, dashHeight, thumbnailsHeight) { + const workspaceBox = box.copy(); + const [width, height] = workspaceBox.get_size(); + const { spacing } = this; + const { expandFraction } = this._workspacesThumbnails; + + switch (state) { + case OverviewControls.ControlsState.HIDDEN: + break; + case OverviewControls.ControlsState.WINDOW_PICKER: + workspaceBox.set_origin(startX, + startY + searchHeight + spacing + + thumbnailsHeight + spacing * expandFraction); + workspaceBox.set_size(width, + height - + dashHeight - spacing - + searchHeight - spacing - + thumbnailsHeight - spacing * expandFraction); + break; + case OverviewControls.ControlsState.APP_GRID: + workspaceBox.set_origin(startX, startY + searchHeight + spacing); + workspaceBox.set_size( + width, + Math.round(height * SMALL_WORKSPACE_RATIO)); + break; + } + + return workspaceBox; + } + + Utils.hookVfunc(Workspace.WorkspaceBackground.prototype, 'allocate', function vfunc_allocate(box) { + const [width, height] = box.get_size(); + const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage); + const scaledHeight = height - (BACKGROUND_MARGIN * 2 * scaleFactor); + const scaledWidth = (scaledHeight / height) * width; + + const scaledBox = box.copy(); + scaledBox.set_origin( + box.x1 + (width - scaledWidth) / 2, + box.y1 + (height - scaledHeight) / 2); + scaledBox.set_size(scaledWidth, scaledHeight); + + const progress = this._stateAdjustment.value; + + if (progress === 1) + box = scaledBox; + else if (progress !== 0) + box = box.interpolate(scaledBox, progress); + + this.set_allocation(box); + + const themeNode = this.get_theme_node(); + const contentBox = themeNode.get_content_box(box); + + this._bin.allocate(contentBox); + + + const [contentWidth, contentHeight] = contentBox.get_size(); + const monitor = Main.layoutManager.monitors[this._monitorIndex]; + let xOff = (contentWidth / this._workarea.width) * + (this._workarea.x - monitor.x); + let yOff = (contentHeight / this._workarea.height) * + (this._workarea.y - monitor.y); + + let startX = -xOff; + let startY = -yOff; + const panel = Utils.find(global.dashToPanel.panels, p => p.monitor.index == this._monitorIndex); + switch (panel.getPosition()) { + case St.Side.TOP: + yOff += panel.panelBox.height; + startY -= panel.panelBox.height; + break; + case St.Side.BOTTOM: + yOff += panel.panelBox.height; + break; + case St.Side.RIGHT: + xOff += panel.panelBox.width; + break; + } + contentBox.set_origin(startX, startY); + contentBox.set_size(xOff + contentWidth, yOff + contentHeight); + this._backgroundGroup.allocate(contentBox); + }); + + } +}); diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js new file mode 100644 index 0000000..5e0b5f9 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panel.js @@ -0,0 +1,1512 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Gtk = imports.gi.Gtk; +const Gi = imports._gi; +const AppIcons = Me.imports.appIcons; +const Utils = Me.imports.utils; +const Taskbar = Me.imports.taskbar; +const Pos = Me.imports.panelPositions; +const PanelSettings = Me.imports.panelSettings; +const PanelStyle = Me.imports.panelStyle; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const Dash = imports.ui.dash; +const CtrlAltTab = imports.ui.ctrlAltTab; +const Panel = imports.ui.panel; +const PanelMenu = imports.ui.panelMenu; +const St = imports.gi.St; +const GLib = imports.gi.GLib; +const Meta = imports.gi.Meta; +const Pango = imports.gi.Pango; +const DND = imports.ui.dnd; +const Shell = imports.gi.Shell; +const PopupMenu = imports.ui.popupMenu; +const IconGrid = imports.ui.iconGrid; +const DateMenu = imports.ui.dateMenu; +const Volume = imports.ui.status.volume; +const Progress = Me.imports.progress; + +const Intellihide = Me.imports.intellihide; +const Transparency = Me.imports.transparency; +const _ = imports.gettext.domain(Me.imports.utils.TRANSLATION_DOMAIN).gettext; + +let tracker = Shell.WindowTracker.get_default(); +var panelBoxes = ['_leftBox', '_centerBox', '_rightBox']; + +//timeout names +const T1 = 'startDynamicTransparencyTimeout'; +const T2 = 'startIntellihideTimeout'; +const T3 = 'allocationThrottleTimeout'; +const T4 = 'showDesktopTimeout'; +const T5 = 'trackerFocusAppTimeout'; +const T6 = 'scrollPanelDelayTimeout'; +const T7 = 'waitPanelBoxAllocation'; + +var dtpPanel = Utils.defineClass({ + Name: 'DashToPanel-Panel', + Extends: St.Widget, + + _init: function(panelManager, monitor, panelBox, isStandalone) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this.panelManager = panelManager; + this.panelStyle = new PanelStyle.dtpPanelStyle(); + + this.monitor = monitor; + this.panelBox = panelBox; + + // when the original gnome-shell top panel is kept, all panels are "standalone", + // so in this case use isPrimary to get the panel on the primary dtp monitor, which + // might be different from the system's primary monitor. + this.isStandalone = isStandalone; + this.isPrimary = !isStandalone || (Me.settings.get_boolean('stockgs-keep-top-panel') && + monitor == panelManager.dtpPrimaryMonitor); + + this._sessionStyle = null; + this._unmappedButtons = []; + this._elementGroups = []; + this.cornerSize = 0; + + let position = this.getPosition(); + + if (isStandalone) { + this.panel = new dtpSecondaryPanel({ name: 'panel', reactive: true }); + this.statusArea = this.panel.statusArea = {}; + + Utils.wrapActor(this.panel); + + //next 3 functions are needed by other extensions to add elements to the secondary panel + this.panel.addToStatusArea = function(role, indicator, position, box) { + return Main.panel.addToStatusArea.call(this, role, indicator, position, box); + }; + + this.panel._addToPanelBox = function(role, indicator, position, box) { + Main.panel._addToPanelBox.call(this, role, indicator, position, box); + }; + + this.panel._onMenuSet = function(indicator) { + Main.panel._onMenuSet.call(this, indicator); + }; + + this._leftBox = this.panel._leftBox = new St.BoxLayout({ name: 'panelLeft' }); + this._centerBox = this.panel._centerBox = new St.BoxLayout({ name: 'panelCenter' }); + this._rightBox = this.panel._rightBox = new St.BoxLayout({ name: 'panelRight' }); + + this.menuManager = this.panel.menuManager = new PopupMenu.PopupMenuManager(this.panel); + + this._setPanelMenu('aggregateMenu', dtpSecondaryAggregateMenu, this.panel.actor); + this._setPanelMenu('dateMenu', DateMenu.DateMenuButton, this.panel.actor); + this._setPanelMenu('activities', Panel.ActivitiesButton, this.panel.actor); + + this.panel.add_child(this._leftBox); + this.panel.add_child(this._centerBox); + this.panel.add_child(this._rightBox); + } else { + this.panel = Main.panel; + this.statusArea = Main.panel.statusArea; + this.menuManager = Main.panel.menuManager; + + panelBoxes.forEach(p => this[p] = Main.panel[p]); + + ['activities', 'aggregateMenu', 'dateMenu'].forEach(b => { + let container = this.statusArea[b].container; + let parent = container.get_parent(); + + container._dtpOriginalParent = parent; + parent ? parent.remove_child(container) : null; + this.panel.actor.add_child(container); + }); + } + + // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of + // its behavior is handled by the taskbar, but its positioning is done at the panel level + this.showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this); + this.panel.actor.add_child(this.showAppsIconWrapper.realShowAppsIcon); + + this.panel.actor._delegate = this; + + Utils.wrapActor(this.statusArea.activities); + + this.add_child(this.panel.actor); + + if (Main.panel._onButtonPress || Main.panel._tryDragWindow) { + this._signalsHandler.add([ + this.panel.actor, + [ + 'button-press-event', + 'touch-event' + ], + this._onButtonPress.bind(this) + ]); + } + + if (Main.panel._onKeyPress) { + this._signalsHandler.add([this.panel.actor, 'key-press-event', Main.panel._onKeyPress.bind(this)]); + } + + Main.ctrlAltTabManager.addGroup(this, _("Top Bar")+" "+ monitor.index, 'focus-top-bar-symbolic', + { sortGroup: CtrlAltTab.SortGroup.TOP }); + }, + + enable : function() { + let position = this.getPosition(); + + if (this.statusArea.aggregateMenu) { + Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll = 1; + } + + this.geom = this.getGeometry(); + + // The overview uses the panel height as a margin by way of a "ghost" transparent Clone + // This pushes everything down, which isn't desired when the panel is moved to the bottom + // I'm adding a 2nd ghost panel and will resize the top or bottom ghost depending on the panel position + this._myPanelGhost = new Clutter.Actor({ + x: this.geom.x, + y: this.geom.y , + reactive: false, + opacity: 0 + }); + + let isTop = this.geom.position == St.Side.TOP; + + if (isTop) { + this.panel._leftCorner = this.panel._leftCorner || new Panel.PanelCorner(St.Side.LEFT); + this.panel._rightCorner = this.panel._rightCorner || new Panel.PanelCorner(St.Side.RIGHT); + + Main.overview._overview.insert_child_at_index(this._myPanelGhost, 0); + } else { + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + Main.overview._overview.add_actor(this._myPanelGhost); + } + + if (this.panel._leftCorner) { + Utils.wrapActor(this.panel._leftCorner); + Utils.wrapActor(this.panel._rightCorner); + + if (isTop) { + if (this.isStandalone) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + } else if (Config.PACKAGE_VERSION >= '3.32') { + this.panel.actor.remove_child(this.panel._leftCorner.actor); + this.panel.actor.remove_child(this.panel._rightCorner.actor); + } + } + + this._setPanelPosition(); + + if (!this.isStandalone) { + if (this.panel.vfunc_allocate) { + this._panelConnectId = 0; + Utils.hookVfunc(this.panel.__proto__, 'allocate', (box, flags) => this._mainPanelAllocate(0, box, flags)); + } else { + this._panelConnectId = this.panel.actor.connect('allocate', (actor, box, flags) => this._mainPanelAllocate(actor, box, flags)); + } + + // remove the extra space before the clock when the message-indicator is displayed + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', () => [0,0]); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', () => [0,0]); + } + } + + if (!DateMenu.IndicatorPad && this.statusArea.dateMenu) { + //3.36 switched to a size constraint applied on an anonymous child + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints = indicatorPad.get_constraints(); + indicatorPad.clear_constraints(); + } + + // The main panel's connection to the "allocate" signal is competing with this extension + // trying to move the centerBox over to the right, creating a never-ending cycle. + // Since we don't have the ID to disconnect that handler, wrap the allocate() function + // it calls instead. If the call didn't originate from this file, ignore it. + panelBoxes.forEach(b => { + this[b].allocate = (box, flags, isFromDashToPanel) => { + if (isFromDashToPanel) { + Utils.allocate(this[b], box, flags, true); + } + } + }); + + this.menuManager._oldChangeMenu = this.menuManager._changeMenu; + this.menuManager._changeMenu = (menu) => { + if (!Me.settings.get_boolean('stockgs-panelbtn-click-only')) { + this.menuManager._oldChangeMenu(menu); + } + }; + + this.dynamicTransparency = new Transparency.DynamicTransparency(this); + + this.taskbar = new Taskbar.taskbar(this); + + this.panel.actor.add_child(this.taskbar.actor); + + this._setAppmenuVisible(Me.settings.get_boolean('show-appmenu')); + this._setShowDesktopButton(true); + + this._setAllocationMap(); + + this.panel.actor.add_style_class_name('dashtopanelMainPanel ' + this.getOrientation()); + + this._setPanelGhostSize(); + + this._timeoutsHandler.add([T2, Me.settings.get_int('intellihide-enable-start-delay'), () => this.intellihide = new Intellihide.Intellihide(this)]); + + this._signalsHandler.add( + // this is to catch changes to the theme or window scale factor + [ + Utils.getStageTheme(), + 'changed', + () => (this._resetGeometry(), this._setShowDesktopButtonStyle()), + ], + [ + // sync hover after a popupmenu is closed + this.taskbar, + 'menu-closed', + Lang.bind(this, function(){this.panel.actor.sync_hover();}) + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._adjustForOverview() + ], + [ + Main.overview, + 'hidden', + () => { + if (this.isPrimary) { + //reset the primary monitor when exiting the overview + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this.statusArea.activities.actor, + 'captured-event', + (actor, e) => { + // todo this is not being called right now, so the overview is not shown on the correct monitor + if (e.type() == Clutter.EventType.BUTTON_PRESS || e.type() == Clutter.EventType.TOUCH_BEGIN) { + //temporarily use as primary the monitor on which the activities btn was clicked + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this._centerBox, + 'actor-added', + () => this._onBoxActorAdded(this._centerBox) + ], + [ + this._rightBox, + 'actor-added', + () => this._onBoxActorAdded(this._rightBox) + ], + [ + this.panel.actor, + 'scroll-event', + this._onPanelMouseScroll.bind(this) + ], + [ + Main.layoutManager, + 'startup-complete', + () => this._resetGeometry() + ] + ); + + this._bindSettingsChanges(); + + this.panelStyle.enable(this); + + if (this.checkIfVertical()) { + this._signalsHandler.add([ + this.panelBox, + 'notify::visible', + () => { + if (this.panelBox.visible) { + this._refreshVerticalAlloc(); + } + } + ]); + + this._setSearchEntryOffset(this.geom.w); + + if (this.statusArea.dateMenu) { + this._formatVerticalClock(); + + this._signalsHandler.add([ + this.statusArea.dateMenu._clock, + 'notify::clock', + () => this._formatVerticalClock() + ]); + } + } + + // Since we are usually visible but not usually changing, make sure + // most repaint requests don't actually require us to repaint anything. + // This saves significant CPU when repainting the screen. + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this._initProgressManager(); + }, + + disable: function () { + this.panelStyle.disable(); + + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + this._disablePanelCornerSignals(); + + this.panel.actor.remove_child(this.taskbar.actor); + this._setAppmenuVisible(false); + + if (this.intellihide) { + this.intellihide.destroy(); + } + + this.dynamicTransparency.destroy(); + + this.progressManager.destroy(); + + this.taskbar.destroy(); + this.showAppsIconWrapper.destroy(); + + this.menuManager._changeMenu = this.menuManager._oldChangeMenu; + + this._myPanelGhost.get_parent().remove_actor(this._myPanelGhost); + this._setSearchEntryOffset(0); + + panelBoxes.forEach(b => delete this[b].allocate); + this._unmappedButtons.forEach(a => this._disconnectVisibleId(a)); + + if (this._dateMenuIndicatorPadContraints && this.statusArea.dateMenu) { + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints.forEach(c => indicatorPad.add_constraint(c)); + } + + this._setVertical(this.panel.actor, false); + + if (!this.isStandalone) { + this.statusArea.dateMenu._clockDisplay.text = this.statusArea.dateMenu._clock.clock; + + ['vertical', 'horizontal', 'dashtopanelMainPanel'].forEach(c => this.panel.actor.remove_style_class_name(c)); + + if (!Main.sessionMode.isLocked) { + [['activities', 0], ['aggregateMenu', -1], ['dateMenu', 0]].forEach(b => { + let container = this.statusArea[b[0]].container; + let originalParent = container._dtpOriginalParent; + + this.panel.actor.remove_child(container); + originalParent ? originalParent.insert_child_at_index(container, b[1]) : null; + delete container._dtpOriginalParent; + }); + } + + if (!this.panel._leftCorner.actor.mapped) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + + this._setShowDesktopButton(false); + + delete Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll; + + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_width); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_height); + } + + if (this._panelConnectId) { + this.panel.actor.disconnect(this._panelConnectId); + } else { + Utils.hookVfunc(this.panel.__proto__, 'allocate', this.panel.__proto__.vfunc_allocate); + } + + this.panel.actor._delegate = this.panel; + } else { + this._removePanelMenu('dateMenu'); + this._removePanelMenu('aggregateMenu'); + this._removePanelMenu('activities'); + } + + Main.ctrlAltTabManager.removeGroup(this); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + + // open overview so they can choose a window for focusing + // and ultimately dropping dragged item onto + if(Main.overview.shouldToggleByCornerOrButton()) + Main.overview.show(); + } + + return DND.DragMotionResult.CONTINUE; + }, + + getPosition: function() { + let position = PanelSettings.getPanelPosition(Me.settings, this.monitor.index); + + if (position == Pos.TOP) { + return St.Side.TOP; + } else if (position == Pos.RIGHT) { + return St.Side.RIGHT; + } else if (position == Pos.BOTTOM) { + return St.Side.BOTTOM; + } + + return St.Side.LEFT; + }, + + checkIfVertical: function() { + let position = this.getPosition(); + + return (position == St.Side.LEFT || position == St.Side.RIGHT); + }, + + getOrientation: function() { + return (this.checkIfVertical() ? 'vertical' : 'horizontal'); + }, + + updateElementPositions: function() { + let panelPositions = this.panelManager.panelsElementPositions[this.monitor.index] || Pos.defaults; + + this._updateGroupedElements(panelPositions); + + this._disablePanelCornerSignals(); + + if (this.getPosition() == St.Side.TOP) { + let visibleElements = panelPositions.filter(pp => pp.visible); + let connectCorner = (corner, button) => { + corner._button = button; + corner._buttonStyleChangedSignalId = button.connect('style-changed', () => { + corner.set_style_pseudo_class(button.get_style_pseudo_class()); + }); + } + + if (visibleElements[0].element == Pos.ACTIVITIES_BTN) { + connectCorner(this.panel._leftCorner, this.statusArea.activities); + } + + if (visibleElements[visibleElements.length - 1].element == Pos.SYSTEM_MENU) { + connectCorner(this.panel._rightCorner, this.statusArea.aggregateMenu); + } + } + + this.panel.actor.hide(); + this.panel.actor.show(); + }, + + _updateGroupedElements: function(panelPositions) { + let previousPosition = 0; + let previousCenteredPosition = 0; + let currentGroup = -1; + + this._elementGroups = []; + + panelPositions.forEach(pos => { + let allocationMap = this.allocationMap[pos.element]; + + if (allocationMap.actor) { + allocationMap.actor.visible = pos.visible; + + if (!pos.visible) { + return; + } + + let currentPosition = pos.position; + let isCentered = Pos.checkIfCentered(currentPosition); + + if (currentPosition == Pos.STACKED_TL && previousPosition == Pos.STACKED_BR) { + currentPosition = Pos.STACKED_BR; + } + + if (!previousPosition || + (previousPosition == Pos.STACKED_TL && currentPosition != Pos.STACKED_TL) || + (previousPosition != Pos.STACKED_BR && currentPosition == Pos.STACKED_BR) || + (isCentered && previousPosition != currentPosition && previousPosition != Pos.STACKED_BR)) { + this._elementGroups[++currentGroup] = { elements: [], index: this._elementGroups.length, expandableIndex: -1 }; + previousCenteredPosition = 0; + } + + if (pos.element == Pos.TASKBAR) { + this._elementGroups[currentGroup].expandableIndex = this._elementGroups[currentGroup].elements.length; + } + + if (isCentered && !this._elementGroups[currentGroup].isCentered) { + this._elementGroups[currentGroup].isCentered = 1; + previousCenteredPosition = currentPosition; + } + + this._elementGroups[currentGroup].position = previousCenteredPosition || currentPosition; + this._elementGroups[currentGroup].elements.push(allocationMap); + + allocationMap.position = currentPosition; + previousPosition = currentPosition; + } + }); + }, + + _disablePanelCornerSignals: function() { + if (this.panel._rightCorner && this.panel._rightCorner._buttonStyleChangedSignalId) { + this.panel._rightCorner._button.disconnect(this.panel._rightCorner._buttonStyleChangedSignalId); + delete this.panel._rightCorner._buttonStyleChangedSignalId; + } + + if (this.panel._leftCorner && this.panel._leftCorner._buttonStyleChangedSignalId) { + this.panel._leftCorner._button.disconnect(this.panel._leftCorner._buttonStyleChangedSignalId); + delete this.panel._leftCorner._buttonStyleChangedSignalId; + } + }, + + _bindSettingsChanges: function() { + let isVertical = this.checkIfVertical(); + + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::panel-sizes', + 'changed::group-apps' + ], + () => this._resetGeometry() + ], + [ + Me.settings, + [ + 'changed::appicon-margin', + 'changed::appicon-padding' + ], + () => this.taskbar.resetAppIcons() + ], + [ + Me.settings, + 'changed::show-appmenu', + () => this._setAppmenuVisible(Me.settings.get_boolean('show-appmenu')) + ], + [ + Me.settings, + [ + 'changed::showdesktop-button-width', + 'changed::trans-use-custom-bg', + 'changed::desktop-line-use-custom-color', + 'changed::desktop-line-custom-color', + 'changed::trans-bg-color' + ], + () => this._setShowDesktopButtonStyle() + ], + [ + Me.desktopSettings, + 'changed::clock-format', + () => { + this._clockFormat = null; + + if (isVertical) { + this._formatVerticalClock(); + } + } + ], + [ + Me.settings, + 'changed::progress-show-bar', + () => this._initProgressManager() + ], + [ + Me.settings, + 'changed::progress-show-count', + () => this._initProgressManager() + ] + ); + + if (isVertical) { + this._signalsHandler.add([Me.settings, 'changed::group-apps-label-max-width', () => this._resetGeometry()]); + } + }, + + _setPanelMenu: function(propName, constr, container) { + if (!this.statusArea[propName]) { + this.statusArea[propName] = this._getPanelMenu(propName, constr); + this.menuManager.addMenu(this.statusArea[propName].menu); + container.insert_child_at_index(this.statusArea[propName].container, 0); + } + }, + + _removePanelMenu: function(propName) { + if (this.statusArea[propName]) { + let parent = this.statusArea[propName].container.get_parent(); + + if (parent) { + parent.remove_actor(this.statusArea[propName].container); + } + + //calling this.statusArea[propName].destroy(); is buggy for now, gnome-shell never + //destroys those panel menus... + //since we can't destroy the menu (hence properly disconnect its signals), let's + //store it so the next time a panel needs one of its kind, we can reuse it instead + //of creating a new one + let panelMenu = this.statusArea[propName]; + + this.menuManager.removeMenu(panelMenu.menu); + Me.persistentStorage[propName].push(panelMenu); + this.statusArea[propName] = null; + } + }, + + _getPanelMenu: function(propName, constr) { + Me.persistentStorage[propName] = Me.persistentStorage[propName] || []; + + if (!Me.persistentStorage[propName].length) { + Me.persistentStorage[propName].push(new constr()); + } + + return Me.persistentStorage[propName].pop(); + }, + + _setPanelGhostSize: function() { + this._myPanelGhost.set_size(this.width, this.checkIfVertical() ? 1 : this.height); + }, + + _setSearchEntryOffset: function(offset) { + if (this.isPrimary) { + //In the overview, when the panel is vertical the search-entry is the only element + //that doesn't natively take into account the size of a side dock, as it is always + //centered relatively to the monitor. This looks misaligned, adjust it here so it + //is centered like the rest of the overview elements. + let paddingSide = this.getPosition() == St.Side.LEFT ? 'left' : 'right'; + let scaleFactor = Utils.getScaleFactor(); + let style = offset ? 'padding-' + paddingSide + ':' + (offset / scaleFactor) + 'px;' : null; + let searchEntry = Main.overview._overview._controls._searchEntry; + searchEntry.get_parent().set_style(style); + } + }, + + _adjustForOverview: function() { + let isFocusedMonitor = this.panelManager.checkIfFocusedMonitor(this.monitor); + let isOverview = !!Main.overview.visibleTarget; + let isOverviewFocusedMonitor = isOverview && isFocusedMonitor; + let isShown = !isOverview || isOverviewFocusedMonitor; + + this.panelBox[isShown ? 'show' : 'hide'](); + + if (isOverview) { + this._myPanelGhost[isOverviewFocusedMonitor ? 'show' : 'hide'](); + + if (isOverviewFocusedMonitor) { + Utils.getPanelGhost().set_size(1, this.geom.position == St.Side.TOP ? 0 : 32); + } + } + }, + + _resetGeometry: function() { + this.geom = this.getGeometry(); + this._setPanelGhostSize(); + this._setPanelPosition(); + this.taskbar.resetAppIcons(true); + this.dynamicTransparency.updateExternalStyle(); + + if (this.intellihide && this.intellihide.enabled) { + this.intellihide.reset(); + } + + if (this.checkIfVertical()) { + this.showAppsIconWrapper.realShowAppsIcon.toggleButton.set_width(this.geom.w); + this._refreshVerticalAlloc(); + this._setSearchEntryOffset(this.geom.w); + } + }, + + getGeometry: function() { + let scaleFactor = Utils.getScaleFactor(); + let panelBoxTheme = this.panelBox.get_theme_node(); + let lrPadding = panelBoxTheme.get_padding(St.Side.RIGHT) + panelBoxTheme.get_padding(St.Side.LEFT); + let topPadding = panelBoxTheme.get_padding(St.Side.TOP); + let tbPadding = topPadding + panelBoxTheme.get_padding(St.Side.BOTTOM); + let position = this.getPosition(); + let length = PanelSettings.getPanelLength(Me.settings, this.monitor.index) / 100; + let anchor = PanelSettings.getPanelAnchor(Me.settings, this.monitor.index); + let anchorPlaceOnMonitor = 0; + let gsTopPanelOffset = 0; + let x = 0, y = 0; + let w = 0, h = 0; + + const panelSize = PanelSettings.getPanelSize(Me.settings, this.monitor.index); + this.dtpSize = panelSize * scaleFactor; + + if (Me.settings.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.primaryMonitor == this.monitor) { + gsTopPanelOffset = Main.layoutManager.panelBox.height - topPadding; + } + + if (this.checkIfVertical()) { + if (!Me.settings.get_boolean('group-apps')) { + // add window title width and side padding of _dtpIconContainer when vertical + this.dtpSize += Me.settings.get_int('group-apps-label-max-width') + AppIcons.DEFAULT_PADDING_SIZE * 2 / scaleFactor; + } + + this.sizeFunc = 'get_preferred_height', + this.fixedCoord = { c1: 'x1', c2: 'x2' }, + this.varCoord = { c1: 'y1', c2: 'y2' }; + + w = this.dtpSize; + h = this.monitor.height * length - tbPadding - gsTopPanelOffset; + } else { + this.sizeFunc = 'get_preferred_width'; + this.fixedCoord = { c1: 'y1', c2: 'y2' }; + this.varCoord = { c1: 'x1', c2: 'x2' }; + + w = this.monitor.width * length - lrPadding; + h = this.dtpSize; + } + + if (position == St.Side.TOP || position == St.Side.LEFT) { + x = this.monitor.x; + y = this.monitor.y + gsTopPanelOffset; + } else if (position == St.Side.RIGHT) { + x = this.monitor.x + this.monitor.width - this.dtpSize - lrPadding; + y = this.monitor.y + gsTopPanelOffset; + } else { //BOTTOM + x = this.monitor.x; + y = this.monitor.y + this.monitor.height - this.dtpSize - tbPadding; + } + + if (this.checkIfVertical()) { + let viewHeight = this.monitor.height - gsTopPanelOffset; + + if (anchor === Pos.MIDDLE) { + anchorPlaceOnMonitor = (viewHeight - h) / 2; + } else if (anchor === Pos.END) { + anchorPlaceOnMonitor = viewHeight - h; + } else { // Pos.START + anchorPlaceOnMonitor = 0; + } + y = y + anchorPlaceOnMonitor; + } else { + if (anchor === Pos.MIDDLE) { + anchorPlaceOnMonitor = (this.monitor.width - w) / 2; + } else if (anchor === Pos.END) { + anchorPlaceOnMonitor = this.monitor.width - w; + } else { // Pos.START + anchorPlaceOnMonitor = 0; + } + x = x + anchorPlaceOnMonitor; + } + + return { + x: x, y: y, + w: w, h: h, + lrPadding: lrPadding, + tbPadding: tbPadding, + position: position + }; + }, + + _setAllocationMap: function() { + this.allocationMap = {}; + let setMap = (name, actor, isBox) => this.allocationMap[name] = { + actor: actor, + isBox: isBox || 0, + box: new Clutter.ActorBox() + }; + + setMap(Pos.SHOW_APPS_BTN, this.showAppsIconWrapper.realShowAppsIcon); + setMap(Pos.ACTIVITIES_BTN, this.statusArea.activities ? this.statusArea.activities.container : 0); + setMap(Pos.LEFT_BOX, this._leftBox, 1); + setMap(Pos.TASKBAR, this.taskbar.actor); + setMap(Pos.CENTER_BOX, this._centerBox, 1); + setMap(Pos.DATE_MENU, this.statusArea.dateMenu.container); + setMap(Pos.SYSTEM_MENU, this.statusArea.aggregateMenu.container); + setMap(Pos.RIGHT_BOX, this._rightBox, 1); + setMap(Pos.DESKTOP_BTN, this._showDesktopButton); + }, + + _mainPanelAllocate: function(actor, box, flags) { + Utils.setAllocation(this.panel.actor, box, flags); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + + let fixed = 0; + let centeredMonitorGroup; + let panelAlloc = new Clutter.ActorBox({ x1: 0, y1: 0, x2: this.geom.w, y2: this.geom.h }); + let assignGroupSize = (group, update) => { + group.size = 0; + group.tlOffset = 0; + group.brOffset = 0; + + group.elements.forEach(element => { + if (!update) { + element.box[this.fixedCoord.c1] = panelAlloc[this.fixedCoord.c1]; + element.box[this.fixedCoord.c2] = panelAlloc[this.fixedCoord.c2]; + element.natSize = element.actor[this.sizeFunc](-1)[1]; + } + + if (!group.isCentered || Pos.checkIfCentered(element.position)) { + group.size += element.natSize; + } else if (element.position == Pos.STACKED_TL) {  + group.tlOffset += element.natSize; + } else { // Pos.STACKED_BR + group.brOffset += element.natSize; + } + }); + + if (group.isCentered) { + group.size += Math.max(group.tlOffset, group.brOffset) * 2; + group.tlOffset = Math.max(group.tlOffset - group.brOffset, 0); + } + }; + let allocateGroup = (group, tlLimit, brLimit) => { + let startPosition = tlLimit; + let currentPosition = 0; + + if (group.expandableIndex >= 0) { + let availableSize = brLimit - tlLimit; + let expandable = group.elements[group.expandableIndex]; + let i = 0; + let l = this._elementGroups.length; + let tlSize = 0; + let brSize = 0; + + if (centeredMonitorGroup && (centeredMonitorGroup != group || expandable.position != Pos.CENTERED_MONITOR)) { + if (centeredMonitorGroup.index < group.index || (centeredMonitorGroup == group && expandable.position == Pos.STACKED_TL)) { + i = centeredMonitorGroup.index; + } else { + l = centeredMonitorGroup.index; + } + } + + for (; i < l; ++i) { + let refGroup = this._elementGroups[i]; + + if (i < group.index && (!refGroup.fixed || refGroup[this.varCoord.c2] > tlLimit)) { + tlSize += refGroup.size; + } else if (i > group.index && (!refGroup.fixed || refGroup[this.varCoord.c1] < brLimit)) { + brSize += refGroup.size; + } + } + + if (group.isCentered) { + availableSize -= Math.max(tlSize, brSize) * 2; + } else { + availableSize -= tlSize + brSize; + } + + if (availableSize < group.size) { + expandable.natSize -= (group.size - availableSize) * (group.isCentered && !Pos.checkIfCentered(expandable.position) ? .5 : 1); + assignGroupSize(group, true); + } + } + + if (group.isCentered) { + startPosition = tlLimit + (brLimit - tlLimit - group.size) * .5; + } else if (group.position == Pos.STACKED_BR) { + startPosition = brLimit - group.size; + } + + currentPosition = group.tlOffset + startPosition; + + group.elements.forEach(element => { + element.box[this.varCoord.c1] = Math.round(currentPosition); + element.box[this.varCoord.c2] = Math.round((currentPosition += element.natSize)); + + if (element.isBox) { + return element.actor.allocate(element.box, flags, true); + } + + Utils.allocate(element.actor, element.box, flags, false); + }); + + group[this.varCoord.c1] = startPosition; + group[this.varCoord.c2] = currentPosition; + group.fixed = 1; + ++fixed; + }; + + Utils.allocate(this.panel.actor, panelAlloc, flags); + + this._elementGroups.forEach(group => { + group.fixed = 0; + + assignGroupSize(group); + + if (group.position == Pos.CENTERED_MONITOR) { + centeredMonitorGroup = group; + } + }); + + if (centeredMonitorGroup) { + allocateGroup(centeredMonitorGroup, panelAlloc[this.varCoord.c1], panelAlloc[this.varCoord.c2]); + } + + let iterations = 0; //failsafe + while (fixed < this._elementGroups.length && ++iterations < 10) { + for (let i = 0, l = this._elementGroups.length; i < l; ++i) { + let group = this._elementGroups[i]; + + if (group.fixed) { + continue; + } + + let prevGroup = this._elementGroups[i - 1]; + let nextGroup = this._elementGroups[i + 1]; + let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : + centeredMonitorGroup && group.index > centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c2] : panelAlloc[this.varCoord.c1]; + let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : + centeredMonitorGroup && group.index < centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c1] : panelAlloc[this.varCoord.c2]; + + if (group.position == Pos.STACKED_TL) { + allocateGroup(group, panelAlloc[this.varCoord.c1], nextLimit); + } else if (group.position == Pos.STACKED_BR) { + allocateGroup(group, prevLimit, panelAlloc[this.varCoord.c2]); + } else if ((!prevGroup || prevGroup.fixed) && (!nextGroup || nextGroup.fixed)) { // CENTERED + allocateGroup(group, prevLimit, nextLimit); + } + } + } + + if (this.geom.position == St.Side.TOP) { + let childBoxLeftCorner = new Clutter.ActorBox(); + let childBoxRightCorner = new Clutter.ActorBox(); + let currentCornerSize = this.cornerSize; + let panelAllocFixedSize = box[this.fixedCoord.c2] - box[this.fixedCoord.c1]; + + [ , this.cornerSize] = this.panel._leftCorner.actor[this.sizeFunc](-1); + childBoxLeftCorner[this.varCoord.c1] = 0; + childBoxLeftCorner[this.varCoord.c2] = this.cornerSize; + childBoxLeftCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxLeftCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + childBoxRightCorner[this.varCoord.c1] = box[this.varCoord.c2] - this.cornerSize; + childBoxRightCorner[this.varCoord.c2] = box[this.varCoord.c2]; + childBoxRightCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxRightCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + Utils.allocate(this.panel._leftCorner.actor, childBoxLeftCorner, flags); + Utils.allocate(this.panel._rightCorner.actor, childBoxRightCorner, flags); + + if (this.cornerSize != currentCornerSize) { + this._setPanelClip(); + } + } + }, + + _setPanelPosition: function() { + let clipContainer = this.panelBox.get_parent(); + + this.set_size(this.geom.w, this.geom.h); + clipContainer.set_position(this.geom.x, this.geom.y); + + this._setVertical(this.panel.actor, this.checkIfVertical()); + + // styles for theming + Object.keys(St.Side).forEach(p => { + let cssName = 'dashtopanel' + p.charAt(0) + p.slice(1).toLowerCase(); + + this.panel.actor[(St.Side[p] == this.geom.position ? 'add' : 'remove') + '_style_class_name'](cssName); + }); + + this._setPanelClip(clipContainer); + + Main.layoutManager._updateHotCorners(); + Main.layoutManager._updatePanelBarrier(this); + }, + + _setPanelClip: function(clipContainer) { + clipContainer = clipContainer || this.panelBox.get_parent(); + this._timeoutsHandler.add([T7, 0, () => Utils.setClip(clipContainer, clipContainer.x, clipContainer.y, this.panelBox.width, this.panelBox.height + this.cornerSize)]); + }, + + _onButtonPress: function(actor, event) { + let type = event.type(); + let isPress = type == Clutter.EventType.BUTTON_PRESS; + let button = isPress ? event.get_button() : -1; + let [stageX, stageY] = event.get_coords(); + + if (button == 3 && global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, stageX, stageY) == this.panel.actor) { + //right click on an empty part of the panel, temporarily borrow and display the showapps context menu + Main.layoutManager.setDummyCursorGeometry(stageX, stageY, 0, 0); + + this.showAppsIconWrapper.createMenu(); + this.showAppsIconWrapper._menu.sourceActor = Main.layoutManager.dummyCursor; + this.showAppsIconWrapper.popupMenu(); + + return Clutter.EVENT_STOP; + } else if (Main.modalCount > 0 || event.get_source() != actor || + (!isPress && type != Clutter.EventType.TOUCH_BEGIN) || + (isPress && button != 1)) { + return Clutter.EVENT_PROPAGATE; + } + + let params = this.checkIfVertical() ? [stageY, 'y', 'height'] : [stageX, 'x', 'width']; + let dragWindow = this._getDraggableWindowForPosition.apply(this, params.concat(['maximized_' + this.getOrientation() + 'ly'])); + + if (!dragWindow) + return Clutter.EVENT_PROPAGATE; + + global.display.begin_grab_op(dragWindow, + Meta.GrabOp.MOVING, + false, /* pointer grab */ + true, /* frame action */ + button, + event.get_state(), + event.get_time(), + stageX, stageY); + + return Clutter.EVENT_STOP; + }, + + _getDraggableWindowForPosition: function(stageCoord, coord, dimension, maximizedProp) { + let workspace = Utils.getCurrentWorkspace(); + let allWindowsByStacking = global.display.sort_windows_by_stacking( + workspace.list_windows() + ).reverse(); + + return Utils.find(allWindowsByStacking, metaWindow => { + let rect = metaWindow.get_frame_rect(); + + return metaWindow.get_monitor() == this.monitor.index && + metaWindow.showing_on_its_workspace() && + metaWindow.get_window_type() != Meta.WindowType.DESKTOP && + metaWindow[maximizedProp] && + stageCoord > rect[coord] && stageCoord < rect[coord] + rect[dimension]; + }); + }, + + _onBoxActorAdded: function(box) { + if (this.checkIfVertical()) { + this._setVertical(box, true); + } + }, + + _refreshVerticalAlloc: function() { + this._setVertical(this._centerBox, true); + this._setVertical(this._rightBox, true); + this._formatVerticalClock(); + }, + + _setVertical: function(actor, isVertical) { + let _set = (actor, isVertical) => { + if (!actor || actor instanceof Dash.DashItemContainer || actor instanceof Taskbar.TaskbarItemContainer) { + return; + } + + if (actor instanceof St.BoxLayout) { + actor.vertical = isVertical; + } else if ((actor._delegate || actor) instanceof PanelMenu.ButtonBox && actor != this.statusArea.appMenu) { + let child = actor.get_first_child(); + + if (isVertical && !actor.visible && !actor._dtpVisibleId) { + this._unmappedButtons.push(actor); + actor._dtpVisibleId = actor.connect('notify::visible', () => { + this._disconnectVisibleId(actor); + this._refreshVerticalAlloc(); + }); + actor._dtpDestroyId = actor.connect('destroy', () => this._disconnectVisibleId(actor)); + } + + if (child) { + let [, natWidth] = actor.get_preferred_width(-1); + + child.x_align = Clutter.ActorAlign[isVertical ? 'CENTER' : 'START']; + actor.set_width(isVertical ? this.dtpSize : -1); + isVertical = isVertical && (natWidth > this.dtpSize); + actor[(isVertical ? 'add' : 'remove') + '_style_class_name']('vertical'); + } + } + + actor.get_children().forEach(c => _set(c, isVertical)); + }; + + _set(actor, false); + _set(actor, isVertical); + }, + + _disconnectVisibleId: function(actor) { + actor.disconnect(actor._dtpVisibleId); + actor.disconnect(actor._dtpDestroyId); + + delete actor._dtpVisibleId; + delete actor._dtpDestroyId; + + this._unmappedButtons.splice(this._unmappedButtons.indexOf(actor), 1); + }, + + _setAppmenuVisible: function(isVisible) { + let parent; + let appMenu = this.statusArea.appMenu; + + if(appMenu) + parent = appMenu.container.get_parent(); + + if (parent) { + parent.remove_child(appMenu.container); + } + + if (isVisible && appMenu) { + this._leftBox.insert_child_above(appMenu.container, null); + } + }, + + _formatVerticalClock: function() { + // https://github.com/GNOME/gnome-desktop/blob/master/libgnome-desktop/gnome-wall-clock.c#L310 + if (this.statusArea.dateMenu) { + let datetime = this.statusArea.dateMenu._clock.clock; + let datetimeParts = datetime.split(' '); + let time = datetimeParts[1]; + let clockText = this.statusArea.dateMenu._clockDisplay.clutter_text; + let setClockText = text => { + let stacks = text instanceof Array; + let separator = '\n‧‧\n'; + + clockText.set_text((stacks ? text.join(separator) : text).trim()); + clockText.set_use_markup(stacks); + clockText.get_allocation_box(); + + return !clockText.get_layout().is_ellipsized(); + }; + + if (clockText.ellipsize == Pango.EllipsizeMode.NONE) { + //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back + clockText.ellipsize = Pango.EllipsizeMode.END; + } + + if (!time) { + datetimeParts = datetime.split(' '); + time = datetimeParts.pop(); + datetimeParts = [datetimeParts.join(' '), time]; + } + + if (!setClockText(datetime) && + !setClockText(datetimeParts) && + !setClockText(time)) { + let timeParts = time.split('∶'); + + if (!this._clockFormat) { + this._clockFormat = Me.desktopSettings.get_string('clock-format'); + } + + if (this._clockFormat == '12h') { + timeParts.push.apply(timeParts, timeParts.pop().split(' ')); + } + + setClockText(timeParts); + } + } + }, + + _setShowDesktopButton: function (add) { + if (add) { + if(this._showDesktopButton) + return; + + this._showDesktopButton = new St.Bin({ style_class: 'showdesktop-button', + reactive: true, + can_focus: true, + // x_fill: true, + // y_fill: true, + track_hover: true }); + + this._setShowDesktopButtonStyle(); + + this._showDesktopButton.connect('button-press-event', () => this._onShowDesktopButtonPress()); + this._showDesktopButton.connect('enter-event', () => { + this._showDesktopButton.add_style_class_name(this._getBackgroundBrightness() ? + 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); + + if (Me.settings.get_boolean('show-showdesktop-hover')) { + this._timeoutsHandler.add([T4, Me.settings.get_int('show-showdesktop-delay'), () => { + this._hiddenDesktopWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + this._toggleWorkspaceWindows(true, this._hiddenDesktopWorkspace); + }]); + } + }); + + this._showDesktopButton.connect('leave-event', () => { + this._showDesktopButton.remove_style_class_name(this._getBackgroundBrightness() ? + 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); + + if (Me.settings.get_boolean('show-showdesktop-hover')) { + if (this._timeoutsHandler.getId(T4)) { + this._timeoutsHandler.remove(T4); + } else if (this._hiddenDesktopWorkspace) { + this._toggleWorkspaceWindows(false, this._hiddenDesktopWorkspace); + } +  } + }); + + this.panel.actor.add_child(this._showDesktopButton); + } else { + if(!this._showDesktopButton) + return; + + this.panel.actor.remove_child(this._showDesktopButton); + this._showDesktopButton.destroy(); + this._showDesktopButton = null; + } + }, + + _setShowDesktopButtonStyle: function() { + let rgb = this._getBackgroundBrightness() ? "rgba(55, 55, 55, .2)" : "rgba(200, 200, 200, .2)"; + + let isLineCustom = Me.settings.get_boolean('desktop-line-use-custom-color'); + rgb = isLineCustom ? Me.settings.get_string('desktop-line-custom-color') : rgb; + + if (this._showDesktopButton) { + let buttonSize = Me.settings.get_int('showdesktop-button-width') + 'px;'; + let isVertical = this.checkIfVertical(); + + let sytle = "border: 0 solid " + rgb + ";"; + sytle += isVertical ? 'border-top-width:1px;height:' + buttonSize : 'border-left-width:1px;width:' + buttonSize; + + this._showDesktopButton.set_style(sytle); + this._showDesktopButton[(isVertical ? 'x' : 'y') + '_expand'] = true; + } + }, + + // _getBackgroundBrightness: return true if panel has a bright background color + _getBackgroundBrightness: function() { + return Utils.checkIfColorIsBright(this.dynamicTransparency.backgroundColorRgb); + }, + + _toggleWorkspaceWindows: function(hide, workspace) { + let time = Me.settings.get_int('show-showdesktop-time') * .001; + + workspace.list_windows().forEach(w => { + if (!w.minimized) { + let tweenOpts = { + opacity: hide ? 0 : 255, + time: time, + transition: 'easeOutQuad' + }; + + Utils.animateWindowOpacity(w.get_compositor_private(), tweenOpts); + } + }); + }, + + _onShowDesktopButtonPress: function() { + let label = 'trackerFocusApp'; + + this._signalsHandler.removeWithLabel(label); + this._timeoutsHandler.remove(T5); + + if(this._restoreWindowList && this._restoreWindowList.length) { + this._timeoutsHandler.remove(T4); + + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows(); + this._restoreWindowList.forEach(function(w) { + if(windows.indexOf(w) > -1) + Main.activateWindow(w); + }); + this._restoreWindowList = null; + } else { + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows().filter(function (w) { + return w.showing_on_its_workspace() && !w.skip_taskbar; + }); + windows = global.display.sort_windows_by_stacking(windows); + + windows.forEach(function(w) { + w.minimize(); + }); + + this._restoreWindowList = windows; + + this._timeoutsHandler.add([T5, 20, () => this._signalsHandler.addWithLabel( + label, + [ + tracker, + 'notify::focus-app', + () => this._restoreWindowList = null + ] + )]); + } + + Main.overview.hide(); + }, + + _onPanelMouseScroll: function(actor, event) { + let scrollAction = Me.settings.get_string('scroll-panel-action'); + let direction = Utils.getMouseScrollDirection(event); + + if (!this._checkIfIgnoredScrollSource(event.get_source()) && !this._timeoutsHandler.getId(T6)) { + if (direction && scrollAction === 'SWITCH_WORKSPACE') { + let args = [global.display]; + + //adjust for horizontal workspaces + if (Utils.DisplayWrapper.getWorkspaceManager().layout_rows === 1) { + direction = direction == 'up' ? 'left' : 'right'; + } + + //gnome-shell < 3.30 needs an additional "screen" param + global.screen ? args.push(global.screen) : 0; + + let showWsPopup = Me.settings.get_boolean('scroll-panel-show-ws-popup'); + showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = { display: () => {} }; + Main.wm._showWorkspaceSwitcher.apply(Main.wm, args.concat([0, { get_name: () => 'switch---' + direction }])); + showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = null; + } else if (direction && scrollAction === 'CYCLE_WINDOWS') { + let windows = this.taskbar.getAppInfos().reduce((ws, appInfo) => ws.concat(appInfo.windows), []); + + Utils.activateSiblingWindow(windows, direction); + } else if (scrollAction === 'CHANGE_VOLUME' && !event.is_pointer_emulated()) { + var proto = Volume.Indicator.prototype; + var func = proto._handleScrollEvent || proto.vfunc_scroll_event || proto._onScrollEvent; + + func.call(Main.panel.statusArea.aggregateMenu._volume, 0, event); + } else { + return; + } + + var scrollDelay = Me.settings.get_int('scroll-panel-delay'); + + if (scrollDelay) { + this._timeoutsHandler.add([T6, scrollDelay, () => {}]); + } + } + }, + + _checkIfIgnoredScrollSource: function(source) { + let ignoredConstr = ['WorkspaceIndicator']; + + return source.get_parent()._dtpIgnoreScroll || ignoredConstr.indexOf(source.constructor.name) >= 0; + }, + + _initProgressManager: function() { + if(!this.progressManager && (Me.settings.get_boolean('progress-show-bar') || Me.settings.get_boolean('progress-show-count'))) + this.progressManager = new Progress.ProgressManager(); + }, +}); + +var dtpSecondaryPanel = Utils.defineClass({ + Name: 'DashToPanel-SecondaryPanel', + Extends: St.Widget, + + _init: function(params) { + this.callParent('_init', params); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + } +}); + +var dtpSecondaryAggregateMenu = Utils.defineClass({ + Name: 'DashToPanel-SecondaryAggregateMenu', + Extends: PanelMenu.Button, + + _init: function() { + this.callParent('_init', 0.0, C_("System menu in the top bar", "System"), false); + + Utils.wrapActor(this); + + this.menu.actor.add_style_class_name('aggregate-menu'); + + let menuLayout = new Panel.AggregateLayout(); + this.menu.box.set_layout_manager(menuLayout); + + this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); + this.actor.add_child(this._indicators); + + this._power = new imports.ui.status.power.Indicator(); + this._volume = new imports.ui.status.volume.Indicator(); + this._brightness = new imports.ui.status.brightness.Indicator(); + this._system = new imports.ui.status.system.Indicator(); + + if (Config.PACKAGE_VERSION >= '3.28') { + this._thunderbolt = new imports.ui.status.thunderbolt.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._thunderbolt)); + } + + if (Config.PACKAGE_VERSION < '3.37') { + this._screencast = new imports.ui.status.screencast.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._screencast)); + } + + if (Config.PACKAGE_VERSION >= '3.24') { + this._nightLight = new imports.ui.status.nightLight.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._nightLight)); + } + + if (Config.HAVE_NETWORKMANAGER && Config.PACKAGE_VERSION >= '3.24') { + this._network = new imports.ui.status.network.NMApplet(); + this._indicators.add_child(Utils.getIndicators(this._network)); + } + + if (Config.HAVE_BLUETOOTH) { + this._bluetooth = new imports.ui.status.bluetooth.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._bluetooth)); + } + + this._indicators.add_child(Utils.getIndicators(this._volume)); + this._indicators.add_child(Utils.getIndicators(this._power)); + + this.menu.addMenuItem(this._volume.menu); + this._volume._volumeMenu._readOutput(); + this._volume._volumeMenu._readInput(); + + this.menu.addMenuItem(this._brightness.menu); + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + if (this._network) { + this.menu.addMenuItem(this._network.menu); + } + + if (this._bluetooth) { + this.menu.addMenuItem(this._bluetooth.menu); + } + + this.menu.addMenuItem(this._power.menu); + this._power._sync(); + + if (this._nightLight) { + this.menu.addMenuItem(this._nightLight.menu); + } + + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this.menu.addMenuItem(this._system.menu); + + menuLayout.addSizeChild(this._power.menu.actor); + menuLayout.addSizeChild(this._system.menu.actor); + }, +}); diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js new file mode 100644 index 0000000..d572d8b --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelManager.js @@ -0,0 +1,789 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Overview = Me.imports.overview; +const Panel = Me.imports.panel; +const PanelSettings = Me.imports.panelSettings; +const Proximity = Me.imports.proximity; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +const Config = imports.misc.config; +const Lang = imports.lang; +const Gi = imports._gi; +const GLib = imports.gi.GLib; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +const AppDisplay = imports.ui.appDisplay; +const BoxPointer = imports.ui.boxpointer; +const Dash = imports.ui.dash; +const IconGrid = imports.ui.iconGrid; +const LookingGlass = imports.ui.lookingGlass; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const Layout = imports.ui.layout; +const WM = imports.ui.windowManager; +const WorkspacesView = imports.ui.workspacesView; + +var dtpPanelManager = Utils.defineClass({ + Name: 'DashToPanel.PanelManager', + + _init: function() { + this.overview = new Overview.dtpOverview(); + this.panelsElementPositions = {}; + + this._saveMonitors(); + + Utils.getAppDisplayViews().forEach(v => { + Utils.wrapActor(v.view); + Utils.wrapActor(v.view._grid); + }); + }, + + enable: function(reset) { + let dtpPrimaryIndex = Me.settings.get_int('primary-monitor'); + + this.dtpPrimaryMonitor = Main.layoutManager.monitors[dtpPrimaryIndex] || Main.layoutManager.primaryMonitor; + this.proximityManager = new Proximity.ProximityManager(); + + this._oldGetShowAppsButton = imports.ui.main.overview.dash.showAppsButton; + + Utils.wrapActor(Main.panel); + Utils.wrapActor(Main.overview.dash || 0); + + this.primaryPanel = this._createPanel(this.dtpPrimaryMonitor, Me.settings.get_boolean('stockgs-keep-top-panel')); + this.allPanels = [ this.primaryPanel ]; + + this.overview.enable(this.primaryPanel); + + if (Me.settings.get_boolean('multi-monitors')) { + Main.layoutManager.monitors.filter(m => m != this.dtpPrimaryMonitor).forEach(m => { + this.allPanels.push(this._createPanel(m, true)); + }); + } + + global.dashToPanel.panels = this.allPanels; + global.dashToPanel.emit('panels-created'); + + this.allPanels.forEach(p => { + let panelPosition = p.getPosition(); + let leftOrRight = (panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT); + + p.panelBox.set_size( + leftOrRight ? -1 : p.geom.w + p.geom.lrPadding, + leftOrRight ? p.geom.h + p.geom.tbPadding : -1 + ); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => this._adjustPanelMenuButton(pmb, p.monitor, panelPosition)); + + p.taskbar.iconAnimator.start(); + }); + + //in 3.32, BoxPointer now inherits St.Widget + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + let panelManager = this; + + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', function(forWidth) { + let alloc = { min_size: 0, natural_size: 0 }; + + [alloc.min_size, alloc.natural_size] = this.vfunc_get_preferred_height(forWidth); + + return panelManager._getBoxPointerPreferredHeight(this, alloc); + }); + } + + this._updatePanelElementPositions(); + this.setFocusedMonitor(this.dtpPrimaryMonitor); + + if (this.primaryPanel.checkIfVertical()) { + Main.wm._getPositionForDirection = newGetPositionForDirection; + } + + if (reset) return; + + if (Config.PACKAGE_VERSION > '3.35.1') { + this._oldDoSpringAnimation = AppDisplay.BaseAppView.prototype._doSpringAnimation; + AppDisplay.BaseAppView.prototype._doSpringAnimation = newDoSpringAnimation; + } + + this._oldUpdatePanelBarrier = Main.layoutManager._updatePanelBarrier; + Main.layoutManager._updatePanelBarrier = (panel) => { + let panelUpdates = panel ? [panel] : this.allPanels; + + panelUpdates.forEach(p => newUpdatePanelBarrier.call(Main.layoutManager, p)); + }; + Main.layoutManager._updatePanelBarrier(); + + this._oldUpdateHotCorners = Main.layoutManager._updateHotCorners; + Main.layoutManager._updateHotCorners = Lang.bind(Main.layoutManager, newUpdateHotCorners); + Main.layoutManager._updateHotCorners(); + + this._forceHotCornerId = Me.settings.connect('changed::stockgs-force-hotcorner', () => Main.layoutManager._updateHotCorners()); + + if (Main.layoutManager._interfaceSettings) { + this._enableHotCornersId = Main.layoutManager._interfaceSettings.connect('changed::enable-hot-corners', () => Main.layoutManager._updateHotCorners()); + } + + Main.overview.getShowAppsButton = this._newGetShowAppsButton.bind(this); + + this._needsDashItemContainerAllocate = !Dash.DashItemContainer.prototype.hasOwnProperty('vfunc_allocate'); + + if (this._needsDashItemContainerAllocate) { + Utils.hookVfunc(Dash.DashItemContainer.prototype, 'allocate', this._newDashItemContainerAllocate); + } + + LookingGlass.LookingGlass.prototype._oldResize = LookingGlass.LookingGlass.prototype._resize; + LookingGlass.LookingGlass.prototype._resize = _newLookingGlassResize; + + LookingGlass.LookingGlass.prototype._oldOpen = LookingGlass.LookingGlass.prototype.open; + LookingGlass.LookingGlass.prototype.open = _newLookingGlassOpen; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + if (Config.PACKAGE_VERSION > '3.35.9') { + let currentAppsView; + + this._oldAnimateIconPosition = IconGrid.animateIconPosition; + IconGrid.animateIconPosition = newAnimateIconPosition.bind(this); + + this._signalsHandler.add( + [ + Utils.DisplayWrapper.getScreen(), + 'window-entered-monitor', + () => this._needsIconAllocate = 1 + ] + ); + + Utils.getAppDisplayViews().forEach(v => { + if (!v.control || v.control.has_style_pseudo_class('checked')) { + currentAppsView = v; + } + + if (v.control) { + this._signalsHandler.add( + [ + v.control, + 'clicked', + () => { + this._needsIconAllocate = currentAppsView != v; + currentAppsView = v; + } + ] + ); + } + + this._signalsHandler.add( + [ + v.view, + 'notify::visible', + () => this._needsIconAllocate = !(currentAppsView != v && !v.view.visible) + ], + [ + v.view._grid, + 'animation-done', + () => this._needsIconAllocate = 0 + ] + ); + }); + } + + //listen settings + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::primary-monitor', + 'changed::multi-monitors', + 'changed::isolate-monitors', + 'changed::panel-positions', + 'changed::panel-lengths', + 'changed::panel-anchors', + 'changed::stockgs-keep-top-panel' + ], + () => this._reset() + ], + [ + Me.settings, + 'changed::panel-element-positions', + () => this._updatePanelElementPositions() + ], + [ + Me.settings, + 'changed::intellihide-key-toggle-text', + () => this._setKeyBindings(true) + ], + [ + Utils.DisplayWrapper.getMonitorManager(), + 'monitors-changed', + () => { + if (Main.layoutManager.primaryMonitor) { + this._saveMonitors(); + this._reset(); + } + } + ] + ); + + Panel.panelBoxes.forEach(c => this._signalsHandler.add( + [Main.panel[c], 'actor-added', (parent, child) => this._adjustPanelMenuButton(this._getPanelMenuButton(child), this.primaryPanel.monitor, this.primaryPanel.getPosition())] + )); + + this._setKeyBindings(true); + + // keep GS overview.js from blowing away custom panel styles + if(!Me.settings.get_boolean('stockgs-keep-top-panel')) + Object.defineProperty(Main.panel, "style", {configurable: true, set: function(v) {}}); + }, + + disable: function(reset) { + this.overview.disable(); + this.proximityManager.destroy(); + + this.allPanels.forEach(p => { + p.taskbar.iconAnimator.pause(); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => { + if (pmb.menu._boxPointer._dtpGetPreferredHeightId) { + pmb.menu._boxPointer._container.disconnect(pmb.menu._boxPointer._dtpGetPreferredHeightId); + } + + pmb.menu._boxPointer.sourceActor = pmb.menu._boxPointer._dtpSourceActor; + delete pmb.menu._boxPointer._dtpSourceActor; + pmb.menu._boxPointer._userArrowSide = St.Side.TOP; + }) + + this._removePanelBarriers(p); + + p.disable(); + + let clipContainer = p.panelBox.get_parent(); + + Main.layoutManager._untrackActor(p.panelBox); + Main.layoutManager.removeChrome(clipContainer); + + if (p.isStandalone) { + p.panelBox.destroy(); + } else { + p.panelBox.remove_child(p); + p.remove_child(p.panel.actor); + p.panelBox.add(p.panel.actor); + + p.panelBox.set_position(clipContainer.x, clipContainer.y); + + clipContainer.remove_child(p.panelBox); + Main.layoutManager.addChrome(p.panelBox, { affectsStruts: true, trackFullscreen: true }); + } + }); + + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height); + } + + delete Main.wm._getPositionForDirection; + + if (Main.layoutManager.primaryMonitor) { + Main.layoutManager.panelBox.set_position(Main.layoutManager.primaryMonitor.x, Main.layoutManager.primaryMonitor.y); + Main.layoutManager.panelBox.set_size(Main.layoutManager.primaryMonitor.width, -1); + } + + if (reset) return; + + this._setKeyBindings(false); + + this._signalsHandler.destroy(); + + Main.layoutManager._updateHotCorners = this._oldUpdateHotCorners; + Main.layoutManager._updateHotCorners(); + + Me.settings.disconnect(this._forceHotCornerId); + + if (this._enableHotCornersId) { + Main.layoutManager._interfaceSettings.disconnect(this._enableHotCornersId); + } + + Main.layoutManager._updatePanelBarrier = this._oldUpdatePanelBarrier; + Main.layoutManager._updatePanelBarrier(); + + Utils.getPanelGhost().set_size(-1, -1); + + if (this._oldDoSpringAnimation) { + AppDisplay.BaseAppView.prototype._doSpringAnimation = this._oldDoSpringAnimation; + } + + if (this._oldAnimateIconPosition) { + IconGrid.animateIconPosition = this._oldAnimateIconPosition; + } + + LookingGlass.LookingGlass.prototype._resize = LookingGlass.LookingGlass.prototype._oldResize; + delete LookingGlass.LookingGlass.prototype._oldResize; + + LookingGlass.LookingGlass.prototype.open = LookingGlass.LookingGlass.prototype._oldOpen; + delete LookingGlass.LookingGlass.prototype._oldOpen + + delete Main.panel.style; + }, + + setFocusedMonitor: function(monitor, ignoreRelayout) { + // todo show overview on non primary monitor is not working right now on gnome40 + + // this._needsIconAllocate = 1; + + // if (!this.checkIfFocusedMonitor(monitor)) { + // Main.overview._overview._controls._workspacesDisplay._primaryIndex = monitor.index; + + // Main.overview._overview.clear_constraints(); + // Main.overview._overview.add_constraint(new Layout.MonitorConstraint({ index: monitor.index })); + // } + }, + + _saveMonitors: function() { + //Mutter meta_monitor_manager_get_primary_monitor (global.display.get_primary_monitor()) doesn't return the same + //monitor as GDK gdk_screen_get_primary_monitor (imports.gi.Gdk.Screen.get_default().get_primary_monitor()). + //Since the Mutter function is what's used in gnome-shell and we can't access it from the settings dialog, store + //the monitors information in a setting so we can use the same monitor indexes as the ones in gnome-shell + let primaryIndex = Main.layoutManager.primaryIndex; + let monitors = [primaryIndex]; + + Main.layoutManager.monitors.filter(m => m.index != primaryIndex).forEach(m => monitors.push(m.index)); + Me.settings.set_value('available-monitors', new GLib.Variant('ai', monitors)); + }, + + checkIfFocusedMonitor: function(monitor) { + return Main.overview._overview._controls._workspacesDisplay._primaryIndex == monitor.index; + }, + + _createPanel: function(monitor, isStandalone) { + let panelBox; + let panel; + let clipContainer = new Clutter.Actor(); + + if (isStandalone) { + panelBox = new St.BoxLayout({ name: 'panelBox' }); + } else { + panelBox = Main.layoutManager.panelBox; + Main.layoutManager._untrackActor(panelBox); + panelBox.remove_child(Main.panel.actor); + Main.layoutManager.removeChrome(panelBox); + } + + Main.layoutManager.addChrome(clipContainer, { affectsInputRegion: false }); + clipContainer.add_child(panelBox); + Main.layoutManager.trackChrome(panelBox, { trackFullscreen: true, affectsStruts: true, affectsInputRegion: true }); + + panel = new Panel.dtpPanel(this, monitor, panelBox, isStandalone); + panelBox.add(panel); + panel.enable(); + + panelBox.visible = true; + if (monitor.inFullscreen) { + panelBox.hide(); + } + panelBox.set_position(0, 0); + + return panel; + }, + + _reset: function() { + this.disable(true); + this.allPanels = []; + this.enable(true); + }, + + _updatePanelElementPositions: function() { + this.panelsElementPositions = PanelSettings.getSettingsJson(Me.settings, 'panel-element-positions'); + this.allPanels.forEach(p => p.updateElementPositions()); + }, + + _adjustPanelMenuButton: function(button, monitor, arrowSide) { + if (button) { + Utils.wrapActor(button); + button.menu._boxPointer._dtpSourceActor = button.menu._boxPointer.sourceActor; + button.menu._boxPointer.sourceActor = button.actor; + button.menu._boxPointer._userArrowSide = arrowSide; + button.menu._boxPointer._dtpInPanel = 1; + + if (!button.menu._boxPointer.vfunc_get_preferred_height) { + button.menu._boxPointer._dtpGetPreferredHeightId = button.menu._boxPointer._container.connect('get-preferred-height', (actor, forWidth, alloc) => { + this._getBoxPointerPreferredHeight(button.menu._boxPointer, alloc, monitor); + }); + } + } + }, + + _getBoxPointerPreferredHeight: function(boxPointer, alloc, monitor) { + if (boxPointer._dtpInPanel && boxPointer.sourceActor && Me.settings.get_boolean('intellihide')) { + monitor = monitor || Main.layoutManager.findMonitorForActor(boxPointer.sourceActor); + let panel = Utils.find(global.dashToPanel.panels, p => p.monitor == monitor); + let excess = alloc.natural_size + panel.dtpSize + 10 - monitor.height; // 10 is arbitrary + + if (excess > 0) { + alloc.natural_size -= excess; + } + } + + return [alloc.min_size, alloc.natural_size]; + }, + + _findPanelMenuButtons: function(container) { + let panelMenuButtons = []; + let panelMenuButton; + + let find = parent => parent.get_children().forEach(c => { + if ((panelMenuButton = this._getPanelMenuButton(c))) { + panelMenuButtons.push(panelMenuButton); + } + + find(c); + }); + + find(container); + + return panelMenuButtons; + }, + + _removePanelBarriers: function(panel) { + if (panel.isStandalone && panel._rightPanelBarrier) { + panel._rightPanelBarrier.destroy(); + } + + if (panel._leftPanelBarrier) { + panel._leftPanelBarrier.destroy(); + delete panel._leftPanelBarrier; + } + }, + + _getPanelMenuButton: function(obj) { + return obj._delegate && obj._delegate instanceof PanelMenu.Button ? obj._delegate : 0; + }, + + _setKeyBindings: function(enable) { + let keys = { + 'intellihide-key-toggle': () => this.allPanels.forEach(p => p.intellihide.toggle()) + }; + + Object.keys(keys).forEach(k => { + Utils.removeKeybinding(k); + + if (enable) { + Utils.addKeybinding(k, Me.settings, keys[k], Shell.ActionMode.NORMAL); + } + }); + }, + + _newGetShowAppsButton: function() { + let focusedMonitorIndex = Utils.findIndex(this.allPanels, p => this.checkIfFocusedMonitor(p.monitor)); + + return this.allPanels[focusedMonitorIndex].taskbar.showAppsButton; + } +}); + +// This class drives long-running icon animations, to keep them running in sync +// with each other. +var IconAnimator = Utils.defineClass({ + Name: 'DashToPanel.IconAnimator', + + _init: function(actor) { + this._count = 0; + this._started = false; + this._animations = { + dance: [], + }; + this._timeline = new Clutter.Timeline({ + duration: 3000, + repeat_count: -1, + }); + + /* Just use the construction property when no need to support 3.36 */ + if (this._timeline.set_actor) + this._timeline.set_actor(actor); + + this._timeline.connect('new-frame', () => { + const progress = this._timeline.get_progress(); + const danceRotation = progress < 1/6 ? 15*Math.sin(progress*24*Math.PI) : 0; + const dancers = this._animations.dance; + for (let i = 0, iMax = dancers.length; i < iMax; i++) { + dancers[i].target.rotation_angle_z = danceRotation; + } + }); + }, + + destroy: function() { + this._timeline.stop(); + this._timeline = null; + for (let name in this._animations) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + pair.target.disconnect(pair.targetDestroyId); + } + } + this._animations = null; + }, + + pause: function() { + if (this._started && this._count > 0) { + this._timeline.stop(); + } + this._started = false; + }, + + start: function() { + if (!this._started && this._count > 0) { + this._timeline.start(); + } + this._started = true; + }, + + addAnimation: function(target, name) { + const targetDestroyId = target.connect('destroy', () => this.removeAnimation(target, name)); + this._animations[name].push({ target: target, targetDestroyId: targetDestroyId }); + if (this._started && this._count === 0) { + this._timeline.start(); + } + this._count++; + }, + + removeAnimation: function(target, name) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + if (pair.target === target) { + target.disconnect(pair.targetDestroyId); + pairs.splice(i, 1); + this._count--; + if (this._started && this._count === 0) { + this._timeline.stop(); + } + return; + } + } + } +}); + +function newGetPositionForDirection(direction, fromWs, toWs) { + let [xDest, yDest] = WM.WindowManager.prototype._getPositionForDirection(direction, fromWs, toWs); + + if (direction == Meta.MotionDirection.UP || + direction == Meta.MotionDirection.UP_LEFT || + direction == Meta.MotionDirection.UP_RIGHT) { + yDest -= Main.panel.height; + } else if (direction != Meta.MotionDirection.LEFT && + direction != Meta.MotionDirection.RIGHT) { + yDest += Main.panel.height; + } + + return [xDest, yDest]; +} + +function newDoSpringAnimation(animationDirection) { + this._grid.opacity = 255; + this._grid.animateSpring(animationDirection, Main.overview.getShowAppsButton()); +} + +function newAnimateIconPosition(icon, box, flags, nChangedIcons) { + if (this._needsIconAllocate) { + Utils.allocate(icon, box, flags); + return; + } + + return this._oldAnimateIconPosition(icon, box, flags, nChangedIcons);; +} + +function newUpdateHotCorners() { + // destroy old hot corners + this.hotCorners.forEach(function(corner) { + if (corner) + corner.destroy(); + }); + this.hotCorners = []; + + //global.settings is ubuntu specific setting to disable the hot corner (Tweak tool > Top Bar > Activities Overview Hot Corner) + //this._interfaceSettings is for the setting to disable the hot corner introduced in gnome-shell 3.34 + if ((global.settings.list_keys().indexOf('enable-hot-corners') >= 0 && !global.settings.get_boolean('enable-hot-corners')) || + (this._interfaceSettings && !this._interfaceSettings.get_boolean('enable-hot-corners'))) { + this.emit('hot-corners-changed'); + return; + } + + // build new hot corners + for (let i = 0; i < this.monitors.length; i++) { + let panel = Utils.find(global.dashToPanel.panels, p => p.monitor.index == i); + let panelPosition = panel ? panel.getPosition() : St.Side.BOTTOM; + let panelTopLeft = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT; + let monitor = this.monitors[i]; + let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x; + let cornerY = monitor.y; + + let haveTopLeftCorner = true; + + // If the panel is on the bottom, unless this is explicitly forced, don't add a topleft + // hot corner unless it is actually a top left panel. Otherwise, it stops the mouse + // as you are dragging across. In the future, maybe we will automatically move the + // hotcorner to the bottom when the panel is positioned at the bottom + if (i != this.primaryIndex || (!panelTopLeft && !Me.settings.get_boolean('stockgs-force-hotcorner'))) { + // Check if we have a top left (right for RTL) corner. + // I.e. if there is no monitor directly above or to the left(right) + let besideX = this._rtl ? monitor.x + 1 : cornerX - 1; + let besideY = cornerY; + let aboveX = cornerX; + let aboveY = cornerY - 1; + + for (let j = 0; j < this.monitors.length; j++) { + if (i == j) + continue; + let otherMonitor = this.monitors[j]; + if (besideX >= otherMonitor.x && + besideX < otherMonitor.x + otherMonitor.width && + besideY >= otherMonitor.y && + besideY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + if (aboveX >= otherMonitor.x && + aboveX < otherMonitor.x + otherMonitor.width && + aboveY >= otherMonitor.y && + aboveY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + } + } + + if (haveTopLeftCorner) { + let corner = new Layout.HotCorner(this, monitor, cornerX, cornerY); + + corner.setBarrierSize = size => corner.__proto__.setBarrierSize.call(corner, Math.min(size, 32)); + corner.setBarrierSize(panel ? panel.dtpSize : 32); + this.hotCorners.push(corner); + } else { + this.hotCorners.push(null); + } + } + + this.emit('hot-corners-changed'); +} + +function newUpdatePanelBarrier(panel) { + let barriers = { + _rightPanelBarrier: [(panel.isStandalone ? panel : this)], + _leftPanelBarrier: [panel] + }; + + Object.keys(barriers).forEach(k => { + let obj = barriers[k][0]; + + if (obj[k]) { + obj[k].destroy(); + obj[k] = null; + } + }); + + if (!this.primaryMonitor || !panel.panelBox.height) { + return; + } + + let barrierSize = Math.min(10, panel.panelBox.height); + let fixed1 = panel.monitor.y; + let fixed2 = panel.monitor.y + barrierSize; + + if (panel.checkIfVertical()) { + barriers._rightPanelBarrier.push(panel.monitor.y + panel.monitor.height, Meta.BarrierDirection.POSITIVE_Y); + barriers._leftPanelBarrier.push(panel.monitor.y, Meta.BarrierDirection.NEGATIVE_Y); + } else { + barriers._rightPanelBarrier.push(panel.monitor.x + panel.monitor.width, Meta.BarrierDirection.NEGATIVE_X); + barriers._leftPanelBarrier.push(panel.monitor.x, Meta.BarrierDirection.POSITIVE_X); + } + + switch (panel.getPosition()) { + //values are initialized as St.Side.TOP + case St.Side.BOTTOM: + fixed1 = panel.monitor.y + panel.monitor.height - barrierSize; + fixed2 = panel.monitor.y + panel.monitor.height; + break; + case St.Side.LEFT: + fixed1 = panel.monitor.x; + fixed2 = panel.monitor.x + barrierSize; + break; + case St.Side.RIGHT: + fixed1 = panel.monitor.x + panel.monitor.width; + fixed2 = panel.monitor.x + panel.monitor.width - barrierSize; + break; + } + + //remove left barrier if it overlaps one of the hotcorners + for (let k in this.hotCorners) { + let hc = this.hotCorners[k]; + + if (hc && hc._monitor == panel.monitor && + ((fixed1 == hc._x || fixed2 == hc._x) || fixed1 == hc._y || fixed2 == hc._y)) { + delete barriers._leftPanelBarrier; + break; + } + } + + Object.keys(barriers).forEach(k => { + let barrierOptions = { + display: global.display, + directions: barriers[k][2] + }; + + barrierOptions[panel.varCoord.c1] = barrierOptions[panel.varCoord.c2] = barriers[k][1]; + barrierOptions[panel.fixedCoord.c1] = fixed1; + barrierOptions[panel.fixedCoord.c2] = fixed2; + + barriers[k][0][k] = new Meta.Barrier(barrierOptions); + }); +} + +function _newLookingGlassResize() { + let primaryMonitorPanel = Utils.find(global.dashToPanel.panels, p => p.monitor == Main.layoutManager.primaryMonitor); + let topOffset = primaryMonitorPanel.getPosition() == St.Side.TOP ? primaryMonitorPanel.dtpSize + 8 : 32; + + this._oldResize(); + Utils.wrapActor(this); + Utils.wrapActor(this._objInspector); + + this._hiddenY = Main.layoutManager.primaryMonitor.y + topOffset - this.actor.height; + this._targetY = this._hiddenY + this.actor.height; + this.actor.y = this._hiddenY; + + this._objInspector.actor.set_position(this.actor.x + Math.floor(this.actor.width * 0.1), this._targetY + Math.floor(this.actor.height * 0.1)); +} + +function _newLookingGlassOpen() { + if (this._open) + return; + + this._resize(); + this._oldOpen(); +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js new file mode 100644 index 0000000..52458bb --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelPositions.js @@ -0,0 +1,61 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +var SHOW_APPS_BTN = 'showAppsButton'; +var ACTIVITIES_BTN = 'activitiesButton'; +var TASKBAR = 'taskbar'; +var DATE_MENU = 'dateMenu'; +var SYSTEM_MENU = 'systemMenu'; +var LEFT_BOX = 'leftBox'; +var CENTER_BOX = 'centerBox'; +var RIGHT_BOX = 'rightBox'; +var DESKTOP_BTN = 'desktopButton'; + +var STACKED_TL = 'stackedTL'; +var STACKED_BR = 'stackedBR'; +var CENTERED = 'centered'; +var CENTERED_MONITOR = 'centerMonitor'; + +var TOP = 'TOP'; +var BOTTOM = 'BOTTOM'; +var LEFT = 'LEFT'; +var RIGHT = 'RIGHT'; + +var START = 'START'; +var MIDDLE = 'MIDDLE'; +var END = 'END'; + +var defaults = [ + { element: SHOW_APPS_BTN, visible: true, position: STACKED_TL }, + { element: ACTIVITIES_BTN, visible: false, position: STACKED_TL }, + { element: LEFT_BOX, visible: true, position: STACKED_TL }, + { element: TASKBAR, visible: true, position: STACKED_TL }, + { element: CENTER_BOX, visible: true, position: STACKED_BR }, + { element: RIGHT_BOX, visible: true, position: STACKED_BR }, + { element: DATE_MENU, visible: true, position: STACKED_BR }, + { element: SYSTEM_MENU, visible: true, position: STACKED_BR }, + { element: DESKTOP_BTN, visible: true, position: STACKED_BR }, +]; + +var optionDialogFunctions = {}; + +optionDialogFunctions[SHOW_APPS_BTN] = '_showShowAppsButtonOptions'; +optionDialogFunctions[DESKTOP_BTN] = '_showDesktopButtonOptions'; + +function checkIfCentered(position) { + return position == CENTERED || position == CENTERED_MONITOR; +} \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js new file mode 100644 index 0000000..4feb3fd --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelSettings.js @@ -0,0 +1,112 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Pos = Me.imports.panelPositions; + +/** Return object representing a settings value that is stored as JSON. */ +function getSettingsJson(settings, setting) { + try { + return JSON.parse(settings.get_string(setting)); + } catch(e) { + log('Error parsing positions: ' + e.message); + } +} +/** Write value object as JSON to setting in settings. */ +function setSettingsJson(settings, setting, value) { + try { + const json = JSON.stringify(value); + settings.set_string(setting, json); + } catch(e) { + log('Error serializing setting: ' + e.message); + } +} + +/** Returns size of panel on a specific monitor, in pixels. */ +function getPanelSize(settings, monitorIndex) { + const sizes = getSettingsJson(settings, 'panel-sizes'); + // Pull in deprecated setting if panel-sizes does not have setting for monitor. + const fallbackSize = settings.get_int('panel-size'); + const theDefault = 48; + return sizes[monitorIndex] || fallbackSize || theDefault; +} + +function setPanelSize(settings, monitorIndex, value) { + if (!(Number.isInteger(value) && value <= 128 && value >= 16)) { + log('Not setting invalid panel size: ' + value); + return; + } + let sizes = getSettingsJson(settings, 'panel-sizes'); + sizes[monitorIndex] = value; + setSettingsJson(settings, 'panel-sizes', sizes); +} + +/** + * Returns length of panel on a specific monitor, as a whole number percent, + * from settings. e.g. 100 + */ +function getPanelLength(settings, monitorIndex) { + const lengths = getSettingsJson(settings, 'panel-lengths'); + const theDefault = 100; + return lengths[monitorIndex] || theDefault; +} + +function setPanelLength(settings, monitorIndex, value) { + if (!(Number.isInteger(value) && value <= 100 && value >= 0)) { + log('Not setting invalid panel length: ' + value); + return; + } + let lengths = getSettingsJson(settings, 'panel-lengths'); + lengths[monitorIndex] = value; + setSettingsJson(settings, 'panel-lengths', lengths); +} + +/** Returns position of panel on a specific monitor. */ +function getPanelPosition(settings, monitorIndex) { + const positions = getSettingsJson(settings, 'panel-positions'); + const fallbackPosition = settings.get_string('panel-position'); + const theDefault = Pos.BOTTOM; + return positions[monitorIndex] || fallbackPosition || theDefault; +} + +function setPanelPosition(settings, monitorIndex, value) { + if (!(value === Pos.TOP || value === Pos.BOTTOM || value === Pos.LEFT + || value === Pos.RIGHT)) { + log('Not setting invalid panel position: ' + value); + return; + } + const positions = getSettingsJson(settings, 'panel-positions'); + positions[monitorIndex] = value; + setSettingsJson(settings, 'panel-positions', positions); +} + +/** Returns anchor location of panel on a specific monitor. */ +function getPanelAnchor(settings, monitorIndex) { + const anchors = getSettingsJson(settings, 'panel-anchors'); + const theDefault = Pos.MIDDLE; + return anchors[monitorIndex] || theDefault; +} + +function setPanelAnchor(settings, monitorIndex, value) { + if (!(value === Pos.START || value === Pos.MIDDLE || value === Pos.END)) { + log('Not setting invalid panel anchor: ' + value); + return; + } + const anchors = getSettingsJson(settings, 'panel-anchors'); + anchors[monitorIndex] = value; + setSettingsJson(settings, 'panel-anchors', anchors); +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js new file mode 100644 index 0000000..2697ace --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/panelStyle.js @@ -0,0 +1,326 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Credits: + * Ideas for recursing child actors and assigning inline styles + * are based on code from the StatusAreaHorizontalSpacing extension + * https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension + * mathematical.coffee@gmail.com + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const ExtensionUtils = imports.misc.extensionUtils; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const St = imports.gi.St; +const Shell = imports.gi.Shell; + +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +var dtpPanelStyle = Utils.defineClass({ + Name: 'DashToPanel.PanelStyle', + + _init: function() { + + }, + + enable : function(panel) { + this.panel = panel; + + this._applyStyles(); + + this._bindSettingsChanges(); + }, + + disable: function () { + for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { + Me.settings.disconnect(this._dtpSettingsSignalIds[i]); + } + + this._removeStyles(); + }, + + _bindSettingsChanges: function() { + let configKeys = [ + "tray-size", + "leftbox-size", + "tray-padding", + "leftbox-padding", + "status-icon-padding", + ]; + + this._dtpSettingsSignalIds = []; + + for(let i in configKeys) { + this._dtpSettingsSignalIds.push(Me.settings.connect('changed::' + configKeys[i], Lang.bind(this, function () { + this._removeStyles(); + this._applyStyles(); + }))); + } + }, + + _applyStyles: function() { + this._rightBoxOperations = []; + + let trayPadding = Me.settings.get_int('tray-padding'); + let isVertical = this.panel.checkIfVertical(); + let paddingStyle = 'padding: ' + (isVertical ? '%dpx 0' : '0 %dpx'); + + if(trayPadding >= 0) { + let operation = {}; + let trayPaddingStyleLine; + + if (isVertical) { + trayPaddingStyleLine = paddingStyle.format(trayPadding); + operation.compareFn = function (actor) { + let parent = actor.get_parent(); + return (parent && parent.has_style_class_name && parent.has_style_class_name('panel-button')); + }; + } else { + trayPaddingStyleLine = '-natural-hpadding: %dpx'.format(trayPadding); + if (trayPadding < 6) { + trayPaddingStyleLine += '; -minimum-hpadding: %dpx'.format(trayPadding); + } + + operation.compareFn = function (actor) { + return (actor.has_style_class_name && actor.has_style_class_name('panel-button')); + }; + } + + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayPaddingStyleLine, operationIdx); + this._refreshPanelButton(actor); + }); + this._rightBoxOperations.push(operation); + } + + let statusIconPadding = Me.settings.get_int('status-icon-padding'); + if(statusIconPadding >= 0) { + let statusIconPaddingStyleLine = paddingStyle.format(statusIconPadding) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.has_style_class_name && actor.has_style_class_name('system-status-icon')); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, statusIconPaddingStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + } + + let trayContentSize = Me.settings.get_int('tray-size'); + if(trayContentSize > 0) { + let trayIconSizeStyleLine = 'icon-size: %dpx'.format(trayContentSize) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Icon'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayIconSizeStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + + let trayContentSizeStyleLine = 'font-size: %dpx'.format(trayContentSize) + operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Label'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, trayContentSizeStyleLine, operationIdx); + }); + this._rightBoxOperations.push(operation); + + this._overrideStyle(this.panel._rightBox, trayContentSizeStyleLine, 0); + this._overrideStyle(this.panel._centerBox, trayContentSizeStyleLine, 0); + } + + // center box has been moved next to the right box and will be treated the same + this._centerBoxOperations = this._rightBoxOperations; + + this._leftBoxOperations = []; + + let leftboxPadding = Me.settings.get_int('leftbox-padding'); + if(leftboxPadding >= 0) { + let leftboxPaddingStyleLine = paddingStyle.format(leftboxPadding); + let operation = {}; + operation.compareFn = function (actor) { + let parent = actor.get_parent(); + return (parent && parent.has_style_class_name && parent.has_style_class_name('panel-button')); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxPaddingStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + } + + let leftboxContentSize = Me.settings.get_int('leftbox-size'); + if(leftboxContentSize > 0) { + let leftboxIconSizeStyleLine = 'icon-size: %dpx'.format(leftboxContentSize) + let operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Icon'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxIconSizeStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + + let leftboxContentSizeStyleLine = 'font-size: %dpx'.format(leftboxContentSize) + operation = {}; + operation.compareFn = function (actor) { + return (actor.constructor && actor.constructor.name == 'St_Label'); + }; + operation.applyFn = Lang.bind(this, function (actor, operationIdx) { + this._overrideStyle(actor, leftboxContentSizeStyleLine, operationIdx); + }); + this._leftBoxOperations.push(operation); + + this._overrideStyle(this.panel._leftBox, leftboxContentSizeStyleLine, 0); + } + + this._applyStylesRecursively(); + + /* connect signal */ + this._rightBoxActorAddedID = this.panel._rightBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._rightBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._rightBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._centerBoxActorAddedID = this.panel._centerBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._centerBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._centerBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._leftBoxActorAddedID = this.panel._leftBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._leftBoxOperations.length) + this._recursiveApply(actor, this._leftBoxOperations); + }) + ); + }, + + _removeStyles: function() { + /* disconnect signal */ + if (this._rightBoxActorAddedID) + this.panel._rightBox.disconnect(this._rightBoxActorAddedID); + if (this._centerBoxActorAddedID) + this.panel._centerBox.disconnect(this._centerBoxActorAddedID); + if (this._leftBoxActorAddedID) + this.panel._leftBox.disconnect(this._leftBoxActorAddedID); + + this._restoreOriginalStyle(this.panel._rightBox); + this._restoreOriginalStyle(this.panel._centerBox); + this._restoreOriginalStyle(this.panel._leftBox); + + this._applyStylesRecursively(true); + }, + + _applyStylesRecursively: function(restore) { + /*recurse actors */ + if(this._rightBoxOperations.length) { + // add the system menu as we move it from the rightbox to the panel to position it independently + let children = this.panel._rightBox.get_children().concat([this.panel.statusArea.aggregateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._rightBoxOperations, restore); + } + + if(this._centerBoxOperations.length) { + // add the date menu as we move it from the centerbox to the panel to position it independently + let children = this.panel._centerBox.get_children().concat([this.panel.statusArea.dateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._centerBoxOperations, restore); + } + + if(this._leftBoxOperations.length) { + let children = this.panel._leftBox.get_children(); + for(let i in children) + this._recursiveApply(children[i], this._leftBoxOperations, restore); + } + }, + + _recursiveApply: function(actor, operations, restore) { + for(let i in operations) { + let o = operations[i]; + if(o.compareFn(actor)) + if(restore) + o.restoreFn ? o.restoreFn(actor) : this._restoreOriginalStyle(actor); + else + o.applyFn(actor, i); + } + + if(actor.get_children) { + let children = actor.get_children(); + for(let i in children) { + this._recursiveApply(children[i], operations, restore); + } + } + }, + + _overrideStyle: function(actor, styleLine, operationIdx) { + if (actor._dtp_original_inline_style === undefined) { + actor._dtp_original_inline_style = actor.get_style(); + } + + if(actor._dtp_style_overrides === undefined) { + actor._dtp_style_overrides = {}; + } + + actor._dtp_style_overrides[operationIdx] = styleLine; + let newStyleLine = ''; + for(let i in actor._dtp_style_overrides) + newStyleLine += actor._dtp_style_overrides[i] + '; '; + actor.set_style(newStyleLine + (actor._dtp_original_inline_style || '')); + }, + + _restoreOriginalStyle: function(actor) { + if (actor._dtp_original_inline_style !== undefined) { + actor.set_style(actor._dtp_original_inline_style); + delete actor._dtp_original_inline_style; + delete actor._dtp_style_overrides; + } + + if (actor.has_style_class_name('panel-button')) { + this._refreshPanelButton(actor); + } + }, + + _refreshPanelButton: function(actor) { + if (actor.visible && imports.misc.config.PACKAGE_VERSION >= '3.34.0') { + //force gnome 3.34+ to refresh (having problem with the -natural-hpadding) + let parent = actor.get_parent(); + let children = parent.get_children(); + let actorIndex = 0; + + if (children.length > 1) { + actorIndex = children.indexOf(actor); + } + + this._ignoreAddedChild = [this.panel._centerBox, this.panel._rightBox].indexOf(parent) >= 0; + + parent.remove_child(actor); + parent.insert_child_at_index(actor, actorIndex); + } + } + +}); diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js new file mode 100644 index 0000000..3040787 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/prefs.js @@ -0,0 +1,2468 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg. + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const GdkPixbuf = imports.gi.GdkPixbuf; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Gdk = imports.gi.Gdk; +const Lang = imports.lang; +const Mainloop = imports.mainloop; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; +const N_ = function(e) { return e }; +const PanelSettings = Me.imports.panelSettings; +const Pos = Me.imports.panelPositions; + +const SCALE_UPDATE_TIMEOUT = 500; +const DEFAULT_PANEL_SIZES = [ 128, 96, 64, 48, 32, 24, 16 ]; +const DEFAULT_FONT_SIZES = [ 96, 64, 48, 32, 24, 16, 0 ]; +const DEFAULT_MARGIN_SIZES = [ 32, 24, 16, 12, 8, 4, 0 ]; +const DEFAULT_PADDING_SIZES = [ 32, 24, 16, 12, 8, 4, 0, -1 ]; +// Minimum length could be 0, but a higher value may help prevent confusion about where the panel went. +const LENGTH_MARKS = [ 100, 90, 80, 70, 60, 50, 40, 30, 20, 10 ]; +const MAX_WINDOW_INDICATOR = 4; + +const SCHEMA_PATH = '/org/gnome/shell/extensions/dash-to-panel/'; +const GSET = 'gnome-shell-extension-tool'; + +/** + * This function was copied from the activities-config extension + * https://github.com/nls1729/acme-code/tree/master/activities-config + * by Norman L. Smith. + */ +function cssHexString(css) { + let rrggbb = '#'; + let start; + for (let loop = 0; loop < 3; loop++) { + let end = 0; + let xx = ''; + for (let loop = 0; loop < 2; loop++) { + while (true) { + let x = css.slice(end, end + 1); + if ((x == '(') || (x == ',') || (x == ')')) + break; + end++; + } + if (loop == 0) { + end++; + start = end; + } + } + xx = parseInt(css.slice(start, end)).toString(16); + if (xx.length == 1) + xx = '0' + xx; + rrggbb += xx; + css = css.slice(end); + } + return rrggbb; +} + +function setShortcut(settings, shortcutName) { + let shortcut_text = settings.get_string(shortcutName + '-text'); + let [key, mods] = Gtk.accelerator_parse(shortcut_text); + + if (Gtk.accelerator_valid(key, mods)) { + let shortcut = Gtk.accelerator_name(key, mods); + settings.set_strv(shortcutName, [shortcut]); + } + else { + settings.set_strv(shortcutName, []); + } +} + +function checkHotkeyPrefix(settings) { + settings.delay(); + + let hotkeyPrefix = settings.get_string('hotkey-prefix-text'); + if (hotkeyPrefix == 'Super') + hotkeyPrefix = ''; + else if (hotkeyPrefix == 'SuperAlt') + hotkeyPrefix = ''; + let [, mods] = Gtk.accelerator_parse(hotkeyPrefix); + let [, shift_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + let [, ctrl_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + + let numHotkeys = 10; + for (let i = 1; i <= numHotkeys; i++) { + let number = i; + if (number == 10) + number = 0; + let key = Gdk.keyval_from_name(number.toString()); + let key_kp = Gdk.keyval_from_name('KP_' + number.toString()); + if (Gtk.accelerator_valid(key, mods)) { + let shortcut = Gtk.accelerator_name(key, mods); + let shortcut_kp = Gtk.accelerator_name(key_kp, mods); + + // Setup shortcut strings + settings.set_strv('app-hotkey-' + i, [shortcut]); + settings.set_strv('app-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, shift_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, shift_mods); + settings.set_strv('app-shift-hotkey-' + i, [shortcut]); + settings.set_strv('app-shift-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, ctrl_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, ctrl_mods); + settings.set_strv('app-ctrl-hotkey-' + i, [shortcut]); + settings.set_strv('app-ctrl-hotkey-kp-' + i, [shortcut_kp]); + } + else { + // Reset default settings for the relevant keys if the + // accelerators are invalid + let keys = ['app-hotkey-' + i, 'app-shift-hotkey-' + i, 'app-ctrl-hotkey-' + i, // Regular numbers + 'app-hotkey-kp-' + i, 'app-shift-hotkey-kp-' + i, 'app-ctrl-hotkey-kp-' + i]; // Key-pad numbers + keys.forEach(function(val) { + settings.set_value(val, settings.get_default_value(val)); + }, this); + } + } + + settings.apply(); +} + +function mergeObjects(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +const Preferences = new Lang.Class({ + Name: 'DashToPanel.Preferences', + + _init: function() { + this._settings = Convenience.getSettings('org.gnome.shell.extensions.dash-to-panel'); + this._rtl = (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL); + this._builder = new Gtk.Builder(); + this._builder.set_scope(new BuilderScope(this)); + this._builder.set_translation_domain(Me.metadata['gettext-domain']); + this._builder.add_from_file(Me.path + '/Settings.ui'); + this.notebook = this._builder.get_object('settings_notebook'); + + // Timeout to delay the update of the settings + this._panel_size_timeout = 0; + this._dot_height_timeout = 0; + this._tray_size_timeout = 0; + this._leftbox_size_timeout = 0; + this._appicon_margin_timeout = 0; + this._appicon_padding_timeout = 0; + this._opacity_timeout = 0; + this._tray_padding_timeout = 0; + this._statusicon_padding_timeout = 0; + this._leftbox_padding_timeout = 0; + this._addFormatValueCallbacks(); + this._bindSettings(); + }, + + /** + * Connect signals + */ + _connector: function(builder, object, signal, handler) { + object.connect(signal, Lang.bind(this, this._SignalHandler[handler])); + }, + + _updateVerticalRelatedOptions: function() { + let position = this._getPanelPosition(this._currentMonitorIndex); + let isVertical = position == Pos.LEFT || position == Pos.RIGHT; + let showDesktopWidthLabel = this._builder.get_object('show_showdesktop_width_label'); + + showDesktopWidthLabel.set_text(isVertical ? _('Show Desktop button height (px)') : _('Show Desktop button width (px)')); + + this._displayPanelPositionsForMonitor(this._currentMonitorIndex); + }, + + _maybeDisableTopPosition: function() { + let keepTopPanel = this._settings.get_boolean('stockgs-keep-top-panel'); + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let topAvailable = !keepTopPanel || (!monitorSync && this._currentMonitorIndex != this.monitors[0]); + let topRadio = this._builder.get_object('position_top_button'); + + topRadio.set_sensitive(topAvailable); + topRadio.set_tooltip_text(!topAvailable ? _('Unavailable when gnome-shell top panel is present') : ''); + }, + + _getPanelPosition: function(monitorIndex) { + return PanelSettings.getPanelPosition(this._settings, monitorIndex); + }, + + _setPanelPosition: function(position) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelPosition(this._settings, monitorIndex, position); + }); + this._setAnchorLabels(this._currentMonitorIndex); + }, + + _setPositionRadios: function(position) { + this._ignorePositionRadios = true; + + switch (position) { + case Pos.BOTTOM: + this._builder.get_object('position_bottom_button').set_active(true); + break; + case Pos.TOP: + this._builder.get_object('position_top_button').set_active(true); + break; + case Pos.LEFT: + this._builder.get_object('position_left_button').set_active(true); + break; + case Pos.RIGHT: + this._builder.get_object('position_right_button').set_active(true); + break; + } + + this._ignorePositionRadios = false; + }, + + /** + * Set panel anchor combo labels according to whether the monitor's panel is vertical + * or horizontal, or if all monitors' panels are being configured and they are a mix + * of vertical and horizontal. + */ + _setAnchorLabels: function(currentMonitorIndex) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [currentMonitorIndex]; + const allVertical = monitorsToSetFor.every(i => { + const position = PanelSettings.getPanelPosition(this._settings, i); + return position === Pos.LEFT || position === Pos.RIGHT + }); + const allHorizontal = monitorsToSetFor.every(i => { + const position = PanelSettings.getPanelPosition(this._settings, i); + return position === Pos.TOP || position === Pos.BOTTOM; + }); + + const anchor_combo = this._builder.get_object('panel_anchor_combo'); + anchor_combo.remove_all(); + + if (allHorizontal) { + anchor_combo.append(Pos.START, _('Left')); + anchor_combo.append(Pos.MIDDLE, _('Center')); + anchor_combo.append(Pos.END, _('Right')); + } else if (allVertical) { + anchor_combo.append(Pos.START, _('Top')); + anchor_combo.append(Pos.MIDDLE, _('Middle')); + anchor_combo.append(Pos.END, _('Bottom')); + } else { + // Setting for a mix of horizontal and vertical panels on different monitors. + anchor_combo.append(Pos.START, _('Start')); + anchor_combo.append(Pos.MIDDLE, _('Middle')); + anchor_combo.append(Pos.END, _('End')); + } + + // Set combo box after re-populating its options. But only if it's for a single-panel + // configuration, or a multi-panel configuration where they all have the same anchor + // setting. So don't set the combo box if there is a multi-panel configuration with + // different anchor settings. + const someAnchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); + if (monitorsToSetFor.every(i => + PanelSettings.getPanelAnchor(this._settings, i) === someAnchor)) { + const panel_anchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); + this._builder.get_object('panel_anchor_combo').set_active_id(panel_anchor); + } + }, + + /** + * When a monitor is selected, update the widgets for panel position, size, anchoring, + * and contents so they accurately show the settings for the panel on that monitor. + */ + _updateWidgetSettingsForMonitor: function(monitorIndex) { + // Update display of panel screen position setting + this._maybeDisableTopPosition(); + const panelPosition = this._getPanelPosition(monitorIndex); + this._setPositionRadios(panelPosition); + + // Update display of thickness, length, and anchor settings + const panel_size_scale = this._builder.get_object('panel_size_scale'); + const size = PanelSettings.getPanelSize(this._settings, monitorIndex); + panel_size_scale.set_value(size); + + const panel_length_scale = this._builder.get_object('panel_length_scale'); + const length = PanelSettings.getPanelLength(this._settings, monitorIndex); + panel_length_scale.set_value(length); + this._setAnchorWidgetSensitivity(length); + + this._setAnchorLabels(monitorIndex); + + // Update display of panel content settings + this._displayPanelPositionsForMonitor(monitorIndex); + }, + + /** + * Anchor is only relevant if panel length is less than 100%. Enable or disable + * anchor widget sensitivity accordingly. + */ + _setAnchorWidgetSensitivity: function(panelLength) { + const isPartialLength = panelLength < 100; + this._builder.get_object('panel_anchor_label').set_sensitive(isPartialLength); + this._builder.get_object('panel_anchor_combo').set_sensitive(isPartialLength); + }, + + _displayPanelPositionsForMonitor: function(monitorIndex) { + let taskbarListBox = this._builder.get_object('taskbar_display_listbox'); + + while(taskbarListBox.get_first_child()) + { + taskbarListBox.remove(taskbarListBox.get_first_child()); + } + + let labels = {}; + let panelPosition = this._getPanelPosition(monitorIndex); + let isVertical = panelPosition == Pos.LEFT || panelPosition == Pos.RIGHT; + let panelElementPositionsSettings = PanelSettings.getSettingsJson(this._settings, 'panel-element-positions'); + let panelElementPositions = panelElementPositionsSettings[monitorIndex] || Pos.defaults; + let updateElementsSettings = () => { + let newPanelElementPositions = []; + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let monitors = monitorSync ? this.monitors : [monitorIndex]; + + let child = taskbarListBox.get_first_child(); + while (child != null) + { + newPanelElementPositions.push({ + element: child.id, + visible: child.visibleToggleBtn.get_active(), + position: child.positionCombo.get_active_id() + }); + child = child.get_next_sibling(); + } + + monitors.forEach(m => panelElementPositionsSettings[m] = newPanelElementPositions); + this._settings.set_string('panel-element-positions', JSON.stringify(panelElementPositionsSettings)); + }; + + + labels[Pos.SHOW_APPS_BTN] = _('Show Applications button'); + labels[Pos.ACTIVITIES_BTN] = _('Activities button'); + labels[Pos.TASKBAR] = _('Taskbar'); + labels[Pos.DATE_MENU] = _('Date menu'); + labels[Pos.SYSTEM_MENU] = _('System menu'); + labels[Pos.LEFT_BOX] = _('Left box'); + labels[Pos.CENTER_BOX] = _('Center box'); + labels[Pos.RIGHT_BOX] = _('Right box'); + labels[Pos.DESKTOP_BTN] = _('Desktop button'); + + panelElementPositions.forEach(el => { + let row = new Gtk.ListBoxRow(); + let grid = new Gtk.Grid({ margin_start: 12, margin_end: 12, column_spacing: 8 }); + let upDownGrid = new Gtk.Grid({ column_spacing: 2 }); + let upBtn = new Gtk.Button({ tooltip_text: _('Move up') }); + let upImg = new Gtk.Image({ icon_name: 'go-up-symbolic', pixel_size: 12 }); + let downBtn = new Gtk.Button({ tooltip_text: _('Move down') }); + let downImg = new Gtk.Image({ icon_name: 'go-down-symbolic', pixel_size: 12 }); + let visibleToggleBtn = new Gtk.ToggleButton({ label: _('Visible'), active: el.visible }); + let positionCombo = new Gtk.ComboBoxText({ tooltip_text: _('Select element position') }); + let upDownClickHandler = limit => { + let index = row.get_index(); + + if (index != limit) { + taskbarListBox.remove(row); + taskbarListBox.insert(row, index + (!limit ? -1 : 1)); + updateElementsSettings(); + } + }; + + positionCombo.append(Pos.STACKED_TL, isVertical ? _('Stacked to top') : _('Stacked to left')); + positionCombo.append(Pos.STACKED_BR, isVertical ? _('Stacked to bottom') :_('Stacked to right')); + positionCombo.append(Pos.CENTERED, _('Centered')); + positionCombo.append(Pos.CENTERED_MONITOR, _('Monitor Center')); + positionCombo.set_active_id(el.position); + + upBtn.connect('clicked', () => upDownClickHandler(0)); + downBtn.connect('clicked', () => upDownClickHandler(panelElementPositions.length - 1)); + visibleToggleBtn.connect('toggled', () => updateElementsSettings()); + positionCombo.connect('changed', () => updateElementsSettings()); + + upBtn.set_child(upImg); + downBtn.set_child(downImg); + + upDownGrid.attach(upBtn, 0, 0, 1, 1); + upDownGrid.attach(downBtn, 1, 0, 1, 1); + + grid.attach(upDownGrid, 0, 0, 1, 1); + grid.attach(new Gtk.Label({ label: labels[el.element], xalign: 0, hexpand: true }), 1, 0, 1, 1); + + if (Pos.optionDialogFunctions[el.element]) { + let cogImg = new Gtk.Image({ icon_name: 'emblem-system-symbolic' }); + let optionsBtn = new Gtk.Button({ tooltip_text: _('More options') }); + + optionsBtn.get_style_context().add_class('circular'); + optionsBtn.set_child(cogImg); + grid.attach(optionsBtn, 2, 0, 1, 1); + + optionsBtn.connect('clicked', () => this[Pos.optionDialogFunctions[el.element]]()); + } + + grid.attach(visibleToggleBtn, 3, 0, 1, 1); + grid.attach(positionCombo, 4, 0, 1, 1); + + row.id = el.element; + row.visibleToggleBtn = visibleToggleBtn; + row.positionCombo = positionCombo; + + row.set_child(grid); + taskbarListBox.insert(row, -1); + }); + }, + + _showShowAppsButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Applications options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('show_applications_options'); + dialog.get_content_area().append(box); + + let fileChooserButton = this._builder.get_object('show_applications_icon_file_filebutton'); + let fileChooser = new Gtk.FileChooserNative({ title: _('Open icon'), transient_for: dialog }); + let fileImage = this._builder.get_object('show_applications_current_icon_image'); + let fileFilter = new Gtk.FileFilter(); + fileFilter.add_pixbuf_formats(); + fileChooser.filter = fileFilter; + + let handleIconChange = function(newIconPath) { + if (newIconPath && GLib.file_test(newIconPath, GLib.FileTest.EXISTS)) { + let file = Gio.File.new_for_path(newIconPath); + let pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale(file.read(null), 32, 32, true, null); + + fileImage.set_from_pixbuf(pixbuf); + fileChooser.set_file(file); + fileChooserButton.set_label(newIconPath); + } else { + newIconPath = ''; + fileImage.set_from_icon_name('view-app-grid-symbolic'); + let picturesFolder = Gio.File.new_for_path(GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES)); + fileChooser.set_file(picturesFolder); + fileChooserButton.set_label("(None)"); + } + + this._settings.set_string('show-apps-icon-file', newIconPath || ''); + }; + + fileChooserButton.connect('clicked', Lang.bind(this, function() { + fileChooser.show(); + })); + + fileChooser.connect('response', widget => handleIconChange.call(this, widget.get_file().get_path())); + handleIconChange.call(this, this._settings.get_string('show-apps-icon-file')); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-apps-icon-side-padding', this._settings.get_default_value('show-apps-icon-side-padding')); + this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); + this._settings.set_value('show-apps-override-escape', this._settings.get_default_value('show-apps-override-escape')); + handleIconChange.call(this, null); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + fileChooser.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + }, + + _showDesktopButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Desktop options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_show_showdesktop_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('showdesktop-button-width', widget.get_value()); + })); + + this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); + this._builder.get_object('show_showdesktop_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-showdesktop-delay', widget.get_value()); + })); + + this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); + this._builder.get_object('show_showdesktop_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-showdesktop-time', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('showdesktop-button-width', this._settings.get_default_value('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + + this._settings.set_value('show-showdesktop-hover', this._settings.get_default_value('show-showdesktop-hover')); + + this._settings.set_value('show-showdesktop-delay', this._settings.get_default_value('show-showdesktop-delay')); + this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); + + this._settings.set_value('show-showdesktop-time', this._settings.get_default_value('show-showdesktop-time')); + this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + }, + + _addFormatValueCallbacks: function() { + // position + this._builder.get_object('panel_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // style + this._builder.get_object('appicon_margin_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('appicon_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // fine-tune box1 + this._builder.get_object('tray_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('leftbox_size_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // fine-tune box2 + this._builder.get_object('tray_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('statusicon_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + this._builder.get_object('leftbox_padding_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return value + ' px'; + })); + + // animate hovering app icons dialog + this._builder.get_object('animate_appicon_hover_options_duration_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d ms").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_rotation_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d °").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_travel_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d %%").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_zoom_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%d %%").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_convexity_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return _("%.1f").format(value); + })); + + this._builder.get_object('animate_appicon_hover_options_extent_scale') + .set_format_value_func(Lang.bind(this, function(scale, value) { + return Gettext.ngettext("%d icon", "%d icons", value).format(value); + })); + }, + + _bindSettings: function() { + // size options + let panel_size_scale = this._builder.get_object('panel_size_scale'); + panel_size_scale.set_range(DEFAULT_PANEL_SIZES[DEFAULT_PANEL_SIZES.length - 1], DEFAULT_PANEL_SIZES[0]); + DEFAULT_PANEL_SIZES.slice(1, -1).forEach(function(val) { + panel_size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); + }); + + // Correct for rtl languages + if (this._rtl) { + // Flip value position: this is not done automatically + panel_size_scale.set_value_pos(Gtk.PositionType.LEFT); + // I suppose due to a bug, having a more than one mark and one above a value of 100 + // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable + // and then manually inverting it + panel_size_scale.set_flippable(false); + panel_size_scale.set_inverted(true); + } + + // Dots Position option + let dotPosition = this._settings.get_string('dot-position'); + + switch (dotPosition) { + case 'BOTTOM': + this._builder.get_object('dots_bottom_button').set_active(true); + break; + case 'TOP': + this._builder.get_object('dots_top_button').set_active(true); + break; + case 'LEFT': + this._builder.get_object('dots_left_button').set_active(true); + break; + case 'RIGHT': + this._builder.get_object('dots_right_button').set_active(true); + break; + } + + this._builder.get_object('dot_style_focused_combo').set_active_id(this._settings.get_string('dot-style-focused')); + this._builder.get_object('dot_style_focused_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('dot-style-focused', widget.get_active_id()); + })); + + this._builder.get_object('dot_style_unfocused_combo').set_active_id(this._settings.get_string('dot-style-unfocused')); + this._builder.get_object('dot_style_unfocused_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('dot-style-unfocused', widget.get_active_id()); + })); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + let idx = i; + this._builder.get_object('dot_color_' + idx + '_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('dot-color-' + idx, hexString); + })); + + this._builder.get_object('dot_color_unfocused_' + idx + '_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('dot-color-unfocused-' + idx, hexString); + })); + } + + this._builder.get_object('dot_color_apply_all_button').connect('clicked', Lang.bind(this, function() { + for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-' + i, this._settings.get_value('dot-color-1')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + } + })); + + this._builder.get_object('dot_color_unfocused_apply_all_button').connect('clicked', Lang.bind(this, function() { + for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_value('dot-color-unfocused-1')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + })); + + this._builder.get_object('focus_highlight_color_colorbutton').connect('color-set', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('focus-highlight-color', hexString); + })); + + this._builder.get_object('dot_style_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Running Indicator Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_dots_options'); + dialog.get_content_area().append(box); + + this._settings.bind('dot-color-dominant', + this._builder.get_object('dot_color_dominant_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('dot_color_override_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + // when either becomes active, turn the other off + this._builder.get_object('dot_color_dominant_switch').connect('state-set', Lang.bind (this, function(widget) { + if (widget.get_active()) this._settings.set_boolean('dot-color-override', false); + })); + this._builder.get_object('dot_color_override_switch').connect('state-set', Lang.bind (this, function(widget) { + if (widget.get_active()) this._settings.set_boolean('dot-color-dominant', false); + })); + + this._settings.bind('dot-color-unfocused-different', + this._builder.get_object('dot_color_unfocused_different_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('grid_dot_color'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-override', + this._builder.get_object('dot_color_unfocused_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('dot-color-unfocused-different', + this._builder.get_object('grid_dot_color_unfocused'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + + this._settings.bind('focus-highlight', + this._builder.get_object('focus_highlight_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight', + this._builder.get_object('grid_focus_highlight_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_dominant_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_color_label'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('focus-highlight-dominant', + this._builder.get_object('focus_highlight_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('focus-highlight-color')); + this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); + }).apply(this); + + this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); + this._builder.get_object('focus_highlight_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('focus-highlight-opacity', widget.get_value()); + })); + + this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); + this._builder.get_object('dot_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('dot-size', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('dot-color-dominant', this._settings.get_default_value('dot-color-dominant')); + this._settings.set_value('dot-color-override', this._settings.get_default_value('dot-color-override')); + this._settings.set_value('dot-color-unfocused-different', this._settings.get_default_value('dot-color-unfocused-different')); + + this._settings.set_value('focus-highlight-color', this._settings.get_default_value('focus-highlight-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('focus-highlight-color')); + this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); + + this._settings.set_value('focus-highlight-opacity', this._settings.get_default_value('focus-highlight-opacity')); + this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); + + for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { + this._settings.set_value('dot-color-' + i, this._settings.get_default_value('dot-color-' + i)); + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-' + i)); + this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); + + this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_default_value('dot-color-unfocused-' + i)); + rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); + this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); + } + + this._settings.set_value('dot-size', this._settings.get_default_value('dot-size')); + this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); + + this._settings.set_value('focus-highlight', this._settings.get_default_value('focus-highlight')); + this._settings.set_value('focus-highlight-dominant', this._settings.get_default_value('focus-highlight-dominant')); + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + //multi-monitor + this.monitors = this._settings.get_value('available-monitors').deep_unpack(); + + let dtpPrimaryMonitorIndex = this.monitors.indexOf(this._settings.get_int('primary-monitor')); + + if (dtpPrimaryMonitorIndex < 0) { + dtpPrimaryMonitorIndex = 0; + } + + this._currentMonitorIndex = this.monitors[dtpPrimaryMonitorIndex]; + + this._settings.connect('changed::panel-positions', () => this._updateVerticalRelatedOptions()); + this._updateVerticalRelatedOptions(); + + for (let i = 0; i < this.monitors.length; ++i) { + //the primary index is the first one in the "available-monitors" setting + let label = !i ? _('Primary monitor') : _('Monitor ') + (i + 1); + + this._builder.get_object('multimon_primary_combo').append_text(label); + this._builder.get_object('taskbar_position_monitor_combo').append_text(label); + } + + this._builder.get_object('multimon_primary_combo').set_active(dtpPrimaryMonitorIndex); + this._builder.get_object('taskbar_position_monitor_combo').set_active(dtpPrimaryMonitorIndex); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_sync_button'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_monitor_combo'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.connect('changed::panel-element-positions-monitors-sync', () => { + this._maybeDisableTopPosition(); + // The anchor combo box may has different labels for single- or all-monitor configuration. + this._setAnchorLabels(this._currentMonitorIndex); + }); + + this._builder.get_object('multimon_primary_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('primary-monitor', this.monitors[widget.get_active()]); + })); + + this._builder.get_object('taskbar_position_monitor_combo').connect('changed', Lang.bind (this, function(widget) { + this._currentMonitorIndex = this.monitors[widget.get_active()]; + this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); + })); + + this._settings.bind('multi-monitors', + this._builder.get_object('multimon_multi_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + if (this.monitors.length === 1) { + this._builder.get_object('multimon_multi_switch').set_sensitive(false); + } + + const panel_length_scale = this._builder.get_object('panel_length_scale'); + panel_length_scale.connect('value-changed', Lang.bind (this, function(widget) { + const value = widget.get_value(); + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelLength(this._settings, monitorIndex, value); + }); + + this._setAnchorWidgetSensitivity(value); + })); + + this._builder.get_object('panel_anchor_combo').connect('changed', Lang.bind (this, function(widget) { + const value = widget.get_active_id(); + // Value can be null while anchor labels are being swapped out + if (value !== null) { + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelAnchor(this._settings, monitorIndex, value); + }); + } + })); + + this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); + + //dynamic opacity + this._settings.bind('trans-use-custom-bg', + this._builder.get_object('trans_bg_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-bg', + this._builder.get_object('trans_bg_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('trans-bg-color')); + this._builder.get_object('trans_bg_color_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_bg_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-bg-color', hexString); + })); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_override_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('trans_opacity_override_switch').connect('notify::active', (widget) => { + if (!widget.get_active()) + this._builder.get_object('trans_dyn_switch').set_active(false); + }); + + this._builder.get_object('trans_opacity_spinbutton').set_value(this._settings.get_double('trans-panel-opacity') * 100); + this._builder.get_object('trans_opacity_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-panel-opacity', widget.get_value() * 0.01); + })); + + this._settings.bind('trans-use-dynamic-opacity', + this._builder.get_object('trans_dyn_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-dynamic-opacity', + this._builder.get_object('trans_dyn_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-dynamic-behavior', + this._builder.get_object('trans_options_window_type_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-gradient', + this._builder.get_object('trans_gradient_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-gradient', + this._builder.get_object('trans_gradient_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + rgba.parse(this._settings.get_string('trans-gradient-top-color')); + this._builder.get_object('trans_gradient_color1_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_gradient_color1_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-gradient-top-color', hexString); + })); + + this._builder.get_object('trans_gradient_color1_spinbutton').set_value(this._settings.get_double('trans-gradient-top-opacity') * 100); + this._builder.get_object('trans_gradient_color1_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-gradient-top-opacity', widget.get_value() * 0.01); + })); + + rgba.parse(this._settings.get_string('trans-gradient-bottom-color')); + this._builder.get_object('trans_gradient_color2_colorbutton').set_rgba(rgba); + + this._builder.get_object('trans_gradient_color2_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('trans-gradient-bottom-color', hexString); + })); + + this._builder.get_object('trans_gradient_color2_spinbutton').set_value(this._settings.get_double('trans-gradient-bottom-opacity') * 100); + this._builder.get_object('trans_gradient_color2_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-gradient-bottom-opacity', widget.get_value() * 0.01); + })); + + this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); + this._builder.get_object('trans_options_distance_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('trans-dynamic-distance', widget.get_value()); + })); + + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); + this._builder.get_object('trans_options_min_opacity_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-dynamic-anim-target', widget.get_value() * 0.01); + })); + + this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); + this._builder.get_object('trans_options_anim_time_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('trans-dynamic-anim-time', widget.get_value()); + })); + + this._builder.get_object('trans_dyn_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Dynamic opacity options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_dynamic_opacity_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('trans-dynamic-behavior', this._settings.get_default_value('trans-dynamic-behavior')); + + this._settings.set_value('trans-dynamic-distance', this._settings.get_default_value('trans-dynamic-distance')); + this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); + + this._settings.set_value('trans-dynamic-anim-target', this._settings.get_default_value('trans-dynamic-anim-target')); + this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); + + this._settings.set_value('trans-dynamic-anim-time', this._settings.get_default_value('trans-dynamic-anim-time')); + this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + this._settings.bind('desktop-line-use-custom-color', + this._builder.get_object('override_show_desktop_line_color_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('desktop-line-use-custom-color', + this._builder.get_object('override_show_desktop_line_color_colorbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + rgba.parse(this._settings.get_string('desktop-line-custom-color')); + this._builder.get_object('override_show_desktop_line_color_colorbutton').set_rgba(rgba); + this._builder.get_object('override_show_desktop_line_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + this._settings.set_string('desktop-line-custom-color', css); + })); + + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_window_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_behaviour_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-behaviour', + this._builder.get_object('intellihide_behaviour_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-use-pressure', + this._builder.get_object('intellihide_use_pressure_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-use-pressure', + this._builder.get_object('intellihide_use_pressure_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-show-in-fullscreen', + this._builder.get_object('intellihide_show_in_fullscreen_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-only-secondary', + this._builder.get_object('intellihide_only_secondary_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('multi-monitors', + this._builder.get_object('grid_intellihide_only_secondary'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('multimon_multi_switch').connect('notify::active', (widget) => { + if (!widget.get_active()) + this._builder.get_object('intellihide_only_secondary_switch').set_active(false); + }); + + this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); + this._builder.get_object('intellihide_pressure_threshold_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('intellihide-pressure-threshold', widget.get_value()); + })); + + this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); + this._builder.get_object('intellihide_pressure_time_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_int('intellihide-pressure-time', widget.get_value()); + })); + + this._settings.bind('intellihide-key-toggle-text', + this._builder.get_object('intellihide_toggle_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::intellihide-key-toggle-text', () => setShortcut(this._settings, 'intellihide-key-toggle')); + + this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); + this._builder.get_object('intellihide_animation_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-animation-time', widget.get_value()); + })); + + this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); + this._builder.get_object('intellihide_close_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-close-delay', widget.get_value()); + })); + + this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); + this._builder.get_object('intellihide_enable_start_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('intellihide-enable-start-delay', widget.get_value()); + })); + + this._builder.get_object('intellihide_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Intellihide options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_intellihide_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('intellihide-hide-from-windows', this._settings.get_default_value('intellihide-hide-from-windows')); + this._settings.set_value('intellihide-behaviour', this._settings.get_default_value('intellihide-behaviour')); + this._settings.set_value('intellihide-use-pressure', this._settings.get_default_value('intellihide-use-pressure')); + this._settings.set_value('intellihide-show-in-fullscreen', this._settings.get_default_value('intellihide-show-in-fullscreen')); + this._settings.set_value('intellihide-only-secondary', this._settings.get_default_value('intellihide-only-secondary')); + + this._settings.set_value('intellihide-pressure-threshold', this._settings.get_default_value('intellihide-pressure-threshold')); + this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); + + this._settings.set_value('intellihide-pressure-time', this._settings.get_default_value('intellihide-pressure-time')); + this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); + + this._settings.set_value('intellihide-key-toggle-text', this._settings.get_default_value('intellihide-key-toggle-text')); + + this._settings.set_value('intellihide-animation-time', this._settings.get_default_value('intellihide-animation-time')); + this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); + + this._settings.set_value('intellihide-close-delay', this._settings.get_default_value('intellihide-close-delay')); + this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); + + this._settings.set_value('intellihide-enable-start-delay', this._settings.get_default_value('intellihide-enable-start-delay')); + this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(1, 1); + + })); + + // Behavior panel + + this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); + this._builder.get_object('show_applications_side_padding_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-apps-icon-side-padding', widget.get_value()); + })); + + this._settings.bind('show-apps-override-escape', + this._builder.get_object('show_applications_esc_key_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-hover', + this._builder.get_object('show_showdesktop_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-hover', + this._builder.get_object('grid_show_showdesktop_hide_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-appmenu', + this._builder.get_object('show_appmenu_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-tooltip', + this._builder.get_object('show_tooltip_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('show_favorite_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites-all-monitors', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-running-apps', + this._builder.get_object('show_runnning_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._setPreviewTitlePosition(); + + this._builder.get_object('grid_preview_title_font_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('window-preview-title-font-color', hexString); + })); + + this._builder.get_object('show_window_previews_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Window preview options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let scrolledWindow = this._builder.get_object('box_window_preview_options'); + + dialog.get_content_area().append(scrolledWindow); + + this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); + this._builder.get_object('preview_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('show-window-previews-timeout', widget.get_value()); + })); + + this._settings.bind('preview-middle-click-close', + this._builder.get_object('preview_middle_click_close_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-fixed-x', + this._builder.get_object('preview_aspect_ratio_x_fixed_togglebutton'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-fixed-y', + this._builder.get_object('preview_aspect_ratio_y_fixed_togglebutton'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('preview-use-custom-opacity', + this._builder.get_object('preview_custom_opacity_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('preview-use-custom-opacity', + this._builder.get_object('preview_custom_opacity_spinbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-use-custom-icon-size', + this._builder.get_object('preview_custom_icon_size_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-use-custom-icon-size', + this._builder.get_object('preview_custom_icon_size_spinbutton'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); + this._builder.get_object('preview_custom_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('preview-custom-opacity', widget.get_value()); + })); + + this._settings.bind('peek-mode', + this._builder.get_object('peek_mode_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('peek-mode', + this._builder.get_object('grid_enter_peek_mode_timeout'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('peek-mode', + this._builder.get_object('grid_peek_mode_opacity'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('window-preview-show-title', + this._builder.get_object('preview_show_title_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_custom_icon_size'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_size'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_weight'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('window-preview-show-title', + this._builder.get_object('grid_preview_title_font_color'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); + this._builder.get_object('enter_peek_mode_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('enter-peek-mode-timeout', widget.get_value()); + })); + + this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); + this._builder.get_object('leave_timeout_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('leave-timeout', widget.get_value()); + })); + + this._settings.bind('window-preview-hide-immediate-click', + this._builder.get_object('preview_immediate_click_button'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); + this._builder.get_object('animation_time_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-animation-time', widget.get_value()); + })); + + this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); + this._builder.get_object('peek_mode_opacity_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('peek-mode-opacity', widget.get_value()); + })); + + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-size', widget.get_value()); + })); + + this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); + this._builder.get_object('preview_aspect_ratio_x_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-aspect-ratio-x', parseInt(widget.get_active_id(), 10)); + })); + + this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); + this._builder.get_object('preview_aspect_ratio_y_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-aspect-ratio-y', parseInt(widget.get_active_id(), 10)); + })); + + this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); + this._builder.get_object('preview_padding_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-padding', widget.get_value()); + })); + + this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); + this._builder.get_object('preview_title_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-title-font-size', widget.get_value()); + })); + + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); + this._builder.get_object('preview_custom_icon_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-custom-icon-size', widget.get_value()); + })); + + this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); + this._builder.get_object('grid_preview_title_weight_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('window-preview-title-font-weight', widget.get_active_id()); + })); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('window-preview-title-font-color')); + this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); + }).apply(this); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-window-previews-timeout', this._settings.get_default_value('show-window-previews-timeout')); + this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); + + this._settings.set_value('leave-timeout', this._settings.get_default_value('leave-timeout')); + this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); + + this._settings.set_value('window-preview-hide-immediate-click', this._settings.get_default_value('window-preview-hide-immediate-click')); + + this._settings.set_value('window-preview-animation-time', this._settings.get_default_value('window-preview-animation-time')); + this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); + + this._settings.set_value('preview-use-custom-opacity', this._settings.get_default_value('preview-use-custom-opacity')); + + this._settings.set_value('window-preview-use-custom-icon-size', this._settings.get_default_value('window-preview-use-custom-icon-size')); + + this._settings.set_value('preview-custom-opacity', this._settings.get_default_value('preview-custom-opacity')); + this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); + + this._settings.set_value('window-preview-title-position', this._settings.get_default_value('window-preview-title-position')); + this._setPreviewTitlePosition(); + + this._settings.set_value('peek-mode', this._settings.get_default_value('peek-mode')); + this._settings.set_value('window-preview-show-title', this._settings.get_default_value('window-preview-show-title')); + this._settings.set_value('enter-peek-mode-timeout', this._settings.get_default_value('enter-peek-mode-timeout')); + this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); + this._settings.set_value('peek-mode-opacity', this._settings.get_default_value('peek-mode-opacity')); + this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); + + this._settings.set_value('window-preview-size', this._settings.get_default_value('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + + this._settings.set_value('window-preview-fixed-x', this._settings.get_default_value('window-preview-fixed-x')); + this._settings.set_value('window-preview-fixed-y', this._settings.get_default_value('window-preview-fixed-y')); + + this._settings.set_value('window-preview-aspect-ratio-x', this._settings.get_default_value('window-preview-aspect-ratio-x')); + this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); + + this._settings.set_value('window-preview-aspect-ratio-y', this._settings.get_default_value('window-preview-aspect-ratio-y')); + this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); + + this._settings.set_value('window-preview-padding', this._settings.get_default_value('window-preview-padding')); + this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); + + this._settings.set_value('preview-middle-click-close', this._settings.get_default_value('preview-middle-click-close')); + + this._settings.set_value('window-preview-title-font-size', this._settings.get_default_value('window-preview-title-font-size')); + this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); + + this._settings.set_value('window-preview-custom-icon-size', this._settings.get_default_value('window-preview-custom-icon-size')); + this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); + + this._settings.set_value('window-preview-title-font-weight', this._settings.get_default_value('window-preview-title-font-weight')); + this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); + + this._settings.set_value('window-preview-title-font-color', this._settings.get_default_value('window-preview-title-font-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('window-preview-title-font-color')); + this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(scrolledWindow); + dialog.destroy(); + } + return; + })); + + dialog.show(); + + })); + + this._settings.bind('isolate-workspaces', + this._builder.get_object('isolate_workspaces_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('isolate-monitors', + this._builder.get_object('multimon_multi_isolate_monitor_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('overview-click-to-exit', + this._builder.get_object('clicktoexit_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('hide-overview-on-startup', + this._builder.get_object('hide_overview_on_startup_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps', + this._builder.get_object('group_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('group-apps', + this._builder.get_object('show_group_apps_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._builder.get_object('group_apps_label_font_color_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('group-apps-label-font-color', hexString); + })); + + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').connect('color-set', Lang.bind(this, function (button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('group-apps-label-font-color-minimized', hexString); + })); + + this._settings.bind('group-apps-use-fixed-width', + this._builder.get_object('group_apps_use_fixed_width_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps-underline-unfocused', + this._builder.get_object('group_apps_underline_unfocused_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps-use-launchers', + this._builder.get_object('group_apps_use_launchers_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('show_group_apps_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Ungrouped application options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_group_apps_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); + this._builder.get_object('group_apps_label_font_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('group-apps-label-font-size', widget.get_value()); + })); + + this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); + this._builder.get_object('group_apps_label_font_weight_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('group-apps-label-font-weight', widget.get_active_id()); + })); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color')); + this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); + }).apply(this); + + (function() { + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color-minimized')); + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(rgba); + }).apply(this); + + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('group-apps-label-max-width', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('group-apps-label-font-size', this._settings.get_default_value('group-apps-label-font-size')); + this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); + + this._settings.set_value('group-apps-label-font-weight', this._settings.get_default_value('group-apps-label-font-weight')); + this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); + + this._settings.set_value('group-apps-label-font-color', this._settings.get_default_value('group-apps-label-font-color')); + let rgba = new Gdk.RGBA(); + rgba.parse(this._settings.get_string('group-apps-label-font-color')); + this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); + + this._settings.set_value('group-apps-label-font-color-minimized', this._settings.get_default_value('group-apps-label-font-color-minimized')); + let minimizedFontColor = new Gdk.RGBA(); + minimizedFontColor.parse(this._settings.get_string('group-apps-label-font-color-minimized')); + this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(minimizedFontColor); + + this._settings.set_value('group-apps-label-max-width', this._settings.get_default_value('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + + this._settings.set_value('group-apps-use-fixed-width', this._settings.get_default_value('group-apps-use-fixed-width')); + this._settings.set_value('group-apps-underline-unfocused', this._settings.get_default_value('group-apps-underline-unfocused')); + this._settings.set_value('group-apps-use-launchers', this._settings.get_default_value('group-apps-use-launchers')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(600, 1); + + })); + + this._builder.get_object('click_action_combo').set_active_id(this._settings.get_string('click-action')); + this._builder.get_object('click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('click-action', widget.get_active_id()); + })); + + this._builder.get_object('shift_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-click-action', widget.get_active_id()); + })); + + this._builder.get_object('middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('middle-click-action', widget.get_active_id()); + })); + this._builder.get_object('shift_middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-middle-click-action', widget.get_active_id()); + })); + + // Create dialog for middle-click options + this._builder.get_object('middle_click_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Customize middle-click behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_middle_click_options'); + dialog.get_content_area().append(box); + + this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); + + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); + + this._settings.bind('shift-click-action', + this._builder.get_object('shift_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('middle-click-action', + this._builder.get_object('middle_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('shift-middle-click-action', + this._builder.get_object('shift_middle_click_action_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings for the relevant keys + let keys = ['shift-click-action', 'middle-click-action', 'shift-middle-click-action']; + keys.forEach(function(val) { + this._settings.set_value(val, this._settings.get_default_value(val)); + }, this); + this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(700, 1); + + })); + + this._builder.get_object('scroll_panel_combo').set_active_id(this._settings.get_string('scroll-panel-action')); + this._builder.get_object('scroll_panel_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('scroll-panel-action', widget.get_active_id()); + })); + + this._builder.get_object('scroll_icon_combo').set_active_id(this._settings.get_string('scroll-icon-action')); + this._builder.get_object('scroll_icon_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('scroll-icon-action', widget.get_active_id()); + })); + + // Create dialog for panel scroll options + this._builder.get_object('scroll_panel_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Customize panel scroll behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('scroll_panel_options_box'); + dialog.get_content_area().append(box); + + this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); + this._builder.get_object('scroll_panel_options_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('scroll-panel-delay', widget.get_value()); + })); + + this._settings.bind('scroll-panel-show-ws-popup', + this._builder.get_object('scroll_panel_options_show_ws_popup_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('scroll-panel-delay', this._settings.get_default_value('scroll-panel-delay')); + this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); + + this._settings.set_value('scroll-panel-show-ws-popup', this._settings.get_default_value('scroll-panel-show-ws-popup')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(640, 1); + + })); + + // Create dialog for icon scroll options + this._builder.get_object('scroll_icon_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Customize icon scroll behavior'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('scroll_icon_options_box'); + dialog.get_content_area().append(box); + + this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); + this._builder.get_object('scroll_icon_options_delay_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('scroll-icon-delay', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('scroll-icon-delay', this._settings.get_default_value('scroll-icon-delay')); + this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(640, 1); + + })); + + this._settings.bind('hot-keys', + this._builder.get_object('hot_keys_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('hot-keys', + this._builder.get_object('overlay_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('overlay_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('hotkeys-overlay-combo', widget.get_active_id()); + })); + + this._settings.bind('shortcut-previews', + this._builder.get_object('shortcut_preview_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('shortcut_num_keys_combo').set_active_id(this._settings.get_string('shortcut-num-keys')); + this._builder.get_object('shortcut_num_keys_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shortcut-num-keys', widget.get_active_id()); + })); + + this._settings.connect('changed::hotkey-prefix-text', Lang.bind(this, function() {checkHotkeyPrefix(this._settings);})); + + this._builder.get_object('hotkey_prefix_combo').set_active_id(this._settings.get_string('hotkey-prefix-text')); + + this._settings.bind('hotkey-prefix-text', + this._builder.get_object('hotkey_prefix_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('overlay_combo').set_active_id(this._settings.get_string('hotkeys-overlay-combo')); + + this._settings.bind('hotkeys-overlay-combo', + this._builder.get_object('overlay_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('overlay-timeout', + this._builder.get_object('timeout_spinbutton'), + 'value', + Gio.SettingsBindFlags.DEFAULT); + if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') { + this._builder.get_object('timeout_spinbutton').set_sensitive(false); + } + + this._settings.connect('changed::hotkeys-overlay-combo', Lang.bind(this, function() { + if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') + this._builder.get_object('timeout_spinbutton').set_sensitive(false); + else + this._builder.get_object('timeout_spinbutton').set_sensitive(true); + })); + + this._settings.bind('shortcut-text', + this._builder.get_object('shortcut_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::shortcut-text', Lang.bind(this, function() {setShortcut(this._settings, 'shortcut');})); + + // Create dialog for number overlay options + this._builder.get_object('overlay_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Advanced hotkeys options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_overlay_shortcut'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings for the relevant keys + let keys = ['hotkey-prefix-text', 'shortcut-text', 'hotkeys-overlay-combo', 'overlay-timeout', 'shortcut-previews']; + keys.forEach(function(val) { + this._settings.set_value(val, this._settings.get_default_value(val)); + }, this); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(600, 1); + + })); + + // setup dialog for secondary menu options + this._builder.get_object('secondarymenu_options_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Secondary Menu Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_secondarymenu_options'); + dialog.get_content_area().append(box); + + this._settings.bind('secondarymenu-contains-appmenu', + this._builder.get_object('secondarymenu_appmenu_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('secondarymenu-contains-showdetails', + this._builder.get_object('secondarymenu_showdetails_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('secondarymenu-contains-appmenu', this._settings.get_default_value('secondarymenu-contains-appmenu')); + this._settings.set_value('secondarymenu-contains-showdetails', this._settings.get_default_value('secondarymenu-contains-showdetails')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(480, 1); + + })); + + // setup dialog for advanced options + this._builder.get_object('button_advanced_options').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Advanced Options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('box_advanced_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + dialog.set_default_size(480, 1); + + })); + + // Fine-tune panel + + let sizeScales = [ + {objectName: 'tray_size_scale', valueName: 'tray-size', range: DEFAULT_FONT_SIZES }, + {objectName: 'leftbox_size_scale', valueName: 'leftbox-size', range: DEFAULT_FONT_SIZES }, + {objectName: 'appicon_margin_scale', valueName: 'appicon-margin', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'appicon_padding_scale', valueName: 'appicon-padding', range: DEFAULT_MARGIN_SIZES }, + {objectName: 'tray_padding_scale', valueName: 'tray-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'leftbox_padding_scale', valueName: 'leftbox-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'statusicon_padding_scale', valueName: 'status-icon-padding', range: DEFAULT_PADDING_SIZES }, + {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS } + ]; + + for(var idx in sizeScales) { + let size_scale = this._builder.get_object(sizeScales[idx].objectName); + let range = sizeScales[idx].range; + size_scale.set_range(range[range.length - 1], range[0]); + let value; + if (sizeScales[idx].objectName === 'panel_length_scale') { + value = PanelSettings.getPanelLength(this._settings, this._currentMonitorIndex); + } else { + value = this._settings.get_int(sizeScales[idx].valueName); + } + size_scale.set_value(value); + // Add marks from range arrays, omitting the first and last values. + range.slice(1, -1).forEach(function(val) { + size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); + }); + + // Corrent for rtl languages + if (this._rtl) { + // Flip value position: this is not done automatically + size_scale.set_value_pos(Gtk.PositionType.LEFT); + // I suppose due to a bug, having a more than one mark and one above a value of 100 + // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable + // and then manually inverting it + size_scale.set_flippable(false); + size_scale.set_inverted(true); + } + } + + this._settings.bind('animate-app-switch', + this._builder.get_object('animate_app_switch_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-window-launch', + this._builder.get_object('animate_window_launch_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-appicon-hover', + this._builder.get_object('animate_appicon_hover_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('animate-appicon-hover', + this._builder.get_object('animate_appicon_hover_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + { + this._settings.bind('animate-appicon-hover-animation-type', + this._builder.get_object('animate_appicon_hover_options_type_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + let scales = [ + ['animate_appicon_hover_options_duration_scale', 'animate-appicon-hover-animation-duration', 1], + ['animate_appicon_hover_options_rotation_scale', 'animate-appicon-hover-animation-rotation', 1], + ['animate_appicon_hover_options_travel_scale', 'animate-appicon-hover-animation-travel', 100], + ['animate_appicon_hover_options_zoom_scale', 'animate-appicon-hover-animation-zoom', 100], + ['animate_appicon_hover_options_convexity_scale', 'animate-appicon-hover-animation-convexity', 1], + ['animate_appicon_hover_options_extent_scale', 'animate-appicon-hover-animation-extent', 1], + ]; + + let updateScale = scale => { + let [id, key, factor] = scale; + let type = this._settings.get_string('animate-appicon-hover-animation-type'); + let value = this._settings.get_value(key).deep_unpack()[type]; + let defaultValue = this._settings.get_default_value(key).deep_unpack()[type]; + this._builder.get_object(id).sensitive = defaultValue !== undefined; + this._builder.get_object(id).set_value(value * factor || 0); + this._builder.get_object(id).clear_marks(); + this._builder.get_object(id).add_mark(defaultValue * factor, Gtk.PositionType.TOP, + defaultValue !== undefined ? (defaultValue * factor).toString() : ' '); + }; + + scales.forEach(scale => { + let [id, key, factor] = scale; + this._settings.connect('changed::' + key, () => updateScale(scale)); + this._builder.get_object(id).connect('value-changed', widget => { + let type = this._settings.get_string('animate-appicon-hover-animation-type'); + let variant = this._settings.get_value(key); + let unpacked = variant.deep_unpack(); + if (unpacked[type] != widget.get_value() / factor) { + unpacked[type] = widget.get_value() / factor; + this._settings.set_value(key, new GLib.Variant(variant.get_type_string(), unpacked)); + } + }); + }); + + this._settings.connect('changed::animate-appicon-hover-animation-type', () => scales.forEach(updateScale)); + scales.forEach(updateScale); + } + + this._builder.get_object('animate_appicon_hover_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('App icon animation options'), + transient_for: this.notebook.get_root(), + use_header_bar: true, + modal: true }); + + // GTK+ leaves positive values for application-defined response ids. + // Use +1 for the reset action + dialog.add_button(_('Reset to defaults'), 1); + + let box = this._builder.get_object('animate_appicon_hover_options'); + dialog.get_content_area().append(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('animate-appicon-hover-animation-type', this._settings.get_default_value('animate-appicon-hover-animation-type')); + this._settings.set_value('animate-appicon-hover-animation-duration', this._settings.get_default_value('animate-appicon-hover-animation-duration')); + this._settings.set_value('animate-appicon-hover-animation-rotation', this._settings.get_default_value('animate-appicon-hover-animation-rotation')); + this._settings.set_value('animate-appicon-hover-animation-travel', this._settings.get_default_value('animate-appicon-hover-animation-travel')); + this._settings.set_value('animate-appicon-hover-animation-zoom', this._settings.get_default_value('animate-appicon-hover-animation-zoom')); + this._settings.set_value('animate-appicon-hover-animation-convexity', this._settings.get_default_value('animate-appicon-hover-animation-convexity')); + this._settings.set_value('animate-appicon-hover-animation-extent', this._settings.get_default_value('animate-appicon-hover-animation-extent')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show(); + + })); + + this._settings.bind('stockgs-keep-dash', + this._builder.get_object('stockgs_dash_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('stockgs-keep-top-panel', + this._builder.get_object('stockgs_top_panel_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + + + this._settings.connect('changed::stockgs-keep-top-panel', () => this._maybeDisableTopPosition()); + + this._maybeDisableTopPosition(); + + this._settings.bind('stockgs-panelbtn-click-only', + this._builder.get_object('stockgs_panelbtn_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('stockgs-force-hotcorner', + this._builder.get_object('stockgs_hotcorner_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + // About Panel + + this._builder.get_object('extension_version').set_label(Me.metadata.version.toString() + (Me.metadata.commit ? ' (' + Me.metadata.commit + ')' : '')); + + this._builder.get_object('importexport_export_button').connect('clicked', widget => { + this._showFileChooser( + _('Export settings'), + { action: Gtk.FileChooserAction.SAVE }, + "Save", + filename => { + let file = Gio.file_new_for_path(filename); + let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let out = Gio.BufferedOutputStream.new_sized(raw, 4096); + + out.write_all(GLib.spawn_command_line_sync('dconf dump ' + SCHEMA_PATH)[1], null); + out.close(null); + } + ); + }); + + this._builder.get_object('importexport_import_button').connect('clicked', widget => { + this._showFileChooser( + _('Import settings'), + { action: Gtk.FileChooserAction.OPEN }, + "Open", + filename => { + if (filename && GLib.file_test(filename, GLib.FileTest.EXISTS)) { + let settingsFile = Gio.File.new_for_path(filename); + let [ , pid, stdin, stdout, stderr] = + GLib.spawn_async_with_pipes( + null, + ['dconf', 'load', SCHEMA_PATH], + null, + GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null + ); + + stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); + GLib.close(stdout); + GLib.close(stderr); + + let [ , , , retCode] = GLib.spawn_command_line_sync(GSET + ' -d ' + Me.uuid); + if (retCode == 0) { + GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, () => GLib.spawn_command_line_sync(GSET + ' -e ' + Me.uuid)); + } + + stdin.splice(settingsFile.read(null), Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, null); + } + } + ); + }); + + }, + + _setPreviewTitlePosition: function() { + switch (this._settings.get_string('window-preview-title-position')) { + case 'BOTTOM': + this._builder.get_object('preview_title_position_bottom_button').set_active(true); + break; + case 'TOP': + this._builder.get_object('preview_title_position_top_button').set_active(true); + break; + } + }, + + _showFileChooser: function(title, params, acceptBtn, acceptHandler) { + let dialog = new Gtk.FileChooserDialog(mergeObjects({ title: title, transient_for: this.notebook.get_root() }, params)); + + dialog.add_button("Cancel", Gtk.ResponseType.CANCEL); + dialog.add_button(acceptBtn, Gtk.ResponseType.ACCEPT); + + dialog.show(); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + acceptHandler.call(this, dialog.get_file().get_path()); + dialog.destroy(); + })); + } +}); + + +const BuilderScope = GObject.registerClass({ + Implements: [Gtk.BuilderScope], +}, class BuilderScope extends GObject.Object { + + _init(preferences) { + this._preferences = preferences; + super._init(); + } + + vfunc_create_closure(builder, handlerName, flags, connectObject) { + if (flags & Gtk.BuilderClosureFlags.SWAPPED) + throw new Error('Unsupported template signal flag "swapped"'); + + if (typeof this[handlerName] === 'undefined') + throw new Error(`${handlerName} is undefined`); + + return this[handlerName].bind(connectObject || this); + } + + on_btn_click(connectObject) { + connectObject.set_label("Clicked"); + } + + position_bottom_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.BOTTOM); + } + + position_top_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.TOP); + } + + position_left_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.LEFT); + } + + position_right_button_clicked_cb(button) { + if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.RIGHT); + } + + dots_bottom_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "BOTTOM"); + } + + dots_top_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "TOP"); + } + + dots_left_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "LEFT"); + } + + dots_right_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('dot-position', "RIGHT"); + } + + preview_title_position_bottom_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('window-preview-title-position', 'BOTTOM'); + } + + preview_title_position_top_button_toggled_cb(button) { + if (button.get_active()) + this._preferences._settings.set_string('window-preview-title-position', 'TOP'); + } + + panel_size_scale_value_changed_cb(scale) { + // Avoid settings the size continuously + if (this._preferences._panel_size_timeout > 0) + Mainloop.source_remove(this._preferences._panel_size_timeout); + + this._preferences._panel_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this._preferences, function() { + const value = scale.get_value(); + const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; + monitorsToSetFor.forEach(monitorIndex => { + PanelSettings.setPanelSize(this._settings, monitorIndex, value); + }); + + this._panel_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + tray_size_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._tray_size_timeout > 0) + Mainloop.source_remove(this._preferences._tray_size_timeout); + + this._preferences._tray_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('tray-size', scale.get_value()); + this._preferences._tray_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + leftbox_size_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._leftbox_size_timeout > 0) + Mainloop.source_remove(this._preferences._leftbox_size_timeout); + + this._preferences._leftbox_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('leftbox-size', scale.get_value()); + this._preferences._leftbox_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + appicon_margin_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_margin_timeout > 0) + Mainloop.source_remove(this._preferences._appicon_margin_timeout); + + this._preferences._appicon_margin_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('appicon-margin', scale.get_value()); + this._preferences._appicon_margin_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + appicon_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._appicon_padding_timeout > 0) + Mainloop.source_remove(this._preferences._appicon_padding_timeout); + + this._preferences._appicon_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('appicon-padding', scale.get_value()); + this._preferences._appicon_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + tray_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._tray_padding_timeout > 0) + Mainloop.source_remove(this._preferences._tray_padding_timeout); + + this._preferences._tray_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('tray-padding', scale.get_value()); + this._preferences._tray_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + statusicon_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._statusicon_padding_timeout > 0) + Mainloop.source_remove(this._preferences._statusicon_padding_timeout); + + this._preferences._statusicon_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('status-icon-padding', scale.get_value()); + this._preferences._statusicon_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + + leftbox_padding_scale_value_changed_cb(scale) { + // Avoid settings the size consinuosly + if (this._preferences._leftbox_padding_timeout > 0) + Mainloop.source_remove(this._preferences._leftbox_padding_timeout); + + this._preferences._leftbox_padding_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._preferences._settings.set_int('leftbox-padding', scale.get_value()); + this._preferences._leftbox_padding_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } +}); + +function init() { + Convenience.initTranslations(); +} + +function buildPrefsWidget() { + Gtk.Window.list_toplevels()[0].set_default_size(680, 740); + + let preferences = new Preferences(); + + return preferences.notebook; +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js new file mode 100644 index 0000000..1e84e82 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/progress.js @@ -0,0 +1,598 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gio = imports.gi.Gio; +const Cairo = imports.cairo; +const Clutter = imports.gi.Clutter; +const Pango = imports.gi.Pango; +const St = imports.gi.St; +const Signals = imports.signals; +const Utils = Me.imports.utils; + + +var ProgressManager = Utils.defineClass({ + Name: 'DashToPanel.ProgressManager', + + _init: function() { + + this._entriesByDBusName = {}; + + this._launcher_entry_dbus_signal_id = + Gio.DBus.session.signal_subscribe(null, // sender + 'com.canonical.Unity.LauncherEntry', // iface + null, // member + null, // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onEntrySignalReceived.bind(this)); + + this._dbus_name_owner_changed_signal_id = + Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender + 'org.freedesktop.DBus', // interface + 'NameOwnerChanged', // member + '/org/freedesktop/DBus', // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onDBusNameOwnerChanged.bind(this)); + + this._acquireUnityDBus(); + }, + + destroy: function() { + if (this._launcher_entry_dbus_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id); + } + + if (this._dbus_name_owner_changed_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id); + } + + this._releaseUnityDBus(); + }, + + size: function() { + return Object.keys(this._entriesByDBusName).length; + }, + + lookupByDBusName: function(dbusName) { + return this._entriesByDBusName.hasOwnProperty(dbusName) ? this._entriesByDBusName[dbusName] : null; + }, + + lookupById: function(appId) { + let ret = []; + for (let dbusName in this._entriesByDBusName) { + let entry = this._entriesByDBusName[dbusName]; + if (entry && entry.appId() == appId) { + ret.push(entry); + } + } + + return ret; + }, + + addEntry: function(entry) { + let existingEntry = this.lookupByDBusName(entry.dbusName()); + if (existingEntry) { + existingEntry.update(entry); + } else { + this._entriesByDBusName[entry.dbusName()] = entry; + this.emit('progress-entry-added', entry); + } + }, + + removeEntry: function(entry) { + delete this._entriesByDBusName[entry.dbusName()] + this.emit('progress-entry-removed', entry); + }, + + _acquireUnityDBus: function() { + if (!this._unity_bus_id) { + Gio.DBus.session.own_name('com.canonical.Unity', + Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null); + } + }, + + _releaseUnityDBus: function() { + if (this._unity_bus_id) { + Gio.DBus.session.unown_name(this._unity_bus_id); + this._unity_bus_id = 0; + } + }, + + _onEntrySignalReceived: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !signal_name) + return; + + if (signal_name == 'Update') { + if (!sender_name) { + return; + } + + this._handleUpdateRequest(sender_name, parameters); + } + }, + + _onDBusNameOwnerChanged: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !this.size()) + return; + + let [name, before, after] = parameters.deep_unpack(); + + if (!after) { + if (this._entriesByDBusName.hasOwnProperty(before)) { + this.removeEntry(this._entriesByDBusName[before]); + } + } + }, + + _handleUpdateRequest: function(senderName, parameters) { + if (!senderName || !parameters) { + return; + } + + let [appUri, properties] = parameters.deep_unpack(); + let appId = appUri.replace(/(^\w+:|^)\/\//, ''); + let entry = this.lookupByDBusName(senderName); + + if (entry) { + entry.setDBusName(senderName); + entry.update(properties); + } else { + let entry = new AppProgress(senderName, appId, properties); + this.addEntry(entry); + } + } +}); +Signals.addSignalMethods(ProgressManager.prototype); + +var AppProgress = Utils.defineClass({ + Name: 'DashToPanel.AppProgress', + + _init: function(dbusName, appId, properties) { + this._dbusName = dbusName; + this._appId = appId; + this._count = 0; + this._countVisible = false; + this._progress = 0.0; + this._progressVisible = false; + this._urgent = false; + this.update(properties); + }, + + appId: function() { + return this._appId; + }, + + dbusName: function() { + return this._dbusName; + }, + + count: function() { + return this._count; + }, + + setCount: function(count) { + if (this._count != count) { + this._count = count; + this.emit('count-changed', this._count); + } + }, + + countVisible: function() { + return this._countVisible; + }, + + setCountVisible: function(countVisible) { + if (this._countVisible != countVisible) { + this._countVisible = countVisible; + this.emit('count-visible-changed', this._countVisible); + } + }, + + progress: function() { + return this._progress; + }, + + setProgress: function(progress) { + if (this._progress != progress) { + this._progress = progress; + this.emit('progress-changed', this._progress); + } + }, + + progressVisible: function() { + return this._progressVisible; + }, + + setProgressVisible: function(progressVisible) { + if (this._progressVisible != progressVisible) { + this._progressVisible = progressVisible; + this.emit('progress-visible-changed', this._progressVisible); + } + }, + + urgent: function() { + return this._urgent; + }, + + setUrgent: function(urgent) { + if (this._urgent != urgent) { + this._urgent = urgent; + this.emit('urgent-changed', this._urgent); + } + }, + + setDBusName: function(dbusName) { + if (this._dbusName != dbusName) { + let oldName = this._dbusName; + this._dbusName = dbusName; + this.emit('dbus-name-changed', oldName); + } + }, + + update: function(other) { + if (other instanceof AppProgress) { + this.setDBusName(other.dbusName()) + this.setCount(other.count()); + this.setCountVisible(other.countVisible()); + this.setProgress(other.progress()); + this.setProgressVisible(other.progressVisible()) + this.setUrgent(other.urgent()); + } else { + for (let property in other) { + if (other.hasOwnProperty(property)) { + if (property == 'count') { + this.setCount(other[property].get_int64()); + } else if (property == 'count-visible') { + this.setCountVisible(Me.settings.get_boolean('progress-show-count') && other[property].get_boolean()); + } else if (property == 'progress') { + this.setProgress(other[property].get_double()); + } else if (property == 'progress-visible') { + this.setProgressVisible(Me.settings.get_boolean('progress-show-bar') && other[property].get_boolean()); + } else if (property == 'urgent') { + this.setUrgent(other[property].get_boolean()); + } else { + // Not implemented yet + } + } + } + } + } +}); +Signals.addSignalMethods(AppProgress.prototype); + + +var ProgressIndicator = Utils.defineClass({ + Name: 'DashToPanel.ProgressIndicator', + + _init: function(source, progressManager) { + this._source = source; + this._progressManager = progressManager; + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._sourceDestroyId = this._source.actor.connect('destroy', () => { + this._signalsHandler.destroy(); + }); + + this._notificationBadgeLabel = new St.Label({ style_class: 'badge' }); + this._notificationBadgeBin = new St.Bin({ + child: this._notificationBadgeLabel, y: 2, x: 2 + }); + this._notificationBadgeLabel.add_style_class_name('notification-badge'); + this._notificationBadgeCount = 0; + this._notificationBadgeBin.hide(); + + this._source._dtpIconContainer.add_child(this._notificationBadgeBin); + this._source._dtpIconContainer.connect('notify::allocation', this.updateNotificationBadge.bind(this)); + + this._progressManagerEntries = []; + this._progressManager.lookupById(this._source.app.id).forEach( + (entry) => { + this.insertEntry(entry); + } + ); + + this._signalsHandler.add([ + this._progressManager, + 'progress-entry-added', + this._onEntryAdded.bind(this) + ], [ + this._progressManager, + 'progress-entry-removed', + this._onEntryRemoved.bind(this) + ]); + }, + + destroy: function() { + this._source.actor.disconnect(this._sourceDestroyId); + this._signalsHandler.destroy(); + }, + + _onEntryAdded: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.insertEntry(entry); + } + }, + + _onEntryRemoved: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.removeEntry(entry); + } + }, + + updateNotificationBadge: function() { + this._source.updateNumberOverlay(this._notificationBadgeBin); + this._notificationBadgeLabel.clutter_text.ellipsize = Pango.EllipsizeMode.MIDDLE; + }, + + _notificationBadgeCountToText: function(count) { + if (count <= 9999) { + return count.toString(); + } else if (count < 1e5) { + let thousands = count / 1e3; + return thousands.toFixed(1).toString() + "k"; + } else if (count < 1e6) { + let thousands = count / 1e3; + return thousands.toFixed(0).toString() + "k"; + } else if (count < 1e8) { + let millions = count / 1e6; + return millions.toFixed(1).toString() + "M"; + } else if (count < 1e9) { + let millions = count / 1e6; + return millions.toFixed(0).toString() + "M"; + } else { + let billions = count / 1e9; + return billions.toFixed(1).toString() + "B"; + } + }, + + setNotificationBadge: function(count) { + this._notificationBadgeCount = count; + let text = this._notificationBadgeCountToText(count); + this._notificationBadgeLabel.set_text(text); + }, + + toggleNotificationBadge: function(activate) { + if (activate && this._notificationBadgeCount > 0) { + this.updateNotificationBadge(); + this._notificationBadgeBin.show(); + } + else + this._notificationBadgeBin.hide(); + }, + + _showProgressOverlay: function() { + if (this._progressOverlayArea) { + this._updateProgressOverlay(); + return; + } + + this._progressOverlayArea = new St.DrawingArea({x_expand: true, y_expand: true}); + this._progressOverlayArea.add_style_class_name('progress-bar'); + this._progressOverlayArea.connect('repaint', () => { + this._drawProgressOverlay(this._progressOverlayArea); + }); + + this._source._iconContainer.add_child(this._progressOverlayArea); + let node = this._progressOverlayArea.get_theme_node(); + + let [hasColor, color] = node.lookup_color('-progress-bar-background', false); + if (hasColor) + this._progressbar_background = color + else + this._progressbar_background = new Clutter.Color({red: 204, green: 204, blue: 204, alpha: 255}); + + [hasColor, color] = node.lookup_color('-progress-bar-border', false); + if (hasColor) + this._progressbar_border = color; + else + this._progressbar_border = new Clutter.Color({red: 230, green: 230, blue: 230, alpha: 255}); + + this._updateProgressOverlay(); + }, + + _hideProgressOverlay: function() { + if (this._progressOverlayArea) + this._progressOverlayArea.destroy(); + + this._progressOverlayArea = null; + this._progressbar_background = null; + this._progressbar_border = null; + }, + + _updateProgressOverlay: function() { + + if (this._progressOverlayArea) { + this._progressOverlayArea.queue_repaint(); + } + }, + + _drawProgressOverlay: function(area) { + let scaleFactor = Utils.getScaleFactor(); + let [surfaceWidth, surfaceHeight] = area.get_surface_size(); + let cr = area.get_context(); + + let iconSize = this._source.icon.iconSize * scaleFactor; + + let x = Math.floor((surfaceWidth - iconSize) / 2); + let y = Math.floor((surfaceHeight - iconSize) / 2); + + let lineWidth = Math.floor(1.0 * scaleFactor); + let padding = Math.floor(iconSize * 0.05); + let width = iconSize - 2.0*padding; + let height = Math.floor(Math.min(18.0*scaleFactor, 0.20*iconSize)); + x += padding; + y += iconSize - height - padding; + + cr.setLineWidth(lineWidth); + + // Draw the outer stroke + let stroke = new Cairo.LinearGradient(0, y, 0, y + height); + let fill = null; + stroke.addColorStopRGBA(0.5, 0.5, 0.5, 0.5, 0.1); + stroke.addColorStopRGBA(0.9, 0.8, 0.8, 0.8, 0.4); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the background + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + stroke = Cairo.SolidPattern.createRGBA(0.20, 0.20, 0.20, 0.9); + fill = new Cairo.LinearGradient(0, y, 0, y + height); + fill.addColorStopRGBA(0.4, 0.25, 0.25, 0.25, 1.0); + fill.addColorStopRGBA(0.9, 0.35, 0.35, 0.35, 1.0); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the finished bar + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + let finishedWidth = Math.ceil(this._progress * width); + + let bg = this._progressbar_background; + let bd = this._progressbar_border; + + stroke = Cairo.SolidPattern.createRGBA(bd.red/255, bd.green/255, bd.blue/255, bd.alpha/255); + fill = Cairo.SolidPattern.createRGBA(bg.red/255, bg.green/255, bg.blue/255, bg.alpha/255); + + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + Utils.drawRoundedLine(cr, x + lineWidth/2.0 + width - finishedWidth, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + else + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + + cr.$dispose(); + }, + + setProgress: function(progress) { + this._progress = Math.min(Math.max(progress, 0.0), 1.0); + this._updateProgressOverlay(); + }, + + toggleProgressOverlay: function(activate) { + if (activate) { + this._showProgressOverlay(); + } + else { + this._hideProgressOverlay(); + } + }, + + insertEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) !== -1) + return; + + this._progressManagerEntries.push(appProgress); + this._selectEntry(appProgress); + }, + + removeEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) == -1) + return; + + this._progressManagerEntries.splice(this._progressManagerEntries.indexOf(appProgress), 1); + + if (this._progressManagerEntries.length > 0) { + this._selectEntry(this._progressManagerEntries[this._progressManagerEntries.length-1]); + } else { + this.setNotificationBadge(0); + this.toggleNotificationBadge(false); + this.setProgress(0); + this.toggleProgressOverlay(false); + this.setUrgent(false); + } + }, + + _selectEntry: function(appProgress) { + if (!appProgress) + return; + + this._signalsHandler.removeWithLabel('progress-entry'); + + this._signalsHandler.addWithLabel('progress-entry', + [ + appProgress, + 'count-changed', + (appProgress, value) => { + this.setNotificationBadge(value); + } + ], [ + appProgress, + 'count-visible-changed', + (appProgress, value) => { + this.toggleNotificationBadge(value); + } + ], [ + appProgress, + 'progress-changed', + (appProgress, value) => { + this.setProgress(value); + } + ], [ + appProgress, + 'progress-visible-changed', + (appProgress, value) => { + this.toggleProgressOverlay(value); + } + ], [ + appProgress, + 'urgent-changed', + (appProgress, value) => { + this.setUrgent(value) + } + ]); + + this.setNotificationBadge(appProgress.count()); + this.toggleNotificationBadge(appProgress.countVisible()); + this.setProgress(appProgress.progress()); + this.toggleProgressOverlay(appProgress.progressVisible()); + + this._isUrgent = false; + }, + + setUrgent: function(urgent) { + const icon = this._source.icon._iconBin; + if (urgent) { + if (!this._isUrgent) { + icon.set_pivot_point(0.5, 0.5); + this._source.iconAnimator.addAnimation(icon, 'dance'); + this._isUrgent = true; + } + } else { + if (this._isUrgent) { + this._source.iconAnimator.removeAnimation(icon, 'dance'); + this._isUrgent = false; + } + icon.rotation_angle_z = 0; + } + } +}); diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js new file mode 100644 index 0000000..c298f84 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/proximity.js @@ -0,0 +1,262 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Lang = imports.lang; +const Meta = imports.gi.Meta; + +const Layout = imports.ui.layout; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; + +//timeout intervals +const MIN_UPDATE_MS = 200; + +//timeout names +const T1 = 'limitUpdateTimeout'; + +var Mode = { + ALL_WINDOWS: 0, + FOCUSED_WINDOWS: 1, + MAXIMIZED_WINDOWS: 2 +}; + +var ProximityWatch = Utils.defineClass({ + Name: 'DashToPanel.ProximityWatch', + + _init: function(actor, mode, xThreshold, yThreshold, handler) { + this.actor = actor; + this.overlap = 0; + this.mode = mode; + this.threshold = [xThreshold, yThreshold]; + this.handler = handler; + + this._allocationChangedId = actor.connect('notify::allocation', () => this._update()); + + this._update(); + }, + + destroy: function() { + this.actor.disconnect(this._allocationChangedId); + }, + + _update: function() { + this.monitorIndex = Main.layoutManager.findIndexForActor(this.actor); + + this._updateWatchRect(); + }, + + _updateWatchRect: function() { + let [actorX, actorY] = this.actor.get_position(); + + this.rect = new Meta.Rectangle({ + x: actorX - this.threshold[0], + y: actorY - this.threshold[1], + width: this.actor.width + this.threshold[0] * 2, + height: this.actor.height + this.threshold[1] * 2 + }); + }, +}); + +var ProximityManager = Utils.defineClass({ + Name: 'DashToPanel.ProximityManager', + + _init: function() { + this._counter = 1; + this._watches = {}; + this._focusedWindowInfo = null; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._bindSignals(); + this._setFocusedWindow(); + }, + + createWatch: function(actor, mode, xThreshold, yThreshold, handler) { + let watch = new ProximityWatch(actor, mode, xThreshold, yThreshold, handler); + + this._watches[this._counter] = watch; + this.update(); + + return this._counter++; + }, + + removeWatch: function(id) { + if (this._watches[id]) { + this._watches[id].destroy(); + delete this._watches[id]; + } + }, + + update: function() { + this._queueUpdate(true); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + this._disconnectFocusedWindow(); + Object.keys(this._watches).forEach(id => this.removeWatch(id)); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + global.window_manager, + 'switch-workspace', + () => Object.keys(this._watches).forEach(id => this._watches[id].overlap = 0) + ], + [ + Main.overview, + 'hidden', + () => this._queueUpdate() + ], + [ + global.display, + 'notify::focus-window', + () => { + this._setFocusedWindow(); + this._queueUpdate(); + } + ], + [ + global.window_group, + [ + 'actor-added', + 'actor-removed' + ], + () => this._queueUpdate() + ] + ); + }, + + _setFocusedWindow: function() { + this._disconnectFocusedWindow(); + + let focusedWindow = global.display.focus_window; + + if (focusedWindow) { + let focusedWindowInfo = this._getFocusedWindowInfo(focusedWindow); + + if (focusedWindowInfo && this._checkIfHandledWindowType(focusedWindowInfo.metaWindow)) { + focusedWindowInfo.allocationId = focusedWindowInfo.window.connect('notify::allocation', () => this._queueUpdate()); + focusedWindowInfo.destroyId = focusedWindowInfo.window.connect('destroy', () => this._disconnectFocusedWindow(true)); + + this._focusedWindowInfo = focusedWindowInfo; + } + } + }, + + _getFocusedWindowInfo: function(focusedWindow) { + let window = focusedWindow.get_compositor_private(); + let focusedWindowInfo; + + if (window) { + focusedWindowInfo = { window: window }; + focusedWindowInfo.metaWindow = focusedWindowInfo.window.get_meta_window(); + + if (focusedWindow.is_attached_dialog()) { + let mainMetaWindow = focusedWindow.get_transient_for(); + + if (focusedWindowInfo.metaWindow.get_frame_rect().height < mainMetaWindow.get_frame_rect().height) { + focusedWindowInfo.window = mainMetaWindow.get_compositor_private(); + focusedWindowInfo.metaWindow = mainMetaWindow; + } + } + } + + return focusedWindowInfo; + }, + + _disconnectFocusedWindow: function(destroy) { + if (this._focusedWindowInfo && !destroy) { + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.allocationId); + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.destroyId); + } + + this._focusedWindowInfo = null; + }, + + _getHandledWindows: function() { + return global.get_window_actors() + .filter(w => w.visible) + .map(w => w.get_meta_window()) + .filter(mw => this._checkIfHandledWindow(mw)); + }, + + _checkIfHandledWindow: function(metaWindow) { + return metaWindow && !metaWindow.minimized && + this._checkIfHandledWindowType(metaWindow); + }, + + _checkIfHandledWindowType: function(metaWindow) { + let metaWindowType = metaWindow.get_window_type(); + + //https://www.roojs.org/seed/gir-1.2-gtk-3.0/seed/Meta.WindowType.html + return metaWindowType <= Meta.WindowType.SPLASHSCREEN && + metaWindowType != Meta.WindowType.DESKTOP; + }, + + _queueUpdate: function(noDelay) { + if (!noDelay && this._timeoutsHandler.getId(T1)) { + //limit the number of updates + this._pendingUpdate = true; + return; + } + + this._timeoutsHandler.add([T1, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + + let metaWindows = this._getHandledWindows(); + + Object.keys(this._watches).forEach(id => { + let watch = this._watches[id]; + let overlap = this._update(watch, metaWindows); + + if (overlap !== watch.overlap) { + watch.handler(overlap); + watch.overlap = overlap; + } + }); + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdate(); + } + }, + + _update: function(watch, metaWindows) { + if (watch.mode === Mode.FOCUSED_WINDOWS) { + return (this._focusedWindowInfo && + this._checkIfHandledWindow(this._focusedWindowInfo.metaWindow) && + this._checkProximity(this._focusedWindowInfo.metaWindow, watch)); + } else if (watch.mode === Mode.MAXIMIZED_WINDOWS) { + return metaWindows.some(mw => mw.maximized_vertically && mw.maximized_horizontally && + mw.get_monitor() == watch.monitorIndex); + } + + //Mode.ALL_WINDOWS + return metaWindows.some(mw => this._checkProximity(mw, watch)); + }, + + _checkProximity: function(metaWindow, watch) { + return metaWindow.get_frame_rect().overlap(watch.rect); + }, +}); \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..ef5dc7d725cc6ada68fe998189bc3350e0edcf9b GIT binary patch literal 17276 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 U$w{AwIrcfSca2Za-&NTE0-?-ey8r+H literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml new file mode 100644 index 0000000..7e8ea3a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -0,0 +1,1278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'BOTTOM' + Panel position (Deprecated) + Panel is shown on the Bottom or Top of the screen. + + + true + Sync element positions + Sync panel element positions on all monitors. + + + '{}' + Panel positions + Panel positions (JSON). + + + '{}' + Panel element positions + Panel element positions (JSON). + + + '{}' + Percentages of screen edge for panel to span + Length of the panels, in percent (JSON). + + + '{}' + Positions along screen edge + Where to show the panels if it is not the full length of the screen edge (JSON). + + + '{}' + Panel sizes + Sizes of panels, in pixels. + + + 48 + Panel size (Deprecated) + Set the size of the panel. + + + false + Override Show Desktop line color + Replace current Show Desktop button line color + + + "rgba(200,200,200,0.2)" + Custom Show Desktop line color + Custom Show Desktop button line color + + + 'BOTTOM' + Dot position + Running indicators are shown on the Bottom or Top of the screen. + + + 'METRO' + Style of the running indicator (focused) + Style of the running indicator for the icon for the currently focused application + + + 'METRO' + Style of the running indicator (unfocused) + Style of the running indicator for the icon for applications which are not currently focused + + + false + Running indicator dominant color + Whether to use the app icon's dominant color for .app-well-running-dot + + + false + Running indicator color override + Whether to override the theme background color for .app-well-running-dot + + + "#5294e2" + Color of running indicator (1 window) + Customize the color of the running indicator when one window is running for that application + + + "#5294e2" + Color of running indicator (2 windows) + Customize the color of the running indicator when two windows are running for that application + + + "#5294e2" + Color of running indicator (3 windows) + Customize the color of the running indicator when three windows are running for that application + + + "#5294e2" + Color of running indicator (4+ windows) + Customize the color of the running indicator when four or more windows are running for that application + + + false + Unfocused color is different than focused + Whether to apply a 2nd color scheme to the indicator when the app is not focused + + + "#5294e2" + Color of unfocused running indicator (1 window) + Customize the color of the unfocused running indicator when one window is running for that application + + + "#5294e2" + Color of unfocused running indicator (2 windows) + Customize the color of the unfocused running indicator when two windows are running for that application + + + "#5294e2" + Color of unfocused running indicator (3 windows) + Customize the color of the unfocused running indicator when three windows are running for that application + + + "#5294e2" + Color of unfocused running indicator (4+ windows) + Customize the color of the unfocused running indicator when four or more windows are running for that application + + + 3 + Running indicator height + Height of the running indicator line/diameter of window indicator dots + + + true + Highlight icon of focused application + Whether to highlight the background of the currently focused application's icon + + + false + Highlight icon dominant color + Base the active window highlight color on that application's icon + + + "#EEEEEE" + Color of highlight of focused application + Customize the color of the highlight of the focused application + + + 25 + Opacity of highlight of focused application + Customize the opacity of the highlight of the focused application + + + false + Keep dash + Whether to keep the stock gnome-shell dash while in overview + + + false + Keep top panel + Whether to keep the stock gnome-shell top panel + + + false + Panel menu buttons require click + Whether to activate the panel menu buttons on hover or on click + + + false + Force hot corner + Wheter to force having an Activities hot corner on the primary monitor + + + false + Lock the taskbar + Specifies if the user can modify the taskbar + + + false + Override theme background color + Replace current theme background color for the panel + + + "#000" + Custom background color + Custom background color for the panel + + + false + Custom background color + Replace current theme background color for the panel + + + false + Dynamic opacity + Enable dynamic opacity + + + 0.4 + Panel opacity + Custom opacity for the panel + + + 'ALL_WINDOWS' + Dynamic opacity behavior + Dictates which window type affects the panel opacity + + + 20 + Distance to change opacity + The distance a window needs to be from the panel to change opacity + + + 0.8 + Modified panel opacity + Modified opacity for the panel when a window is near + + + 300 + Opacity change duration + The duration of the animation when the opacity changes + + + false + Custom gradient + Replace current theme gradient for the panel + + + "#000" + Custom gradient top color + Custom gradient top color for the panel + + + 0 + Custom gradient top opacity + Custom gradient top opacity for the panel + + + "#000" + Custom gradient bottom color + Custom gradient bottom color for the panel + + + 0.2 + Custom gradient bottom opacity + Custom gradient bottom opacity for the panel + + + false + Intellihide + Whether to intelligently hide the panel + + + false + Only hide from windows + Dictates if the dash should only hide when in conflict with windows + + + 'FOCUSED_WINDOWS' + Intellihide behaviour + Dictates how to intelligently hide the panel + + + false + Intellihide pressure + To reveal the panel, pressure needs to be applied to the edege of the screen + + + 100 + Intellihide pressure threshold + The pressure needed to reveal the panel + + + 1000 + Intellihide pressure time + The numer of milliseconds that the pressure needs to be applied to reveal the panel + + + false + Intellihide pressure + Allow the panel to be revealed while an application is in fullscreen mode + + + false + Intellihide only secondary + Whether to only hide secondary panels + + + 200 + Intellihide animation time + The animation time (ms) to hide and reveal the panel + + + 400 + Intellihide close delay + The delay (ms) before hiding the panel + + + "<Super>i" + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + i']]]> + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + 2000 + Intellihide enable start delay + The delay before enabling intellihide on start + + + "" + Custom Show Applications icon + Customize the Show Applications icon + + + 8 + Show Applications icon side padding + Customize the Show Applications icon side padding + + + true + Override escape key + Override the escape key to return to the desktop when entering the overview using the Show Applications button + + + [] + Show Apps button context menu commands + Commands to add to the Show Apps button right click menu + + + [] + Show Apps button context menu titles + Titles for commands added to Show Apps button right click menu + + + [] + Panel context menu commands + Commands to add to the panel right click menu + + + [] + Panel context menu titles + Titles for commands added to panel right click menu + + + false + Show activities button + Show activities button on the left hand side of the taskbar + + + 8 + Width of show Desktop button + Customize the width of the show Desktop button + + + false + Show desktop on hover + Show the desktop on mouse hover + + + 1000 + Delay show desktop + Delay before showing the desktop + + + 300 + Show desktop animation time + Window fade animation time when showing the destop + + + false + Show appMenu button + Show appMenu on the right hand side of the panel + + + true + Show window preview + Show preview of running window on hover of app icon + + + true + Show tooltip + Show tooltip on hover of app icon + + + true + Show running apps + Show or hide running application icons in the dash + + + true + Show favorites apps + Show or hide favorite application icons in the dash + + + 400 + Icon enter display time + Amount of time after entering icon to wait before displaying window preview if icon is not clicked or mouse has not left. + + + true + Enable peek mode + Peek a window upon hover for some time + + + true + Display title in preview + Display window title in preview + + + false + Window previews manual styling + This defines if the default window previews styling should be applied + + + 'TOP' + Title position + Position of the window title, close button and icon in preview. + + + "#dddddd" + Window previews title font color + This defines the window preview titles font color. + + + 14 + Window previews title font size + This defines the window preview titles font size. + + + false + Window previews use custom icon size + Window previews use custom application icon size. + + + 16 + Window previews custom icon size + Window previews custom application icon size. + + + 260 + Window previews animation time + This defines the window previews animation time. + + + 'inherit' + Font weight of window preview titles + This defines the font weight of window preview titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. + + + 240 + Window previews size + Preferred window previews size + + + false + Fixed aspect ratio X + This defines if the window previews use a fixed aspect ratio X. + + + true + Fixed aspect ratio Y + This defines if the window previews use a fixed aspect ratio Y. + + + 8 + Window previews padding + The padding of the window previews + + + 16 + Aspect ratio X + The window previews respected aspect ratio X. + + + 9 + Aspect ratio Y + The window previews respected aspect ratio Y. + + + false + Immediate hide on icon click + The window previews immediately hide when an application icon is clicked. + + + false + Provide workspace isolation + Dash shows only windows from the current workspace + + + false + Close overview by clicking in empty space + Close overview or app grid by clicking in empty space + + + false + Hide overview on startup + Hide overview on startup, which would be shown by default at gnome startup. + + + true + Group applications + Dash groups the application instances under the same icon + + + 14 + Application title font size + When the applications are ungrouped, this defines the application titles font size. + + + 'inherit' + Font weight of application titles + When the applications are ungrouped, this defines font weight of application titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. + + + "#dddddd" + Application title font color + When the applications are ungrouped, this defines the application titles font color. + + + "#dddddd" + Minimized application title font color + When the applications are ungrouped, this defines the titles font color for minimized applications. + + + 160 + Application title max width + When the applications are ungrouped, this defines the application titles maximum width. + + + true + Use a fixed width for the application titles + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + + + true + Display running indicators on unfocused applications + When the applications are ungrouped, this defines if running applications should display an indicator. + + + false + Use favorite icons as application launchers + When the applications are ungrouped, this defines if running applications stay separate from the favorite icons. + + + 0 + Primary monitor index + Specifies the index of the primary monitor. + + + true + Display panels on all monitors + Specifies if a panel is shown on every monitors + + + [] + Available monitors + Available gnome-shell (Mutter) monitors, internal use + + + false + Provide monitor isolation + Dash shows only windows from the current monitor + + + true + Display the favorites on all monitors + Specifies if every panel should display the favorite applications. If false, the favorite appplications are only displayed on the primary monitor. + + + true + Customize click behaviour + Customize action on various mouse events + + + true + Minimize on shift+click + + + true + Activate only one window + + + 'CYCLE-MIN' + Action when clicking on a running app + Set the action that is executed when clicking on the icon of a running application + + + 'MINIMIZE' + Action when shift+clicking on a running app + Set the action that is executed when shift+clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when middle-clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when shift+middle-clicking on the icon of a running application + + + 'SWITCH_WORKSPACE' + Action when scrolling over the panel + Set the action that is executed when scrolling over the panel + + + 0 + Delay between panel mouse scroll events + Set the minimum delay between panel mouse scroll events + + + true + Show the workspace switch head-up when workspace is changed by scrolling on the panel + + + 'CYCLE_WINDOWS' + Action when scrolling over a running app + Set the action that is executed when scrolling over a running application + + + 0 + Delay between icon mouse scroll events + Set the minimum delay between icon mouse scroll events + + + 100 + Icon leave preview timeout + Amount of time to leave preview windows open when the mouse has left the application's icon. + + + 500 + Enter window peeking mode timeout + Amount of time of inactivity to enter the window peeking mode when the mouse has entered a window preview. + + + 40 + Window peeking mode opacity + All windows except for the peeked one have their opacity set to the same value. + + + true + Middle click preview to close window + Middle click on the window preview to close that window + + + true + Window previews use custom opacity + Window previews background use a different opacity from the panel + + + 80 + Window previews background opacity + Window previews use this custom background opacity. + + + 0 + Tray font size + Set the size of the tray font. (0 for default) + + + 0 + Leftbox font size + Set the size of the leftBox font. (0 for default) + + + 8 + App icon margin + Set the margin for application icons in the embedded dash. + + + 4 + App icon padding + Set the padding for application icons in the embedded dash. + + + -1 + Tray item padding + Set the size of the tray padding. (-1 for default) + + + -1 + Leftbox item padding + Set the size of the leftBox padding. (-1 for default) + + + -1 + Status icon padding + Set the size of the aggregate (status) menu icon padding. (-1 for default) + + + true + Animate running indicator when open/closing/switching applications + + + true + Animate when new window launched + + + false + Animate app icon on hover + + + 'SIMPLE' + App icon hover animation type + + + {'RIPPLE':2,'PLANK':1} + App icon hover animation curve convexity (1 is linear, more is convex, less is concave) + + + {'SIMPLE':160,'RIPPLE':130,'PLANK':100} + App icon hover animation duration in milliseconds + + + {'RIPPLE':4,'PLANK':4} + App icon hover animation extent (maximum number of animated icons) + + + {'SIMPLE':0,'RIPPLE':10,'PLANK':0} + App icon hover animation rotation in degrees + + + {'SIMPLE':0.30,'RIPPLE':0.40,'PLANK':0} + App icon hover animation travel translation in relation to the app icon size + + + {'SIMPLE':1,'RIPPLE':1.25,'PLANK':2} + App icon hover animation zoom scale in relation to the app icon size + + + true + Integrate items from the gnome appmenu into the right click menu + + + false + Display Show Details to open Gnome Software from right click menu + + + "<Super>q" + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + q']]]> + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + 2000 + Timeout to hide the dock, in seconds + Sets the time duration before the dock is hidden again. + + + 750 + Timeout to hide the dock, in seconds + Sets the time duration before the dock is hidden again. + + + 'TEMPORARILY' + Transitivity of the number overlay + You can choose between NEVER, TEMPORARILY and ALWAYS. + + + false + Super Hot-Keys + Launch and switch between dash items using Super+(0-9) + + + 'Super' + Prefix to use for hotkeys + You can choose between Super or SuperAlt as the prefix for hotkeys. + + + false + Show window previews + When multiple instances of the application are available, show their window previews + + + 'BOTH' + Hotkeys number keys + Which number keys are used for the hotkeys + + + 1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + 2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + 3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + 4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + 5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + 6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + 7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + 8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + 9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + 0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + 1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + 2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + 3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + 4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + 5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + 6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + 7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + 8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + 9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + 0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + 1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + 2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + 3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + 4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + 5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + 6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + 7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + 8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + 9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + 0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + KP_1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + KP_2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + KP_3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + KP_4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + KP_5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + KP_6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + KP_7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + KP_8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + KP_9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + KP_0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + KP_1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + KP_4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + KP_5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + KP_6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + KP_7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + KP_8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + KP_9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + KP_0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + KP_1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + KP_4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + KP_5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + KP_6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + KP_7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + KP_8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + KP_9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + KP_0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + true + Show progress bar on app icon + Whether to show progress bar overlay on app icon, for supported applications. + + + true + Show badge count on app icon + Whether to show badge count overlay on app icon, for supported applications. + + + diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css new file mode 100644 index 0000000..6917e24 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/stylesheet.css @@ -0,0 +1,151 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +#dashtopanelTaskbar .dash-item-container > StWidget { + margin: 0; + padding: 0; +} + +#dashtopanelScrollview .app-well-app .overview-icon, +.dashtopanelMainPanel .show-apps .overview-icon { + background: none; + border: none; + margin: 0; + padding: 0; +} + +#dashtopanelScrollview .app-well-app .overview-label { + /* must match TITLE_RIGHT_PADDING in apppicons.js */ + padding-right: 8px; +} + +#dashtopanelScrollview .app-well-app:hover .overview-icon, +#dashtopanelScrollview .app-well-app:focus .overview-icon { + background: none; +} + +.dashtopanelMainPanel .show-apps:hover .overview-icon, +#dashtopanelScrollview .app-well-app:hover .dtp-container, +#dashtopanelScrollview .app-well-app:focus .dtp-container { + background-color: rgba(238, 238, 236, 0.1); +} + +#dashtopanelScrollview .app-well-app:hover .dtp-container.animate-appicon-hover { + background: none; +} + +#dashtopanelScrollview .app-well-app:active .dtp-container { + background-color: rgba(238, 238, 236, 0.18); +} + +#dashtopanelScrollview .app-well-app .favorite { + background-color: rgba(80, 150, 255, 0.4); +} + +#dashtopanelScrollview .app-well-app-running-dot { + margin-bottom: 0; +} + +#dashtopanelTaskbar .scrollview-fade { + background-gradient-end: rgba(0, 0, 0, 0); +} + +.dashtopanelSecondaryMenu { + max-width: 400px; +} + +.dashtopanelMainPanel.vertical .panel-button { + text-align: center; +} + +.dashtopanelMainPanel.vertical .panel-button.vertical *, +.dashtopanelMainPanel.vertical .panel-button.clock-display * { + padding: 0; + margin: 0; +} + +.dashtopanelMainPanel.vertical .panel-button > *, +.dashtopanelMainPanel.vertical .panel-button.vertical > *, +.dashtopanelMainPanel.vertical .panel-button.clock-display > * { + padding: 8px 0; +} + +#dashtopanelThumbnailList { + spacing: 0em; + padding: 0 1em; +} + +#dashtopanelThumbnailList .popup-menu-item { + padding: 0; + border-radius: 5px; + spacing: 0; +} + +#dashtopanelThumbnailList .window-box { + padding: 0; + spacing: 0; +} + +#dashtopanelThumbnailList .preview-window-title { + padding-top: 1em; +} + +.popup-menu.panel-menu { + margin-bottom: 0; +} + +#panel #panelLeft, #panel #panelCenter { + spacing: 0px; +} + +.showdesktop-button-dark-hovered { + background-color: rgba(200, 200, 200, .4); +} + +.showdesktop-button-light-hovered { + background-color: rgba(55, 55, 55, .4); +} + +.panel-corner.hidden:active, .panel-corner.hidden:overview, .panel-corner.hidden:focus { + -panel-corner-border-color: rgba(0, 0, 0, .001); +} +#dashtopanelScrollview .badge { + color: rgba(255, 255, 255, 1); + font-weight: bold; + text-align: center; +} + +#dashtopanelScrollview .number-overlay { + background-color: rgba(0,0,0,0.8); +} + +#dashtopanelScrollview .notification-badge { + background-color: rgba(255,0,0,0.8); +} + +#dashtopanelScrollview .progress-bar { + /* Customization of the progress bar style, e.g.: + -progress-bar-background: rgba(0.8, 0.8, 0.8, 1); + -progress-bar-border: rgba(0.9, 0.9, 0.9, 1); + */ +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js new file mode 100644 index 0000000..4f74d1e --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/taskbar.js @@ -0,0 +1,1557 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Signals = imports.signals; +const Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; + +const SearchController = imports.ui.main.overview._overview._controls._searchController; +const AppDisplay = imports.ui.main.overview._overview._controls.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const AppIcons = Me.imports.appIcons; +const Panel = Me.imports.panel; +const PanelManager = Me.imports.panelManager; +const PanelSettings = Me.imports.panelSettings; +const Pos = Me.imports.panelPositions; +const Utils = Me.imports.utils; +const WindowPreview = Me.imports.windowPreview; + +var DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME / (Dash.DASH_ANIMATION_TIME > 1 ? 1000 : 1); +var DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; +var MIN_ICON_SIZE = 4; + +/** + * Extend DashItemContainer + * + * - set label position based on taskbar orientation + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this ugly pattern. + */ + +function extendDashItemContainer(dashItemContainer) { + dashItemContainer.showLabel = AppIcons.ItemShowLabel; +}; + +const iconAnimationSettings = { + _getDictValue: function(key) { + let type = Me.settings.get_string('animate-appicon-hover-animation-type'); + return Me.settings.get_value(key).deep_unpack()[type] || 0; + }, + + get type() { + if (!Me.settings.get_boolean('animate-appicon-hover')) + return ""; + + return Me.settings.get_string('animate-appicon-hover-animation-type'); + }, + + get convexity() { + return Math.max(0, this._getDictValue('animate-appicon-hover-animation-convexity')); + }, + + get duration() { + return this._getDictValue('animate-appicon-hover-animation-duration'); + }, + + get extent() { + return Math.max(1, this._getDictValue('animate-appicon-hover-animation-extent')); + }, + + get rotation() { + return this._getDictValue('animate-appicon-hover-animation-rotation'); + }, + + get travel() { + return Math.max(0, this._getDictValue('animate-appicon-hover-animation-travel')); + }, + + get zoom() { + return Math.max(1, this._getDictValue('animate-appicon-hover-animation-zoom')); + }, +}; + +/* This class is a fork of the upstream DashActor class (ui.dash.js) + * + * Summary of changes: + * - modified chldBox calculations for when 'show-apps-at-top' option is checked + * - handle horizontal dash + */ +var taskbarActor = Utils.defineClass({ + Name: 'DashToPanel-TaskbarActor', + Extends: St.Widget, + + _init: function(delegate) { + this._delegate = delegate; + this._currentBackgroundColor = 0; + this.callParent('_init', { name: 'dashtopanelTaskbar', + layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation[delegate.dtpPanel.getOrientation().toUpperCase()] }), + clip_to_allocation: true }); + }, + + vfunc_allocate: function(box, flags)  { + Utils.setAllocation(this, box, flags); + + let panel = this._delegate.dtpPanel; + let availFixedSize = box[panel.fixedCoord.c2] - box[panel.fixedCoord.c1]; + let availVarSize = box[panel.varCoord.c2] - box[panel.varCoord.c1]; + let [dummy, scrollview, leftFade, rightFade] = this.get_children(); + let [, natSize] = this[panel.sizeFunc](availFixedSize); + let childBox = new Clutter.ActorBox(); + let orientation = panel.getOrientation(); + + Utils.allocate(dummy, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c1]; + childBox[panel.varCoord.c2] = Math.min(availVarSize, natSize); + childBox[panel.fixedCoord.c1] = box[panel.fixedCoord.c1]; + childBox[panel.fixedCoord.c2] = box[panel.fixedCoord.c2]; + + Utils.allocate(scrollview, childBox, flags); + + let [value, , upper, , , pageSize] = scrollview[orientation[0] + 'scroll'].adjustment.get_values(); + upper = Math.floor(upper); + scrollview._dtpFadeSize = upper > pageSize ? this._delegate.iconSize : 0; + + if (this._currentBackgroundColor !== panel.dynamicTransparency.currentBackgroundColor) { + this._currentBackgroundColor = panel.dynamicTransparency.currentBackgroundColor; + let gradientStyle = 'background-gradient-start: ' + this._currentBackgroundColor + + 'background-gradient-direction: ' + orientation; + + leftFade.set_style(gradientStyle); + rightFade.set_style(gradientStyle); + } + + childBox[panel.varCoord.c2] = childBox[panel.varCoord.c1] + (value > 0 ? scrollview._dtpFadeSize : 0); + Utils.allocate(leftFade, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c2] - (value + pageSize < upper ? scrollview._dtpFadeSize : 0); + childBox[panel.varCoord.c2] = box[panel.varCoord.c2]; + Utils.allocate(rightFade, childBox, flags); + }, + + // We want to request the natural size of all our children + // as our natural width, so we chain up to StWidget (which + // then calls BoxLayout) + vfunc_get_preferred_width: function(forHeight) { + let [, natWidth] = St.Widget.prototype.vfunc_get_preferred_width.call(this, forHeight); + + return [0, natWidth]; + }, + + vfunc_get_preferred_height: function(forWidth) { + let [, natHeight] = St.Widget.prototype.vfunc_get_preferred_height.call(this, forWidth); + + return [0, natHeight]; + }, +}); + +/* This class is a fork of the upstream dash class (ui.dash.js) + * + * Summary of changes: + * - disconnect global signals adding a destroy method; + * - play animations even when not in overview mode + * - set a maximum icon size + * - show running and/or favorite applications + * - emit a custom signal when an app icon is added + * - Add scrollview + * Ensure actor is visible on keyfocus inside the scrollview + * - add 128px icon size, might be useful for hidpi display + * - Sync minimization application target position. + */ + +var taskbar = Utils.defineClass({ + Name: 'DashToPanel.Taskbar', + + _init : function(panel) { + this.dtpPanel = panel; + + // start at smallest size due to running indicator drawing area expanding but not shrinking + this.iconSize = 16; + + this._shownInitially = false; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._showLabelTimeoutId = 0; + this._resetHoverTimeoutId = 0; + this._ensureAppIconVisibilityTimeoutId = 0; + this._labelShowing = false; + this.fullScrollView = 0; + + let isVertical = panel.checkIfVertical(); + + this._box = new St.BoxLayout({ vertical: isVertical, + clip_to_allocation: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START }); + + this._container = new taskbarActor(this); + this._scrollView = new St.ScrollView({ name: 'dashtopanelScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: true }); + + this._scrollView.connect('leave-event', Lang.bind(this, this._onLeaveEvent)); + this._scrollView.connect('motion-event', Lang.bind(this, this._onMotionEvent)); + this._scrollView.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); + this._scrollView.add_actor(this._box); + + this._showAppsIconWrapper = panel.showAppsIconWrapper; + this._showAppsIconWrapper.connect('menu-state-changed', Lang.bind(this, function(showAppsIconWrapper, opened) { + this._itemMenuStateChanged(showAppsIconWrapper, opened); + })); + // an instance of the showAppsIcon class is encapsulated in the wrapper + this._showAppsIcon = this._showAppsIconWrapper.realShowAppsIcon; + this.showAppsButton = this._showAppsIcon.toggleButton; + + if (isVertical) { + this.showAppsButton.set_width(panel.geom.w); + } + + this.showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled)); + + this.showAppsButton.checked = (SearchController._showAppsButton) ? SearchController._showAppsButton.checked : false; + + this._showAppsIcon.childScale = 1; + this._showAppsIcon.childOpacity = 255; + this._showAppsIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(this._showAppsIcon, this._showAppsIconWrapper); + + this._container.add_child(new St.Widget({ width: 0, reactive: false })); + this._container.add_actor(this._scrollView); + + let orientation = panel.getOrientation(); + let fadeStyle = 'background-gradient-direction:' + orientation; + let fade1 = new St.Widget({ style_class: 'scrollview-fade', reactive: false }); + let fade2 = new St.Widget({ style_class: 'scrollview-fade', + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: 180 }); + + fade1.set_style(fadeStyle); + fade2.set_style(fadeStyle); + + this._container.add_actor(fade1); + this._container.add_actor(fade2); + + this.previewMenu = new WindowPreview.PreviewMenu(panel); + this.previewMenu.enable(); + + let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; + this.actor = new St.Bin({ child: this._container, + y_align: St.Align.START, x_align:rtl?St.Align.END:St.Align.START + }); + + let adjustment = this._scrollView[orientation[0] + 'scroll'].adjustment; + + this._workId = Main.initializeDeferredWork(this._box, Lang.bind(this, this._redisplay)); + + this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); + + this._appSystem = Shell.AppSystem.get_default(); + + this.iconAnimator = new PanelManager.IconAnimator(this.dtpPanel.panel.actor); + + this._signalsHandler.add( + [ + this.dtpPanel.panel.actor, + 'notify::height', + () => this._queueRedisplay() + ], + [ + this.dtpPanel.panel.actor, + 'notify::width', + () => this._queueRedisplay() + ], + [ + this._appSystem, + 'installed-changed', + Lang.bind(this, function() { + AppFavorites.getAppFavorites().reload(); + this._queueRedisplay(); + }) + ], + [ + this._appSystem, + 'app-state-changed', + Lang.bind(this, this._queueRedisplay) + ], + [ + AppFavorites.getAppFavorites(), + 'changed', + Lang.bind(this, this._queueRedisplay) + ], + [ + global.window_manager, + 'switch-workspace', + () => this._connectWorkspaceSignals() + ], + [ + Utils.DisplayWrapper.getScreen(), + [ + 'window-entered-monitor', + 'window-left-monitor' + ], + () => { + if (Me.settings.get_boolean('isolate-monitors')) { + this._queueRedisplay(); + } + } + ], + [ + Main.overview, + 'item-drag-begin', + Lang.bind(this, this._onDragBegin) + ], + [ + Main.overview, + 'item-drag-end', + Lang.bind(this, this._onDragEnd) + ], + [ + Main.overview, + 'item-drag-cancelled', + Lang.bind(this, this._onDragCancelled) + ], + [ + // Ensure the ShowAppsButton status is kept in sync + SearchController._showAppsButton, + 'notify::checked', + Lang.bind(this, this._syncShowAppsButtonToggled) + ], + [ + Me.settings, + [ + 'changed::dot-size', + 'changed::show-favorites', + 'changed::show-running-apps', + 'changed::show-favorites-all-monitors' + ], + Lang.bind(this, this._redisplay) + ], + [ + Me.settings, + 'changed::group-apps', + Lang.bind(this, function() { + this.isGroupApps = Me.settings.get_boolean('group-apps'); + this._connectWorkspaceSignals(); + }) + ], + [ + Me.settings, + [ + 'changed::group-apps-use-launchers', + 'changed::taskbar-locked' + ], + () => this.resetAppIcons() + ], + [ + adjustment, + [ + 'notify::upper', + 'notify::pageSize' + ], + () => this._onScrollSizeChange(adjustment) + ] + ); + + this.isGroupApps = Me.settings.get_boolean('group-apps'); + + this._onScrollSizeChange(adjustment); + this._connectWorkspaceSignals(); + }, + + destroy: function() { + this.iconAnimator.destroy(); + + this._signalsHandler.destroy(); + this._signalsHandler = 0; + + this._container.destroy(); + + this.previewMenu.disable(); + this.previewMenu.destroy(); + + this._disconnectWorkspaceSignals(); + }, + + _dropIconAnimations: function() { + this._getTaskbarIcons().forEach(item => { + item.raise(0); + item.stretch(0); + }); + }, + + _updateIconAnimations: function(pointerX, pointerY) { + this._iconAnimationTimestamp = Date.now(); + let type = iconAnimationSettings.type; + + if (!pointerX || !pointerY) + [pointerX, pointerY] = global.get_pointer(); + + this._getTaskbarIcons().forEach(item => { + let [x, y] = item.get_transformed_position(); + let [width, height] = item.get_transformed_size(); + let [centerX, centerY] = [x + width / 2, y + height / 2]; + let size = this._box.vertical ? height : width; + let difference = this._box.vertical ? pointerY - centerY : pointerX - centerX; + let distance = Math.abs(difference); + let maxDistance = (iconAnimationSettings.extent / 2) * size; + + if (type == 'PLANK') { + // Make the position stable for items that are far from the pointer. + let translation = distance <= maxDistance ? + distance / (2 + 8 * distance / maxDistance) : + // the previous expression with distance = maxDistance + maxDistance / 10; + + if (difference > 0) + translation *= -1; + + item.stretch(translation); + } + + if (distance <= maxDistance) { + let level = (maxDistance - distance) / maxDistance; + level = Math.pow(level, iconAnimationSettings.convexity); + item.raise(level); + } else { + item.raise(0); + } + }); + }, + + _onLeaveEvent: function(actor) { + let [stageX, stageY] = global.get_pointer(); + let [success, x, y] = actor.transform_stage_point(stageX, stageY); + if (success && !actor.allocation.contains(x, y) && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) + this._dropIconAnimations(); + + return Clutter.EVENT_PROPAGATE; + }, + + _onMotionEvent: function(actor_, event) { + if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { + let timestamp = Date.now(); + if (!this._iconAnimationTimestamp || + (timestamp - this._iconAnimationTimestamp >= iconAnimationSettings.duration / 2)) { + let [pointerX, pointerY] = event.get_coords(); + this._updateIconAnimations(pointerX, pointerY); + } + } + + return Clutter.EVENT_PROPAGATE; + }, + + _onScrollEvent: function(actor, event) { + + let orientation = this.dtpPanel.getOrientation(); + + // reset timeout to avid conflicts with the mousehover event + if (this._ensureAppIconVisibilityTimeoutId>0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + + // Skip to avoid double events mouse + if (event.is_pointer_emulated()) + return Clutter.EVENT_STOP; + + let adjustment, delta; + + adjustment = this._scrollView[orientation[0] + 'scroll'].get_adjustment(); + + let increment = adjustment.step_increment; + + switch ( event.get_scroll_direction() ) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + delta = -increment; + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + delta = +increment; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + delta = dy*increment; + delta += dx*increment; + break; + + } + + adjustment.set_value(adjustment.get_value() + delta); + + return Clutter.EVENT_STOP; + + }, + + _onScrollSizeChange: function(adjustment) { + // Update minimization animation target position on scrollview change. + this._updateAppIcons(); + + // When applications are ungrouped and there is some empty space on the horizontal taskbar, + // force a fixed label width to prevent the icons from "wiggling" when an animation runs + // (adding or removing an icon). When the taskbar is full, revert to a dynamic label width + // to allow them to resize and make room for new icons. + if (!this.dtpPanel.checkIfVertical() && !this.isGroupApps) { + let initial = this.fullScrollView; + + if (!this.fullScrollView && Math.floor(adjustment.upper) > adjustment.page_size) { + this.fullScrollView = adjustment.page_size; + } else if (adjustment.page_size < this.fullScrollView) { + this.fullScrollView = 0; + } + + if (initial != this.fullScrollView) { + this._getAppIcons().forEach(a => a.updateTitleStyle()); + } + } + }, + + _onDragBegin: function() { + this._dragCancelled = false; + this._dragMonitor = { + dragMotion: Lang.bind(this, this._onDragMotion) + }; + DND.addDragMonitor(this._dragMonitor); + + if (this._box.get_n_children() == 0) { + this._emptyDropTarget = new Dash.EmptyDropTargetItem(); + this._box.insert_child_at_index(this._emptyDropTarget, 0); + this._emptyDropTarget.show(true); + } + + this._toggleFavortieHighlight(true); + }, + + _onDragCancelled: function() { + this._dragCancelled = true; + + if (this._dragInfo) { + this._box.set_child_at_index(this._dragInfo[1]._dashItemContainer, this._dragInfo[0]); + } + + this._endDrag(); + }, + + _onDragEnd: function() { + if (this._dragCancelled) + return; + + this._endDrag(); + }, + + _endDrag: function() { + if (this._dragInfo && this._dragInfo[1]._dashItemContainer instanceof DragPlaceholderItem) { + this._box.remove_child(this._dragInfo[1]._dashItemContainer); + this._dragInfo[1]._dashItemContainer.destroy(); + delete this._dragInfo[1]._dashItemContainer; + } + + this._dragInfo = null; + this._clearEmptyDropTarget(); + this._showAppsIcon.setDragApp(null); + DND.removeDragMonitor(this._dragMonitor); + + this._toggleFavortieHighlight(); + }, + + _onDragMotion: function(dragEvent) { + let app = Dash.getAppFromSource(dragEvent.source); + if (app == null) + return DND.DragMotionResult.CONTINUE; + + let showAppsHovered = this._showAppsIcon.contains(dragEvent.targetActor); + + if (showAppsHovered) + this._showAppsIcon.setDragApp(app); + else + this._showAppsIcon.setDragApp(null); + + return DND.DragMotionResult.CONTINUE; + }, + + _toggleFavortieHighlight: function(show) { + let appFavorites = AppFavorites.getAppFavorites(); + let cssFuncName = (show ? 'add' : 'remove') + '_style_class_name'; + + this._getAppIcons().filter(appIcon => appFavorites.isFavorite(appIcon.app.get_id())) + .forEach(fav => fav._container[cssFuncName]('favorite')); + }, + + handleIsolatedWorkspaceSwitch: function() { + this._shownInitially = this.isGroupApps; + this._queueRedisplay(); + }, + + _connectWorkspaceSignals: function() { + this._disconnectWorkspaceSignals(); + + this._lastWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + + this._workspaceWindowAddedId = this._lastWorkspace.connect('window-added', () => this._queueRedisplay()); + this._workspaceWindowRemovedId = this._lastWorkspace.connect('window-removed', () => this._queueRedisplay()); + }, + + _disconnectWorkspaceSignals: function() { + if (this._lastWorkspace) { + this._lastWorkspace.disconnect(this._workspaceWindowAddedId); + this._lastWorkspace.disconnect(this._workspaceWindowRemovedId); + + this._lastWorkspace = null; + } + }, + + _queueRedisplay: function () { + Main.queueDeferredWork(this._workId); + }, + + _hookUpLabel: function(item, syncHandler) { + item.child.connect('notify::hover', Lang.bind(this, function() { + this._syncLabel(item, syncHandler); + })); + + syncHandler.connect('sync-tooltip', Lang.bind(this, function() { + this._syncLabel(item, syncHandler); + })); + }, + + _createAppItem: function(app, window, isLauncher) { + let appIcon = new AppIcons.taskbarAppIcon( + { + app: app, + window: window, + isLauncher: isLauncher + }, + this.dtpPanel, + { + setSizeManually: true, + showLabel: false, + isDraggable: !Me.settings.get_boolean('taskbar-locked'), + }, + this.previewMenu, + this.iconAnimator + ); + + if (appIcon._draggable) { + appIcon._draggable.connect('drag-begin', + Lang.bind(this, function() { + appIcon.actor.opacity = 0; + appIcon.isDragged = 1; + this._dropIconAnimations(); + })); + appIcon._draggable.connect('drag-end', + Lang.bind(this, function() { + appIcon.actor.opacity = 255; + delete appIcon.isDragged; + this._updateAppIcons(); + })); + } + + appIcon.connect('menu-state-changed', + Lang.bind(this, function(appIcon, opened) { + this._itemMenuStateChanged(item, opened); + })); + + let item = new TaskbarItemContainer(); + + item._dtpPanel = this.dtpPanel + extendDashItemContainer(item); + + item.setChild(appIcon.actor); + appIcon._dashItemContainer = item; + + appIcon.actor.connect('notify::hover', Lang.bind(this, function() { + if (appIcon.actor.hover){ + this._ensureAppIconVisibilityTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, function(){ + Utils.ensureActorVisibleInScrollView(this._scrollView, appIcon.actor, this._scrollView._dtpFadeSize); + this._ensureAppIconVisibilityTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + + if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') + appIcon.actor.get_parent().raise(1); + else if (!appIcon.isDragged && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) + this._updateIconAnimations(); + } else { + if (this._ensureAppIconVisibilityTimeoutId>0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + + if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') + appIcon.actor.get_parent().raise(0); + } + })); + + appIcon.actor.connect('clicked', + Lang.bind(this, function(actor) { + Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); + })); + + appIcon.actor.connect('key-focus-in', Lang.bind(this, function(actor) { + let [x_shift, y_shift] = Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); + + // This signal is triggered also by mouse click. The popup menu is opened at the original + // coordinates. Thus correct for the shift which is going to be applied to the scrollview. + if (appIcon._menu) { + appIcon._menu._boxPointer.xOffset = -x_shift; + appIcon._menu._boxPointer.yOffset = -y_shift; + } + })); + + // Override default AppIcon label_actor, now the + // accessible_name is set at DashItemContainer.setLabelText + appIcon.actor.label_actor = null; + item.setLabelText(app.get_name()); + + appIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(item, appIcon); + + return item; + }, + + // Return an array with the "proper" appIcons currently in the taskbar + _getAppIcons: function() { + // Only consider children which are "proper" icons and which are not + // animating out (which means they will be destroyed at the end of + // the animation) + return this._getTaskbarIcons().map(function(actor){ + return actor.child._delegate; + }); + }, + + _getTaskbarIcons: function(includeAnimated) { + return this._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.icon && + (includeAnimated || !actor.animatingOut); + }); + }, + + _updateAppIcons: function() { + let appIcons = this._getAppIcons(); + + appIcons.filter(icon => icon.constructor === AppIcons.taskbarAppIcon).forEach(icon => { + icon.updateIcon(); + }); + }, + + _itemMenuStateChanged: function(item, opened) { + // When the menu closes, it calls sync_hover, which means + // that the notify::hover handler does everything we need to. + if (opened) { + if (this._showLabelTimeoutId > 0) { + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + } + + item.hideLabel(); + } else { + // I want to listen from outside when a menu is closed. I used to + // add a custom signal to the appIcon, since gnome 3.8 the signal + // calling this callback was added upstream. + this.emit('menu-closed'); + + // The icon menu grabs the events and, once it is closed, the pointer is maybe + // no longer over the taskbar and the animations are not dropped. + if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { + this._scrollView.sync_hover(); + if (!this._scrollView.hover) + this._dropIconAnimations(); + } + } + }, + + _syncLabel: function (item, syncHandler) { + let shouldShow = syncHandler ? syncHandler.shouldShowTooltip() : item.child.get_hover(); + + if (shouldShow) { + if (this._showLabelTimeoutId == 0) { + let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; + this._showLabelTimeoutId = Mainloop.timeout_add(timeout, + Lang.bind(this, function() { + this._labelShowing = true; + item.showLabel(); + this._showLabelTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel'); + if (this._resetHoverTimeoutId > 0) { + Mainloop.source_remove(this._resetHoverTimeoutId); + this._resetHoverTimeoutId = 0; + } + } + } else { + if (this._showLabelTimeoutId > 0) + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + item.hideLabel(); + if (this._labelShowing) { + this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT, + Lang.bind(this, function() { + this._labelShowing = false; + this._resetHoverTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing'); + } + } + }, + + _adjustIconSize: function() { + const thisMonitorIndex = this.dtpPanel.monitor.index; + let panelSize = PanelSettings.getPanelSize(Me.settings, thisMonitorIndex); + let availSize = panelSize - Me.settings.get_int('appicon-padding') * 2; + let minIconSize = MIN_ICON_SIZE + panelSize % 2; + + if (availSize == this.iconSize) + return; + + if (availSize < minIconSize) { + availSize = minIconSize; + } + + // For the icon size, we only consider children which are "proper" + // icons and which are not animating out (which means they will be + // destroyed at the end of the animation) + let iconChildren = this._getTaskbarIcons().concat([this._showAppsIcon]); + let scale = this.iconSize / availSize; + + this.iconSize = availSize; + + for (let i = 0; i < iconChildren.length; i++) { + let icon = iconChildren[i].child._delegate.icon; + + // Set the new size immediately, to keep the icons' sizes + // in sync with this.iconSize + icon.setIconSize(this.iconSize); + + // Don't animate the icon size change when the overview + // is transitioning, or when initially filling + // the taskbar + if (Main.overview.animationInProgress || + !this._shownInitially) + continue; + + let [targetWidth, targetHeight] = icon.icon.get_size(); + + // Scale the icon's texture to the previous size and + // tween to the new size + icon.icon.set_size(icon.icon.width * scale, icon.icon.height * scale); + + Utils.animate(icon.icon, + { width: targetWidth, + height: targetHeight, + time: DASH_ANIMATION_TIME, + transition: 'easeOutQuad', + }); + } + }, + + sortAppsCompareFunction: function(appA, appB) { + return getAppStableSequence(appA, this.dtpPanel.monitor) - + getAppStableSequence(appB, this.dtpPanel.monitor); + }, + + getAppInfos: function() { + //get the user's favorite apps + let favoriteApps = this._checkIfShowingFavorites() ? AppFavorites.getAppFavorites().getFavorites() : []; + + //find the apps that should be in the taskbar: the favorites first, then add the running apps + // When using isolation, we filter out apps that have no windows in + // the current workspace (this check is done in AppIcons.getInterestingWindows) + let runningApps = this._checkIfShowingRunningApps() ? this._getRunningApps().sort(this.sortAppsCompareFunction.bind(this)) : []; + + if (!this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers')) { + return this._createAppInfos(favoriteApps, [], true) + .concat(this._createAppInfos(runningApps) + .filter(appInfo => appInfo.windows.length)); + } else { + return this._createAppInfos(favoriteApps.concat(runningApps.filter(app => favoriteApps.indexOf(app) < 0))) + .filter(appInfo => appInfo.windows.length || favoriteApps.indexOf(appInfo.app) >= 0); + } + }, + + _redisplay: function () { + if (!this._signalsHandler) { + return; + } + + //get the currently displayed appIcons + let currentAppIcons = this._getTaskbarIcons(); + let expectedAppInfos = this.getAppInfos(); + + //remove the appIcons which are not in the expected apps list + for (let i = currentAppIcons.length - 1; i > -1; --i) { + let appIcon = currentAppIcons[i].child._delegate; + let appIndex = Utils.findIndex(expectedAppInfos, appInfo => appInfo.app == appIcon.app && + appInfo.isLauncher == appIcon.isLauncher); + + if (appIndex < 0 || + (appIcon.window && (this.isGroupApps || expectedAppInfos[appIndex].windows.indexOf(appIcon.window) < 0)) || + (!appIcon.window && !appIcon.isLauncher && + !this.isGroupApps && expectedAppInfos[appIndex].windows.length)) { + currentAppIcons[i][this._shownInitially ? 'animateOutAndDestroy' : 'destroy'](); + currentAppIcons.splice(i, 1); + } + } + + //if needed, reorder the existing appIcons and create the missing ones + let currentPosition = 0; + for (let i = 0, l = expectedAppInfos.length; i < l; ++i) { + let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? + [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : + expectedAppInfos[i].windows.map(window => ({ app: expectedAppInfos[i].app, window: window, isLauncher: false })); + + for (let j = 0, ll = neededAppIcons.length; j < ll; ++j) { + //check if the icon already exists + let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && + appIcon.child._delegate.window == neededAppIcons[j].window); + + if (matchingAppIconIndex > 0 && matchingAppIconIndex != currentPosition) { + //moved icon, reposition it + this._box.remove_child(currentAppIcons[matchingAppIconIndex]); + this._box.insert_child_at_index(currentAppIcons[matchingAppIconIndex], currentPosition); + } else if (matchingAppIconIndex < 0) { + //the icon doesn't exist yet, create a new one + let newAppIcon = this._createAppItem(neededAppIcons[j].app, neededAppIcons[j].window, neededAppIcons[j].isLauncher); + + this._box.insert_child_at_index(newAppIcon, currentPosition); + currentAppIcons.splice(currentPosition, 0, newAppIcon); + + // Skip animations on first run when adding the initial set + // of items, to avoid all items zooming in at once + newAppIcon.show(this._shownInitially); + } + + ++currentPosition; + } + } + + this._adjustIconSize(); + + // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 + // Without it, StBoxLayout may use a stale size cache + this._box.queue_relayout(); + + // This is required for icon reordering when the scrollview is used. + this._updateAppIcons(); + + // This will update the size, and the corresponding number for each icon on the primary panel + if (this.dtpPanel.isPrimary) { + this._updateNumberOverlay(); + } + + this._shownInitially = true; + }, + + _checkIfShowingRunningApps: function() { + return Me.settings.get_boolean('show-running-apps'); + }, + + _checkIfShowingFavorites: function() { + return Me.settings.get_boolean('show-favorites') && + (this.dtpPanel.isPrimary || Me.settings.get_boolean('show-favorites-all-monitors')); + }, + + _getRunningApps: function() { + let tracker = Shell.WindowTracker.get_default(); + let windows = global.get_window_actors(); + let apps = []; + + for (let i = 0, l = windows.length; i < l; ++i) { + let app = tracker.get_window_app(windows[i].metaWindow); + + if (app && apps.indexOf(app) < 0) { + apps.push(app); + } + } + + return apps; + }, + + _createAppInfos: function(apps, defaultWindows, defaultIsLauncher) { + return apps.map(app => ({ + app: app, + isLauncher: defaultIsLauncher || false, + windows: defaultWindows || AppIcons.getInterestingWindows(app, this.dtpPanel.monitor) + .sort(sortWindowsCompareFunction) + })); + }, + + // Reset the displayed apps icon to mantain the correct order + resetAppIcons : function(geometryChange) { + let children = this._getTaskbarIcons(true); + + for (let i = 0; i < children.length; i++) { + let item = children[i]; + item.destroy(); + } + + // to avoid ugly animations, just suppress them like when taskbar is first loaded. + this._shownInitially = false; + this._redisplay(); + + if (geometryChange && this.dtpPanel.checkIfVertical()) { + this.previewMenu._updateClip(); + } + }, + + _updateNumberOverlay: function() { + let seenApps = {}; + let counter = 0; + + this._getAppIcons().forEach(function(icon) { + if (!seenApps[icon.app]) { + seenApps[icon.app] = 1; + counter++; + } + + if (counter <= 10) { + icon.setNumberOverlay(counter == 10 ? 0 : counter); + } else { + // No overlay after 10 + icon.setNumberOverlay(-1); + } + + icon.updateHotkeyNumberOverlay(); + }); + + if (Me.settings.get_boolean('hot-keys') && + Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.toggleNumberOverlay(true); + }, + + toggleNumberOverlay: function(activate) { + let appIcons = this._getAppIcons(); + appIcons.forEach(function(icon) { + icon.toggleNumberOverlay(activate); + }); + }, + + _clearEmptyDropTarget: function() { + if (this._emptyDropTarget) { + this._emptyDropTarget.animateOutAndDestroy(); + this._emptyDropTarget = null; + } + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) + return DND.DragMotionResult.CONTINUE; + + // Don't allow favoriting of transient apps + if (source.app == null || source.app.is_window_backed()) + return DND.DragMotionResult.NO_DROP; + + if (!this._settings.is_writable('favorite-apps')) + return DND.DragMotionResult.NO_DROP; + + let sourceActor = source instanceof St.Widget ? source : source.actor; + let isVertical = this.dtpPanel.checkIfVertical(); + + if (!this._box.contains(sourceActor) && !source._dashItemContainer) { + //not an appIcon of the taskbar, probably from the applications view + source._dashItemContainer = new DragPlaceholderItem(source, this.iconSize, isVertical); + this._box.insert_child_above(source._dashItemContainer, null); + } + + let sizeProp = isVertical ? 'height' : 'width'; + let posProp = isVertical ? 'y' : 'x'; + let pos = isVertical ? y : x; + + let currentAppIcons = this._getAppIcons(); + let sourceIndex = currentAppIcons.indexOf(source); + let hoveredIndex = Utils.findIndex(currentAppIcons, + appIcon => pos >= appIcon._dashItemContainer[posProp] && + pos <= (appIcon._dashItemContainer[posProp] + appIcon._dashItemContainer[sizeProp])); + + if (!this._dragInfo) { + this._dragInfo = [sourceIndex, source]; + } + + if (hoveredIndex >= 0) { + let isLeft = pos < currentAppIcons[hoveredIndex]._dashItemContainer[posProp] + currentAppIcons[hoveredIndex]._dashItemContainer[sizeProp] * .5; + + // Don't allow positioning before or after self and between icons of same app + if (!(hoveredIndex === sourceIndex || + (isLeft && hoveredIndex - 1 == sourceIndex) || + (isLeft && hoveredIndex - 1 >= 0 && source.app != currentAppIcons[hoveredIndex - 1].app && + currentAppIcons[hoveredIndex - 1].app == currentAppIcons[hoveredIndex].app) || + (!isLeft && hoveredIndex + 1 == sourceIndex) || + (!isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != currentAppIcons[hoveredIndex + 1].app && + currentAppIcons[hoveredIndex + 1].app == currentAppIcons[hoveredIndex].app))) { + this._box.set_child_at_index(source._dashItemContainer, hoveredIndex); + + // Ensure the next and previous icon are visible when moving the icon + // (I assume there's room for both of them) + if (hoveredIndex > 1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex-1], this._scrollView._dtpFadeSize); + if (hoveredIndex < this._box.get_children().length-1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex+1], this._scrollView._dtpFadeSize); + } + } + + return this._dragInfo[0] !== sourceIndex ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.CONTINUE; + }, + + // Draggable target interface + acceptDrop : function(source, actor, x, y, time) { + // Don't allow favoriting of transient apps + if (!source.app || source.app.is_window_backed() || !this._settings.is_writable('favorite-apps')) { + return false; + } + + let appIcons = this._getAppIcons(); + let sourceIndex = appIcons.indexOf(source); + let usingLaunchers = !this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers'); + + // dragging the icon to its original position + if (this._dragInfo[0] === sourceIndex) { + return true; + } + + let appFavorites = AppFavorites.getAppFavorites(); + let sourceAppId = source.app.get_id(); + let appIsFavorite = appFavorites.isFavorite(sourceAppId); + let replacingIndex = sourceIndex + (sourceIndex > this._dragInfo[0] ? -1 : 1); + let favoriteIndex = replacingIndex >= 0 ? appFavorites.getFavorites().indexOf(appIcons[replacingIndex].app) : 0; + let sameApps = appIcons.filter(a => a != source && a.app == source.app); + let showingFavorites = this._checkIfShowingFavorites(); + let favoritesCount = 0; + let position = 0; + let interestingWindows = {}; + let getAppWindows = app => { + if (!interestingWindows[app]) { + interestingWindows[app] = AppIcons.getInterestingWindows(app, this.dtpPanel.monitor); + } + + let appWindows = interestingWindows[app]; //prevents "reference to undefined property Symbol.toPrimitive" warning + return appWindows; + }; + + if (sameApps.length && + ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && + (!appIcons[sourceIndex + 1] || appIcons[sourceIndex + 1].app !== source.app))) { + appIcons.splice(appIcons.indexOf(sameApps[0]), sameApps.length); + Array.prototype.splice.apply(appIcons, [sourceIndex + 1, 0].concat(sameApps)); + } + + for (let i = 0, l = appIcons.length; i < l; ++i) { + let windows = []; + + if (!usingLaunchers || (!source.isLauncher && !appIcons[i].isLauncher)) { + windows = appIcons[i].window ? [appIcons[i].window] : getAppWindows(appIcons[i].app); + } + + windows.forEach(w => w._dtpPosition = position++); + + if (showingFavorites && + ((usingLaunchers && appIcons[i].isLauncher) || + (!usingLaunchers && appFavorites.isFavorite(appIcons[i].app.get_id())))) { + ++favoritesCount; + } + } + + if (sourceIndex < favoritesCount) { + if (appIsFavorite) { + appFavorites.moveFavoriteToPos(sourceAppId, favoriteIndex); + } else { + appFavorites.addFavoriteAtPos(sourceAppId, favoriteIndex); + } + } else if (appIsFavorite && showingFavorites && (!usingLaunchers || source.isLauncher)) { + appFavorites.removeFavorite(sourceAppId); + } + + appFavorites.emit('changed'); + + return true; + }, + + _onShowAppsButtonToggled: function() { + // Sync the status of the default appButtons. Only if the two statuses are + // different, that means the user interacted with the extension provided + // application button, cutomize the behaviour. Otherwise the shell has changed the + // status (due to the _syncShowAppsButtonToggled function below) and it + // has already performed the desired action. + let selector = SearchController; + + if (selector._showAppsButton && + selector._showAppsButton.checked !== this.showAppsButton.checked) { + // find visible view + + if (this.showAppsButton.checked) { + if (Me.settings.get_boolean('show-apps-override-escape')) { + //override escape key to return to the desktop when entering the overview using the showapps button + SearchController._onStageKeyPress = function(actor, event) { + if (Main.modalCount == 1 && event.get_key_symbol() === Clutter.KEY_Escape) { + this._searchActive ? this.reset() : Main.overview.hide(); + + return Clutter.EVENT_STOP; + } + + return this.__proto__._onStageKeyPress.call(this, actor, event); + }; + } + + // force spring animation triggering.By default the animation only + // runs if we are already inside the overview. + if (!Main.overview._shown) { + this.forcedOverview = true; + let grid = AppDisplay._grid; + let onShownCb; + let overviewSignal = Config.PACKAGE_VERSION > '3.38.1' ? 'showing' : 'shown'; + let overviewShowingId = Main.overview.connect(overviewSignal, () => { + Main.overview.disconnect(overviewShowingId); + onShownCb(); + }); + + onShownCb = () => grid.emit('animation-done'); + } + + //temporarily use as primary the monitor on which the showapps btn was clicked, this is + //restored by the panel when exiting the overview + this.dtpPanel.panelManager.setFocusedMonitor(this.dtpPanel.monitor); + + let overviewHiddenId = Main.overview.connect('hidden', () => { + Main.overview.disconnect(overviewHiddenId); + delete SearchController._onStageKeyPress; + }); + + // Finally show the overview + selector._showAppsButton.checked = true; + Main.overview.show(2 /*APP_GRID*/); + } + else { + if (this.forcedOverview) { + // force exiting overview if needed + + Main.overview.hide(); + this.forcedOverview = false; + } + else { + selector._showAppsButton.checked = false; + this.forcedOverview = false; + } + } + } + }, + + _syncShowAppsButtonToggled: function() { + let status = SearchController._showAppsButton.checked; + if (this.showAppsButton.checked !== status) + this.showAppsButton.checked = status; + }, + + showShowAppsButton: function() { + this.showAppsButton.visible = true; + this.showAppsButton.set_width(-1); + this.showAppsButton.set_height(-1); + }, + + popupFocusedAppSecondaryMenu: function() { + let appIcons = this._getAppIcons(); + let tracker = Shell.WindowTracker.get_default(); + + for(let i in appIcons) { + if(appIcons[i].app == tracker.focus_app) { + let appIcon = appIcons[i]; + if(appIcon._menu && appIcon._menu.isOpen) + appIcon._menu.close(); + else + appIcon.popupMenu(); + + appIcon.sync_hover(); + break; + } + } + }, +}); + +Signals.addSignalMethods(taskbar.prototype); + +const CloneContainerConstraint = Utils.defineClass({ + Name: 'DashToPanel-CloneContainerConstraint', + Extends: Clutter.BindConstraint, + + vfunc_update_allocation: function(actor, actorBox) { + if (!this.source) + return; + + let [stageX, stageY] = this.source.get_transformed_position(); + let [width, height] = this.source.get_transformed_size(); + + actorBox.set_origin(stageX, stageY); + actorBox.set_size(width, height); + }, +}); + +var TaskbarItemContainer = Utils.defineClass({ + Name: 'DashToPanel-TaskbarItemContainer', + Extends: Dash.DashItemContainer, + + vfunc_allocate: function(box, flags) { + if (this.child == null) + return; + + Utils.setAllocation(this, box, flags); + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let [minChildWidth, minChildHeight, natChildWidth, natChildHeight] = this.child.get_preferred_size(); + let [childScaleX, childScaleY] = this.child.get_scale(); + + let childWidth = Math.min(natChildWidth * childScaleX, availWidth); + let childHeight = Math.min(natChildHeight * childScaleY, availHeight); + let childBox = new Clutter.ActorBox(); + + childBox.x1 = (availWidth - childWidth) / 2; + childBox.y1 = (availHeight - childHeight) / 2; + childBox.x2 = childBox.x1 + childWidth; + childBox.y2 = childBox.y1 + childHeight; + + Utils.allocate(this.child, childBox, flags); + }, + + // In case appIcon is removed from the taskbar while it is hovered, + // restore opacity before dashItemContainer.animateOutAndDestroy does the destroy animation. + animateOutAndDestroy: function() { + if (this._raisedClone) { + this._raisedClone.source.opacity = 255; + this._raisedClone.destroy(); + } + + this.callParent('animateOutAndDestroy'); + }, + + // For ItemShowLabel + _getIconAnimationOffset: function() { + if (!Me.settings.get_boolean('animate-appicon-hover')) + return 0; + + let travel = iconAnimationSettings.travel; + let zoom = iconAnimationSettings.zoom; + return this._dtpPanel.dtpSize * (travel + (zoom - 1) / 2); + }, + + _updateCloneContainerPosition: function(cloneContainer) { + let [stageX, stageY] = this.get_transformed_position(); + + if (Config.PACKAGE_VERSION >= '3.36') + cloneContainer.set_position(stageX - this.translation_x, stageY - this.translation_y); + else + cloneContainer.set_position(stageX, stageY); + }, + + _createRaisedClone: function() { + let [width, height] = this.get_transformed_size(); + + // "clone" of this child (appIcon actor) + let cloneButton = this.child._delegate.getCloneButton(); + + // "clone" of this (taskbarItemContainer) + let cloneContainer = new St.Bin({ + child: cloneButton, + width: width, height: height, + reactive: false, + }); + + this._updateCloneContainerPosition(cloneContainer); + + // For the stretch animation + if (Config.PACKAGE_VERSION >= '3.36') { + let boundProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; + this.bind_property(boundProperty, cloneContainer, boundProperty, GObject.BindingFlags.SYNC_CREATE); + } else { + let constraint = new CloneContainerConstraint({ source: this }); + cloneContainer.add_constraint(constraint); + } + + // The clone follows its source when the taskbar is scrolled. + let taskbarScrollView = this.get_parent().get_parent(); + let adjustment = this._dtpPanel.checkIfVertical() ? taskbarScrollView.vscroll.get_adjustment() : taskbarScrollView.hscroll.get_adjustment(); + let adjustmentChangedId = adjustment.connect('notify::value', () => this._updateCloneContainerPosition(cloneContainer)); + + // Update clone position when an item is added to / removed from the taskbar. + let taskbarBox = this.get_parent(); + let taskbarBoxAllocationChangedId = taskbarBox.connect('notify::allocation', () => this._updateCloneContainerPosition(cloneContainer)); + + // The clone itself + this._raisedClone = cloneButton.child; + this._raisedClone.connect('destroy', () => { + adjustment.disconnect(adjustmentChangedId); + taskbarBox.disconnect(taskbarBoxAllocationChangedId); + Mainloop.idle_add(() => cloneContainer.destroy()); + delete this._raisedClone; + }); + + this._raisedClone.source.opacity = 0; + Main.uiGroup.add_actor(cloneContainer); + }, + + // Animate the clone. + // AppIcon actors cannot go outside the taskbar so the animation is done with a clone. + // If level is zero, the clone is dropped and destroyed. + raise: function(level) { + if (this._raisedClone) + Utils.stopAnimations(this._raisedClone); + else if (level) + this._createRaisedClone(); + else + return; + + let panelPosition = this._dtpPanel.getPosition(); + let panelElementPositions = this._dtpPanel.panelManager.panelsElementPositions[this._dtpPanel.monitor.index] || Pos.defaults; + let taskbarPosition = panelElementPositions.filter(pos => pos.element == 'taskbar')[0].position; + + let vertical = panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT; + let translationDirection = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT ? 1 : -1; + let rotationDirection; + if (panelPosition == St.Side.LEFT || taskbarPosition == Pos.STACKED_TL) + rotationDirection = -1; + else if (panelPosition == St.Side.RIGHT || taskbarPosition == Pos.STACKED_BR) + rotationDirection = 1; + else { + let items = this.get_parent().get_children(); + let index = items.indexOf(this); + rotationDirection = (index - (items.length - 1) / 2) / ((items.length - 1) / 2); + } + + let duration = iconAnimationSettings.duration / 1000; + let rotation = iconAnimationSettings.rotation; + let travel = iconAnimationSettings.travel; + let zoom = iconAnimationSettings.zoom; + + // level is about 1 for the icon that is hovered, less for others. + // time depends on the translation to do. + let [width, height] = this._raisedClone.source.get_transformed_size(); + let translationMax = (vertical ? width : height) * (travel + (zoom - 1) / 2); + let translationEnd = translationMax * level; + let translationDone = vertical ? this._raisedClone.translation_x : this._raisedClone.translation_y; + let translationTodo = Math.abs(translationEnd - translationDone); + let scale = 1 + (zoom - 1) * level; + let rotationAngleZ = rotationDirection * rotation * level; + let time = duration * translationTodo / translationMax; + + let options = { + scale_x: scale, scale_y: scale, + rotation_angle_z: rotationAngleZ, + time: time, + transition: 'easeOutQuad', + onComplete: () => { + if (!level) { + this._raisedClone.source.opacity = 255; + this._raisedClone.destroy(); + delete this._raisedClone; + } + }, + }; + options[vertical ? 'translation_x' : 'translation_y'] = translationDirection * translationEnd; + + Utils.animate(this._raisedClone, options); + }, + + // Animate this and cloneContainer, since cloneContainer translation is bound to this. + stretch: function(translation) { + let duration = iconAnimationSettings.duration / 1000; + let zoom = iconAnimationSettings.zoom; + let animatedProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; + let isShowing = this.opacity != 255 || this.child.opacity != 255; + + if (isShowing) { + // Do no stop the animation initiated in DashItemContainer.show. + this[animatedProperty] = zoom * translation; + } else { + let options = { + time: duration, + transition: 'easeOutQuad', + }; + options[animatedProperty] = zoom * translation; + + Utils.stopAnimations(this); + Utils.animate(this, options); + } + }, +}); + +var DragPlaceholderItem = Utils.defineClass({ + Name: 'DashToPanel-DragPlaceholderItem', + Extends: St.Widget, + + _init: function(appIcon, iconSize, isVertical) { + this.callParent('_init', { style: AppIcons.getIconContainerStyle(isVertical), layout_manager: new Clutter.BinLayout() }); + + this.child = { _delegate: appIcon }; + + this._clone = new Clutter.Clone({ + source: appIcon.icon._iconBin, + width: iconSize, + height: iconSize + }); + + this.add_actor(this._clone); + }, + + destroy: function() { + this._clone.destroy(); + this.callParent('destroy'); + }, +}); + +function getAppStableSequence(app, monitor) { + let windows = AppIcons.getInterestingWindows(app, monitor); + + return windows.reduce((prevWindow, window) => { + return Math.min(prevWindow, getWindowStableSequence(window)); + }, Infinity); +} + +function sortWindowsCompareFunction(windowA, windowB) { + return getWindowStableSequence(windowA) - getWindowStableSequence(windowB); +} + +function getWindowStableSequence(window) { + return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js new file mode 100644 index 0000000..aa86d7a --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/transparency.js @@ -0,0 +1,269 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Clutter = imports.gi.Clutter; +const GdkPixbuf = imports.gi.GdkPixbuf; +const Lang = imports.lang; +const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const St = imports.gi.St; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +var DynamicTransparency = Utils.defineClass({ + Name: 'DashToPanel.DynamicTransparency', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this._proximityManager = dtpPanel.panelManager.proximityManager; + this._proximityWatchId = 0; + this._windowOverlap = false; + this.currentBackgroundColor = 0; + + this._initialPanelStyle = dtpPanel.panel.actor.get_style(); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._initialPanelCornerStyle = dtpPanel.panel._leftCorner.actor.get_style(); + } + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._bindSignals(); + + this._updateAnimationDuration(); + this._updateAllAndSet(); + this._updateProximityWatch(); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._proximityManager.removeWatch(this._proximityWatchId); + + this._dtpPanel.panel.actor.set_style(this._initialPanelStyle); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(this._initialPanelCornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(this._initialPanelCornerStyle); + } + }, + + updateExternalStyle: function() { + this._updateComplementaryStyles(); + this._setBackground(); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + Utils.getStageTheme(), + 'changed', + () => this._updateAllAndSet() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._updateAlphaAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-bg', + 'changed::trans-bg-color' + ], + () => this._updateColorAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-opacity', + 'changed::trans-panel-opacity', + 'changed::trans-bg-color', + 'changed::trans-dynamic-anim-target', + 'changed::trans-use-dynamic-opacity' + ], + () => this._updateAlphaAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-gradient', + 'changed::trans-gradient-top-color', + 'changed::trans-gradient-bottom-color', + 'changed::trans-gradient-top-opacity', + 'changed::trans-gradient-bottom-opacity' + ], + () => this._updateGradientAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-dynamic-behavior', + 'changed::trans-use-dynamic-opacity', + 'changed::trans-dynamic-distance' + ], + () => this._updateProximityWatch() + ], + [ + Me.settings, + 'changed::trans-dynamic-anim-time', + () => this._updateAnimationDuration() + ] + ); + }, + + _updateProximityWatch: function() { + this._proximityManager.removeWatch(this._proximityWatchId); + + if (Me.settings.get_boolean('trans-use-dynamic-opacity')) { + let isVertical = this._dtpPanel.checkIfVertical(); + let threshold = Me.settings.get_int('trans-dynamic-distance'); + + this._proximityWatchId = this._proximityManager.createWatch( + this._dtpPanel.panelBox.get_parent(), + Proximity.Mode[Me.settings.get_string('trans-dynamic-behavior')], + isVertical ? threshold : 0, + isVertical ? 0 : threshold, + overlap => { + this._windowOverlap = overlap; + this._updateAlphaAndSet(); + } + ); + } + }, + + _updateAnimationDuration: function() { + this.animationDuration = (Me.settings.get_int('trans-dynamic-anim-time') * 0.001) + 's;'; + }, + + _updateAllAndSet: function() { + let themeBackground = this._getThemeBackground(true); + + this._updateColor(themeBackground); + this._updateAlpha(themeBackground); + this._updateComplementaryStyles(); + this._updateGradient(); + this._setBackground(); + this._setGradient(); + }, + + _updateColorAndSet: function() { + this._updateColor(); + this._setBackground(); + }, + + _updateAlphaAndSet: function() { + this._updateAlpha(); + this._setBackground(); + }, + + _updateGradientAndSet: function() { + this._updateGradient(); + this._setGradient(); + }, + + _updateComplementaryStyles: function() { + let panelThemeNode = this._dtpPanel.panel.actor.get_theme_node(); + + this._complementaryStyles = 'border-radius: ' + panelThemeNode.get_border_radius(0) + 'px;'; + }, + + _updateColor: function(themeBackground) { + this.backgroundColorRgb = Me.settings.get_boolean('trans-use-custom-bg') ? + Me.settings.get_string('trans-bg-color') : + (themeBackground || this._getThemeBackground()); + }, + + _updateAlpha: function(themeBackground) { + if (this._windowOverlap && !Main.overview.visibleTarget && Me.settings.get_boolean('trans-use-dynamic-opacity')) { + this.alpha = Me.settings.get_double('trans-dynamic-anim-target'); + } else { + this.alpha = Me.settings.get_boolean('trans-use-custom-opacity') ? + Me.settings.get_double('trans-panel-opacity') : + (themeBackground || this._getThemeBackground()).alpha * 0.003921569; // 1 / 255 = 0.003921569 + } + }, + + _updateGradient: function() { + this._gradientStyle = ''; + + if (Me.settings.get_boolean('trans-use-custom-gradient')) { + this._gradientStyle += 'background-gradient-direction: ' + (this._dtpPanel.checkIfVertical() ? 'horizontal;' : 'vertical;') + + 'background-gradient-start: ' + Utils.getrgbaColor(Me.settings.get_string('trans-gradient-top-color'), + Me.settings.get_double('trans-gradient-top-opacity')) + + 'background-gradient-end: ' + Utils.getrgbaColor(Me.settings.get_string('trans-gradient-bottom-color'), + Me.settings.get_double('trans-gradient-bottom-opacity')); + } + }, + + _setBackground: function() { + this.currentBackgroundColor = Utils.getrgbaColor(this.backgroundColorRgb, this.alpha); + + let transition = 'transition-duration:' + this.animationDuration; + let cornerStyle = '-panel-corner-background-color: ' + this.currentBackgroundColor + transition; + + this._dtpPanel.set_style('background-color: ' + this.currentBackgroundColor + transition + this._complementaryStyles); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(cornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(cornerStyle); + } + }, + + _setGradient: function() { + this._dtpPanel.panel.actor.set_style( + 'background: none; ' + + 'border-image: none; ' + + 'background-image: none; ' + + this._gradientStyle + + 'transition-duration:' + this.animationDuration + ); + }, + + _getThemeBackground: function(reload) { + if (reload || !this._themeBackground) { + let fakePanel = new St.Bin({ name: 'panel' }); + Main.uiGroup.add_child(fakePanel); + let fakeTheme = fakePanel.get_theme_node() + this._themeBackground = this._getBackgroundImageColor(fakeTheme) || fakeTheme.get_background_color(); + Main.uiGroup.remove_child(fakePanel); + } + + return this._themeBackground; + }, + + _getBackgroundImageColor: function(theme) { + let bg = null; + + try { + let imageFile = theme.get_background_image() || theme.get_border_image().get_file(); + + if (imageFile) { + let imageBuf = GdkPixbuf.Pixbuf.new_from_file(imageFile.get_path()); + let pixels = imageBuf.get_pixels(); + + bg = { red: pixels[0], green: pixels[1], blue: pixels[2], alpha: pixels[3] }; + } + } catch (error) {} + + return bg; + } +}); \ No newline at end of file diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js new file mode 100644 index 0000000..d90d2cc --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/utils.js @@ -0,0 +1,1040 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Taskbar extension by Zorin OS + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const GdkPixbuf = imports.gi.GdkPixbuf; +const Gi = imports._gi; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const Util = imports.misc.util; + +var TRANSLATION_DOMAIN = imports.misc.extensionUtils.getCurrentExtension().metadata['gettext-domain']; +var SCROLL_TIME = Util.SCROLL_TIME / (Util.SCROLL_TIME > 1 ? 1000 : 1); + +//Clutter implicit animations are available since 3.34 +//prefer those over Tweener if available +if (Config.PACKAGE_VERSION < '3.34') { + var Tweener = imports.ui.tweener; +} + +var defineClass = function (classDef) { + let parentProto = classDef.Extends ? classDef.Extends.prototype : null; + + if (Config.PACKAGE_VERSION < '3.31.9') { + if (parentProto && (classDef.Extends.name || classDef.Extends.toString()).indexOf('DashToPanel.') < 0) { + classDef.callParent = function() { + let args = Array.prototype.slice.call(arguments); + let func = args.shift(); + + classDef.Extends.prototype[func].apply(this, args); + }; + } + + return new imports.lang.Class(classDef); + } + + let isGObject = parentProto instanceof GObject.Object; + let needsSuper = parentProto && !isGObject; + let getParentArgs = function(args) { + let parentArgs = []; + + (classDef.ParentConstrParams || parentArgs).forEach(p => { + if (p.constructor === Array) { + let param = args[p[0]]; + + parentArgs.push(p[1] ? param[p[1]] : param); + } else { + parentArgs.push(p); + } + }); + + return parentArgs; + }; + + let C = eval( + '(class C ' + (needsSuper ? 'extends Object' : '') + ' { ' + + ' constructor(...args) { ' + + (needsSuper ? 'super(...getParentArgs(args));' : '') + + (needsSuper || !parentProto ? 'this._init(...args);' : '') + + ' }' + + ' callParent(...args) { ' + + ' let func = args.shift(); ' + + ' if (!(func === \'_init\' && needsSuper))' + + ' super[func](...args); ' + + ' }' + + '})' + ); + + if (parentProto) { + Object.setPrototypeOf(C.prototype, parentProto); + Object.setPrototypeOf(C, classDef.Extends); + } + + Object.defineProperty(C, 'name', { value: classDef.Name }); + Object.keys(classDef) + .filter(k => classDef.hasOwnProperty(k) && classDef[k] instanceof Function) + .forEach(k => C.prototype[k] = classDef[k]); + + if (isGObject) { + C = GObject.registerClass({ Signals: classDef.Signals || {} }, C); + } + + return C; +}; + +// simplify global signals and function injections handling +// abstract class +var BasicHandler = defineClass({ + Name: 'DashToPanel.BasicHandler', + + _init: function(){ + this._storage = new Object(); + }, + + add: function(/*unlimited 3-long array arguments*/){ + + // convert arguments object to array, concatenate with generic + let args = [].concat('generic', [].slice.call(arguments)); + // call addWithLabel with ags as if they were passed arguments + this.addWithLabel.apply(this, args); + }, + + destroy: function() { + for( let label in this._storage ) + this.removeWithLabel(label); + }, + + addWithLabel: function( label /* plus unlimited 3-long array arguments*/) { + + if(this._storage[label] == undefined) + this._storage[label] = new Array(); + + // skip first element of the arguments + for( let i = 1; i < arguments.length; i++ ) { + let item = this._storage[label]; + let handlers = this._create(arguments[i]); + + for (let j = 0, l = handlers.length; j < l; ++j) { + item.push(handlers[j]); + } + } + + }, + + removeWithLabel: function(label){ + + if(this._storage[label]) { + for( let i = 0; i < this._storage[label].length; i++ ) { + this._remove(this._storage[label][i]); + } + + delete this._storage[label]; + } + }, + + /* Virtual methods to be implemented by subclass */ + // create single element to be stored in the storage structure + _create: function(item){ + throw new Error('no implementation of _create in ' + this); + }, + + // correctly delete single element + _remove: function(item){ + throw new Error('no implementation of _remove in ' + this); + } +}); + +// Manage global signals +var GlobalSignalsHandler = defineClass({ + Name: 'DashToPanel.GlobalSignalsHandler', + Extends: BasicHandler, + + _create: function(item) { + let handlers = []; + + item[1] = [].concat(item[1]); + + for (let i = 0, l = item[1].length; i < l; ++i) { + let object = item[0]; + let event = item[1][i]; + let callback = item[2] + try { + let id = object.connect(event, callback); + + handlers.push([object, id]); + } catch (e) + { + + } + } + + return handlers; + }, + + _remove: function(item){ + item[0].disconnect(item[1]); + } +}); + +/** + * Manage function injection: both instances and prototype can be overridden + * and restored + */ +var InjectionsHandler = defineClass({ + Name: 'DashToPanel.InjectionsHandler', + Extends: BasicHandler, + + _create: function(item) { + let object = item[0]; + let name = item[1]; + let injectedFunction = item[2]; + let original = object[name]; + + object[name] = injectedFunction; + return [[object, name, injectedFunction, original]]; + }, + + _remove: function(item) { + let object = item[0]; + let name = item[1]; + let original = item[3]; + object[name] = original; + } +}); + +/** + * Manage timeouts: the added timeouts have their id reset on completion + */ +var TimeoutsHandler = defineClass({ + Name: 'DashToPanel.TimeoutsHandler', + Extends: BasicHandler, + + _create: function(item) { + let name = item[0]; + let delay = item[1]; + let timeoutHandler = item[2]; + + this._remove(item); + + this[name] = Mainloop.timeout_add(delay, () => { + this[name] = 0; + timeoutHandler(); + }); + + return [[name]]; + }, + + remove: function(name) { + this._remove([name]) + }, + + _remove: function(item) { + let name = item[0]; + + if (this[name]) { + Mainloop.source_remove(this[name]); + this[name] = 0; + } + }, + + getId: function(name) { + return this[name] ? this[name] : 0; + } +}); + +// This is wrapper to maintain compatibility with GNOME-Shell 3.30+ as well as +// previous versions. +var DisplayWrapper = { + getScreen: function() { + return global.screen || global.display; + }, + + getWorkspaceManager: function() { + return global.screen || global.workspace_manager; + }, + + getMonitorManager: function() { + return global.screen || Meta.MonitorManager.get(); + } +}; + +var getCurrentWorkspace = function() { + return DisplayWrapper.getWorkspaceManager().get_active_workspace(); +}; + +var getWorkspaceByIndex = function(index) { + return DisplayWrapper.getWorkspaceManager().get_workspace_by_index(index); +}; + +var getWorkspaceCount = function() { + return DisplayWrapper.getWorkspaceManager().n_workspaces; +}; + +var getStageTheme = function() { + return St.ThemeContext.get_for_stage(global.stage); +}; + +var getScaleFactor = function() { + return getStageTheme().scale_factor || 1; +}; + +var getAppDisplayViews = function() { + //gnome-shell 3.38 only has one view and it is now the appDisplay + return imports.ui.appDisplay._views || [{ view: imports.ui.appDisplay }]; +}; + +var findIndex = function(array, predicate) { + if (Array.prototype.findIndex) { + return array.findIndex(predicate); + } + + for (let i = 0, l = array.length; i < l; ++i) { + if (predicate(array[i])) { + return i; + } + } + + return -1; +}; + +var find = function(array, predicate) { + let index = findIndex(array, predicate); + + if (index > -1) { + return array[index]; + } +}; + +var mergeObjects = function(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +var hookVfunc = function(proto, symbol, func) { + if (Gi.hook_up_vfunc_symbol && func) { + //gjs > 1.53.3 + proto[Gi.hook_up_vfunc_symbol](symbol, func); + } else { + //On older gjs, this is how to hook vfunc. It is buggy and can't be used reliably to replace + //already hooked functions. Since it's our only use for it, disabled for now (and probably forever) + //Gi.hook_up_vfunc(proto, symbol, func); + } +}; + +var wrapActor = function(actor) { + if (actor) { + Object.defineProperty(actor, 'actor', { + value: actor instanceof Clutter.Actor ? actor : actor.actor + }); + } +}; + +var getTransformedAllocation = function(actor) { + if (Config.PACKAGE_VERSION < '3.37') { + return Shell.util_get_transformed_allocation(actor); + } + + let extents = actor.get_transformed_extents(); + let topLeft = extents.get_top_left(); + let bottomRight = extents.get_bottom_right(); + + return { x1: topLeft.x, x2: bottomRight.x, y1: topLeft.y, y2: bottomRight.y }; +}; + +var allocate = function(actor, box, flags, useParent) { + let allocateObj = useParent ? actor.__proto__ : actor; + + allocateObj.allocate.apply(actor, getAllocationParams(box, flags)); +}; + +var setAllocation = function(actor, box, flags) { + actor.set_allocation.apply(actor, getAllocationParams(box, flags)); +}; + +var getAllocationParams = function(box, flags) { + let params = [box]; + + if (Config.PACKAGE_VERSION < '3.37') { + params.push(flags); + } + + return params; +}; + +var setClip = function(actor, x, y, width, height) { + actor.set_clip(0, 0, width, height); + actor.set_position(x, y); + actor.set_size(width, height); +}; + +var addKeybinding = function(key, settings, handler, modes) { + if (!Main.wm._allowedKeybindings[key]) { + Main.wm.addKeybinding( + key, + settings, + Meta.KeyBindingFlags.NONE, + modes || (Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW), + handler + ); + } +}; + +var removeKeybinding = function(key) { + if (Main.wm._allowedKeybindings[key]) { + Main.wm.removeKeybinding(key); + } +}; + +var getrgbColor = function(color) { + color = typeof color === 'string' ? Clutter.color_from_string(color)[1] : color; + + return { red: color.red, green: color.green, blue: color.blue }; +}; + +var getrgbaColor = function(color, alpha, offset) { + if (alpha <= 0) { + return 'transparent; '; + } + + let rgb = getrgbColor(color); + + if (offset) { + ['red', 'green', 'blue'].forEach(k => { + rgb[k] = Math.min(255, Math.max(0, rgb[k] + offset)); + + if (rgb[k] == color[k]) { + rgb[k] = Math.min(255, Math.max(0, rgb[k] - offset)); + } + }); + } + + return 'rgba(' + rgb.red + ',' + rgb.green + ',' + rgb.blue + ',' + (Math.floor(alpha * 100) * 0.01) + '); ' ; +}; + +var checkIfColorIsBright = function(color) { + let rgb = getrgbColor(color); + let brightness = 0.2126 * rgb.red + 0.7152 * rgb.green + 0.0722 * rgb.blue; + + return brightness > 128; +}; + +var getMouseScrollDirection = function(event) { + let direction; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + direction = 'up'; + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + direction = 'down'; + break; + } + + return direction; +}; + +var checkIfWindowHasTransient = function(window) { + let hasTransient; + + window.foreach_transient(t => !(hasTransient = true)); + + return hasTransient; +}; + +var activateSiblingWindow = function(windows, direction, startWindow) { + let windowIndex = windows.indexOf(global.display.focus_window); + let nextWindowIndex = windowIndex < 0 ? + startWindow ? windows.indexOf(startWindow) : 0 : + windowIndex + (direction == 'up' ? 1 : -1); + + if (nextWindowIndex == windows.length) { + nextWindowIndex = 0; + } else if (nextWindowIndex < 0) { + nextWindowIndex = windows.length - 1; + } + + if (windowIndex != nextWindowIndex) { + Main.activateWindow(windows[nextWindowIndex]); + } +}; + +var animateWindowOpacity = function(window, tweenOpts) { + //there currently is a mutter bug with the windowactor opacity, starting with 3.34 + //https://gitlab.gnome.org/GNOME/mutter/issues/836 + + if (Config.PACKAGE_VERSION > '3.35') { + //on 3.36, a workaround is to use the windowactor's child for the fade animation + //this leaves a "shadow" on the desktop, so the windowactor needs to be hidden + //when the animation is complete + let visible = tweenOpts.opacity > 0; + let windowActor = window; + + window = windowActor.get_first_child() || windowActor; + + if (!windowActor.visible && visible) { + window.opacity = 0; + windowActor.visible = visible; + } + + if (!visible) { + let initialOpacity = window.opacity; + + tweenOpts.onComplete = () => { + windowActor.visible = visible; + window.opacity = initialOpacity; + }; + } + } else if (Config.PACKAGE_VERSION > '3.33') { + //the workaround only works on 3.35+, so on 3.34, let's just hide the + //window without animation + return window.visible = (tweenOpts.opacity == 255); + } + + animate(window, tweenOpts); +}; + +var animate = function(actor, options) { + if (Tweener) { + return Tweener.addTween(actor, options); + } + + //to support both Tweener and Clutter animations, we use Tweener "time" + //and "delay" properties defined in seconds, as opposed to Clutter animations + //"duration" and "delay" which are defined in milliseconds + if (options.delay) { + options.delay = options.delay * 1000; + } + + options.duration = options.time * 1000; + delete options.time; + + if (options.transition) { + //map Tweener easing equations to Clutter animation modes + options.mode = { + 'easeInCubic': Clutter.AnimationMode.EASE_IN_CUBIC, + 'easeInOutCubic': Clutter.AnimationMode.EASE_IN_OUT_CUBIC, + 'easeInOutQuad': Clutter.AnimationMode.EASE_IN_OUT_QUAD, + 'easeOutQuad': Clutter.AnimationMode.EASE_OUT_QUAD + }[options.transition] || Clutter.AnimationMode.LINEAR; + + delete options.transition; + } + + let params = [options]; + + if ('value' in options && actor instanceof St.Adjustment) { + params.unshift(options.value); + delete options.value; + } + + actor.ease.apply(actor, params); +} + +var isAnimating = function(actor, prop) { + if (Tweener) { + return Tweener.isTweening(actor); + } + + return !!actor.get_transition(prop); +} + +var stopAnimations = function(actor) { + if (Tweener) { + return Tweener.removeTweens(actor); + } + + actor.remove_all_transitions(); +} + +var getIndicators = function(delegate) { + if (delegate instanceof St.BoxLayout) { + return delegate; + } + + return delegate.indicators; +} + +var getPoint = function(coords) { + if (Config.PACKAGE_VERSION > '3.35.1') { + return new imports.gi.Graphene.Point(coords); + } + + return new Clutter.Point(coords); +} + +var getPanelGhost = function() { + if (!Main.overview._panelGhost) { + return Main.overview._overview.get_first_child(); + } + + return Main.overview._panelGhost; +} + +var notify = function(text, iconName, action, isTransient) { + let source = new MessageTray.SystemNotificationSource(); + let notification = new MessageTray.Notification(source, 'Dash to Panel', text); + let notifyFunc = source.showNotification || source.notify; + + if (iconName) { + source.createIcon = function() { + return new St.Icon({ icon_name: iconName }); + }; + } + + if (action) { + if (!(action instanceof Array)) { + action = [action]; + } + + action.forEach(a => notification.addAction(a.text, a.func)); + } + + Main.messageTray.add(source); + + notification.setTransient(isTransient); + notifyFunc.call(source, notification); +}; + +/* + * This is a copy of the same function in utils.js, but also adjust horizontal scrolling + * and perform few further cheks on the current value to avoid changing the values when + * it would be clamp to the current one in any case. + * Return the amount of shift applied +*/ +var ensureActorVisibleInScrollView = function(scrollView, actor, fadeSize, onComplete) { + let vadjustment = scrollView.vscroll.adjustment; + let hadjustment = scrollView.hscroll.adjustment; + let [vvalue, vlower, vupper, vstepIncrement, vpageIncrement, vpageSize] = vadjustment.get_values(); + let [hvalue, hlower, hupper, hstepIncrement, hpageIncrement, hpageSize] = hadjustment.get_values(); + + let [hvalue0, vvalue0] = [hvalue, vvalue]; + + let voffset = fadeSize; + let hoffset = fadeSize; + + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2, x1 = box.x1, x2 = box.x2; + + let parent = actor.get_parent(); + while (parent != scrollView) { + if (!parent) + throw new Error("actor not in scroll view"); + + let box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + x1 += box.x1; + x2 += box.x1; + parent = parent.get_parent(); + } + + if (y1 < vvalue + voffset) + vvalue = Math.max(0, y1 - voffset); + else if (vvalue < vupper - vpageSize && y2 > vvalue + vpageSize - voffset) + vvalue = Math.min(vupper -vpageSize, y2 + voffset - vpageSize); + + if (x1 < hvalue + hoffset) + hvalue = Math.max(0, x1 - hoffset); + else if (hvalue < hupper - hpageSize && x2 > hvalue + hpageSize - hoffset) + hvalue = Math.min(hupper - hpageSize, x2 + hoffset - hpageSize); + + let tweenOpts = { + time: SCROLL_TIME, + onComplete: onComplete || (() => {}), + transition: 'easeOutQuad' + }; + + if (vvalue !== vvalue0) { + animate(vadjustment, mergeObjects(tweenOpts, { value: vvalue })); + } + + if (hvalue !== hvalue0) { + animate(hadjustment, mergeObjects(tweenOpts, { value: hvalue })); + } + + return [hvalue- hvalue0, vvalue - vvalue0]; +} + +/** + * ColorUtils is adapted from https://github.com/micheleg/dash-to-dock + */ +var ColorUtils = { + colorLuminance: function(r, g, b, dlum) { + // Darken or brighten color by a fraction dlum + // Each rgb value is modified by the same fraction. + // Return "#rrggbb" strin + + let rgbString = '#'; + + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2); + + return rgbString; + }, + + _decimalToHex: function(d, padding) { + // Convert decimal to an hexadecimal string adding the desired padding + + let hex = d.toString(16); + while (hex.length < padding) + hex = '0'+ hex; + return hex; + }, + + HSVtoRGB: function(h, s, v) { + // Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (h,s,v) independently or {h:h, s:s, v:v} object. + // Return {r:r, g:g, b:b} object. + + if (arguments.length === 1) { + s = h.s; + v = h.v; + h = h.h; + } + + let r,g,b; + let c = v*s; + let h1 = h*6; + let x = c*(1 - Math.abs(h1 % 2 - 1)); + let m = v - c; + + if (h1 <=1) + r = c + m, g = x + m, b = m; + else if (h1 <=2) + r = x + m, g = c + m, b = m; + else if (h1 <=3) + r = m, g = c + m, b = x + m; + else if (h1 <=4) + r = m, g = x + m, b = c + m; + else if (h1 <=5) + r = x + m, g = m, b = c + m; + else + r = c + m, g = m, b = x + m; + + return { + r: Math.round(r * 255), + g: Math.round(g * 255), + b: Math.round(b * 255) + }; + }, + + RGBtoHSV: function(r, g, b) { + // Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (r,g,b) independently or {r:r, g:g, b:b} object. + // Return {h:h, s:s, v:v} object. + + if (arguments.length === 1) { + r = r.r; + g = r.g; + b = r.b; + } + + let h,s,v; + + let M = Math.max(r, g, b); + let m = Math.min(r, g, b); + let c = M - m; + + if (c == 0) + h = 0; + else if (M == r) + h = ((g-b)/c) % 6; + else if (M == g) + h = (b-r)/c + 2; + else + h = (r-g)/c + 4; + + h = h/6; + v = M/255; + if (M !== 0) + s = c/M; + else + s = 0; + + return {h: h, s: s, v: v}; + } +}; + +/** + * DominantColorExtractor is adapted from https://github.com/micheleg/dash-to-dock + */ +let themeLoader = null; +let iconCacheMap = new Map(); +const MAX_CACHED_ITEMS = 1000; +const BATCH_SIZE_TO_DELETE = 50; +const DOMINANT_COLOR_ICON_SIZE = 64; + +var DominantColorExtractor = defineClass({ + Name: 'DashToPanel.DominantColorExtractor', + + _init: function(app){ + this._app = app; + }, + + /** + * Try to get the pixel buffer for the current icon, if not fail gracefully + */ + _getIconPixBuf: function() { + let iconTexture = this._app.create_icon_texture(16); + + if (themeLoader === null) { + let ifaceSettings = new Gio.Settings({ schema: "org.gnome.desktop.interface" }); + + themeLoader = new Gtk.IconTheme(), + themeLoader.set_custom_theme(ifaceSettings.get_string('icon-theme')); // Make sure the correct theme is loaded + } + + // Unable to load the icon texture, use fallback + if (iconTexture instanceof St.Icon === false) { + return null; + } + + iconTexture = iconTexture.get_gicon(); + + // Unable to load the icon texture, use fallback + if (iconTexture === null) { + return null; + } + + if (iconTexture instanceof Gio.FileIcon) { + // Use GdkPixBuf to load the pixel buffer from the provided file path + return GdkPixbuf.Pixbuf.new_from_file(iconTexture.get_file().get_path()); + } + + // Get the pixel buffer from the icon theme + let icon_info = themeLoader.lookup_icon(iconTexture.get_names()[0], DOMINANT_COLOR_ICON_SIZE, 0); + if (icon_info !== null) + return icon_info.load_icon(); + else + return null; + }, + + /** + * The backlight color choosing algorithm was mostly ported to javascript from the + * Unity7 C++ source of Canonicals: + * https://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/launcher/LauncherIcon.cpp + * so it more or less works the same way. + */ + _getColorPalette: function() { + if (iconCacheMap.get(this._app.get_id())) { + // We already know the answer + return iconCacheMap.get(this._app.get_id()); + } + + let pixBuf = this._getIconPixBuf(); + if (pixBuf == null) + return null; + + let pixels = pixBuf.get_pixels(), + offset = 0; + + let total = 0, + rTotal = 0, + gTotal = 0, + bTotal = 0; + + let resample_y = 1, + resample_x = 1; + + // Resampling of large icons + // We resample icons larger than twice the desired size, as the resampling + // to a size s + // DOMINANT_COLOR_ICON_SIZE < s < 2*DOMINANT_COLOR_ICON_SIZE, + // most of the case exactly DOMINANT_COLOR_ICON_SIZE as the icon size is tipycally + // a multiple of it. + let width = pixBuf.get_width(); + let height = pixBuf.get_height(); + + // Resample + if (height >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_y = Math.floor(height/DOMINANT_COLOR_ICON_SIZE); + + if (width >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_x = Math.floor(width/DOMINANT_COLOR_ICON_SIZE); + + if (resample_x !==1 || resample_y !== 1) + pixels = this._resamplePixels(pixels, resample_x, resample_y); + + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length; + for (let offset = 0; offset < limit; offset+=4) { + let r = pixels[offset], + g = pixels[offset + 1], + b = pixels[offset + 2], + a = pixels[offset + 3]; + + let saturation = (Math.max(r,g, b) - Math.min(r,g, b)); + let relevance = 0.1 * 255 * 255 + 0.9 * a * saturation; + + rTotal += r * relevance; + gTotal += g * relevance; + bTotal += b * relevance; + + total += relevance; + } + + total = total * 255; + + let r = rTotal / total, + g = gTotal / total, + b = bTotal / total; + + let hsv = ColorUtils.RGBtoHSV(r * 255, g * 255, b * 255); + + if (hsv.s > 0.15) + hsv.s = 0.65; + hsv.v = 0.90; + + let rgb = ColorUtils.HSVtoRGB(hsv.h, hsv.s, hsv.v); + + // Cache the result. + let backgroundColor = { + lighter: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0.2), + original: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0), + darker: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, -0.5) + }; + + if (iconCacheMap.size >= MAX_CACHED_ITEMS) { + //delete oldest cached values (which are in order of insertions) + let ctr=0; + for (let key of iconCacheMap.keys()) { + if (++ctr > BATCH_SIZE_TO_DELETE) + break; + iconCacheMap.delete(key); + } + } + + iconCacheMap.set(this._app.get_id(), backgroundColor); + + return backgroundColor; + }, + + /** + * Downsample large icons before scanning for the backlight color to + * improve performance. + * + * @param pixBuf + * @param pixels + * @param resampleX + * @param resampleY + * + * @return []; + */ + _resamplePixels: function (pixels, resampleX, resampleY) { + let resampledPixels = []; + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length / (resampleX * resampleY) / 4; + for (let i = 0; i < limit; i++) { + let pixel = i * resampleX * resampleY; + + resampledPixels.push(pixels[pixel * 4]); + resampledPixels.push(pixels[pixel * 4 + 1]); + resampledPixels.push(pixels[pixel * 4 + 2]); + resampledPixels.push(pixels[pixel * 4 + 3]); + } + + return resampledPixels; + } + +}); + +var drawRoundedLine = function(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) { + if (height > width) { + y += Math.floor((height - width) / 2.0); + height = width; + } + + height = 2.0 * Math.floor(height / 2.0); + + var leftRadius = isRoundLeft ? height / 2.0 : 0.0; + var rightRadius = isRoundRight ? height / 2.0 : 0.0; + + cr.moveTo(x + width - rightRadius, y); + cr.lineTo(x + leftRadius, y); + if (isRoundLeft) + cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2); + else + cr.lineTo(x, y + height); + cr.lineTo(x + width - rightRadius, y + height); + if (isRoundRight) + cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2); + else + cr.lineTo(x + width, y); + cr.closePath(); + + if (fill != null) { + cr.setSource(fill); + cr.fillPreserve(); + } + if (stroke != null) + cr.setSource(stroke); + cr.stroke(); +} + +/** + * Check if an app exists in the system. + */ +var checkedCommandsMap = new Map(); + +function checkIfCommandExists(app) { + let answer = checkedCommandsMap.get(app); + if (answer === undefined) { + // Command is a shell built in, use shell to call it. + // Quotes around app value are important. They let command operate + // on the whole value, instead of having shell interpret it. + let cmd = "sh -c 'command -v \"" + app + "\"'"; + try { + let out = GLib.spawn_command_line_sync(cmd); + // out contains 1: stdout, 2: stderr, 3: exit code + answer = out[3] == 0; + } catch (ex) { + answer = false; + } + + checkedCommandsMap.set(app, answer); + } + return answer; +} diff --git a/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js new file mode 100644 index 0000000..45d08a0 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/dash-to-panel@jderose9.github.com/windowPreview.js @@ -0,0 +1,1145 @@ +/* + * This file is part of the Dash-To-Panel extension for Gnome 3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const Meta = imports.gi.Meta; +const PopupMenu = imports.ui.popupMenu; +const Signals = imports.signals; +const St = imports.gi.St; +const WindowManager = imports.ui.windowManager; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +//timeout intervals +const ENSURE_VISIBLE_MS = 200; + +//timeout names +const T1 = 'openMenuTimeout'; +const T2 = 'closeMenuTimeout'; +const T3 = 'peekTimeout'; +const T4 = 'ensureVisibleTimeout'; + +const MAX_TRANSLATION = 40; +const HEADER_HEIGHT = 38; +const MAX_CLOSE_BUTTON_SIZE = 30; +const MIN_DIMENSION = 100; +const FOCUSED_COLOR_OFFSET = 24; +const HEADER_COLOR_OFFSET = -12; +const FADE_SIZE = 36; +const PEEK_INDEX_PROP = '_dtpPeekInitialIndex'; + +let headerHeight = 0; +let alphaBg = 0; +let isLeftButtons = false; +let isTopHeader = true; +let isManualStyling = false; +let scaleFactor = 1; +let animationTime = 0; +let aspectRatio = {}; + +var PreviewMenu = Utils.defineClass({ + Name: 'DashToPanel-PreviewMenu', + Extends: St.Widget, + Signals: { 'open-state-changed': {} }, + + _init: function(panel) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); + + let geom = panel.geom; + this.panel = panel; + this.currentAppIcon = null; + this._focusedPreview = null; + this._peekedWindow = null; + this.peekInitialWorkspaceIndex = -1; + this.opened = false; + this.isVertical = geom.position == St.Side.LEFT || geom.position == St.Side.RIGHT; + this._translationProp = 'translation_' + (this.isVertical ? 'x' : 'y'); + this._translationDirection = (geom.position == St.Side.TOP || geom.position == St.Side.LEFT ? -1 : 1); + this._translationOffset = Math.min(panel.dtpSize, MAX_TRANSLATION) * this._translationDirection; + + this.menu = new St.Widget({ + name: 'preview-menu', + layout_manager: new Clutter.BinLayout(), + reactive: true, + track_hover: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign[geom.position != St.Side.RIGHT ? 'START' : 'END'], + y_align: Clutter.ActorAlign[geom.position != St.Side.BOTTOM ? 'START' : 'END'] + }); + this._box = new St.BoxLayout({ vertical: this.isVertical }); + this._scrollView = new St.ScrollView({ + name: 'dashtopanelPreviewScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: true, + y_expand: !this.isVertical + }); + + this._scrollView.add_actor(this._box); + this.menu.add_child(this._scrollView); + this.add_child(this.menu); + }, + + enable: function() { + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + Main.layoutManager.addChrome(this, { affectsInputRegion: false }); + Main.layoutManager.trackChrome(this.menu, { affectsInputRegion: true }); + + this._resetHiddenState(); + this._refreshGlobals(); + this._updateClip(); + this.menu.set_position(1, 1); + + this._signalsHandler.add( + [ + this.menu, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._scrollView, + 'scroll-event', + this._onScrollEvent.bind(this) + ], + [ + this.panel.panelBox, + 'style-changed', + () => this._updateClip() + ], + [ + Utils.DisplayWrapper.getScreen(), + 'in-fullscreen-changed', + () => { + if (global.display.focus_window && global.display.focus_window.is_fullscreen()) { + this.close(true); + } + } + ], + [ + Me.settings, + [ + 'changed::panel-sizes', + 'changed::window-preview-size', + 'changed::window-preview-padding', + 'changed::window-preview-show-title' + ], + () => { + this._refreshGlobals(); + this._updateClip(); + } + ] + ); + }, + + disable: function() { + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + + this.close(true); + + Main.layoutManager.untrackChrome(this.menu); + Main.layoutManager.removeChrome(this); + }, + + requestOpen: function(appIcon) { + let timeout = Me.settings.get_int('show-window-previews-timeout'); + + if (this.opened) { + timeout = Math.min(100, timeout); + } + + this._endOpenCloseTimeouts(); + this._timeoutsHandler.add([T1, timeout, () => this.open(appIcon)]); + }, + + requestClose: function() { + this._endOpenCloseTimeouts(); + this._addCloseTimeout(); + }, + + open: function(appIcon) { + if (this.currentAppIcon != appIcon) { + this.currentAppIcon = appIcon; + + if (!this.opened) { + this._refreshGlobals(); + + this.set_height(this.clipHeight); + this.menu.show(); + + setStyle(this.menu, 'background: ' + Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, alphaBg)); + } + + this._mergeWindows(appIcon); + this._updatePosition(); + this._animateOpenOrClose(true); + + this._setReactive(true); + this._setOpenedState(true); + } + }, + + close: function(immediate) { + this._endOpenCloseTimeouts(); + this._removeFocus(); + this._endPeek(); + + if (immediate) { + Utils.stopAnimations(this.menu); + this._resetHiddenState(); + } else { + this._animateOpenOrClose(false, () => this._resetHiddenState()); + } + + this._setReactive(false); + this.currentAppIcon = null; + }, + + update: function(appIcon, windows) { + if (this.currentAppIcon == appIcon) { + if (windows && !windows.length) { + this.close(); + } else { + this._addAndRemoveWindows(windows); + this._updatePosition(); + } + } + }, + + updatePosition: function() { + this._updatePosition(); + }, + + focusNext: function() { + let previews = this._box.get_children(); + let currentIndex = this._focusedPreview ? previews.indexOf(this._focusedPreview) : -1; + let nextIndex = currentIndex + 1; + + nextIndex = previews[nextIndex] ? nextIndex : 0; + + if (previews[nextIndex]) { + this._removeFocus(); + previews[nextIndex].setFocus(true); + this._focusedPreview = previews[nextIndex]; + } + + return nextIndex; + }, + + activateFocused: function() { + if (this.opened && this._focusedPreview) { + this._focusedPreview.activate(); + } + }, + + requestPeek: function(window) { + this._timeoutsHandler.remove(T3); + + if (Me.settings.get_boolean('peek-mode')) { + if (this.peekInitialWorkspaceIndex < 0) { + this._timeoutsHandler.add([T3, Me.settings.get_int('enter-peek-mode-timeout'), () => this._peek(window)]); + } else { + this._peek(window); + } + } + }, + + endPeekHere: function() { + this._endPeek(true); + }, + + ensureVisible: function(preview) { + let [ , upper, pageSize] = this._getScrollAdjustmentValues(); + + if (upper > pageSize) { + this._timeoutsHandler.add([ + T4, + ENSURE_VISIBLE_MS, + () => Utils.ensureActorVisibleInScrollView(this._scrollView, preview, MIN_DIMENSION, () => this._updateScrollFade()) + ]); + } + }, + + getCurrentAppIcon: function() { + return this.currentAppIcon; + }, + + _setReactive: function(reactive) {  + this._box.get_children().forEach(c => c.reactive = reactive); + this.menu.reactive = reactive; + }, + + _setOpenedState: function(opened) { + this.opened = opened; + this.emit('open-state-changed'); + }, + + _resetHiddenState: function() { + this.menu.hide(); + this.set_height(0); + this._setOpenedState(false); + this.menu.opacity = 0; + this.menu[this._translationProp] = this._translationOffset; + this._box.get_children().forEach(c => c.destroy()); + }, + + _removeFocus: function() { + if (this._focusedPreview) { + this._focusedPreview.setFocus(false); + this._focusedPreview = null; + } + }, + + _mergeWindows: function(appIcon, windows) { + windows = windows || (appIcon.window ? [appIcon.window] : appIcon.getAppIconInterestingWindows()); + windows.sort(Taskbar.sortWindowsCompareFunction); + + let currentPreviews = this._box.get_children(); + let l = Math.max(windows.length, currentPreviews.length); + + for (let i = 0; i < l; ++i) { + if (currentPreviews[i] && windows[i]) { + currentPreviews[i].assignWindow(windows[i], this.opened); + } else if (!currentPreviews[i]) { + this._addNewPreview(windows[i]); + } else if (!windows[i]) { + currentPreviews[i][!this.opened ? 'destroy' : 'animateOut'](); + } + } + }, + + _addAndRemoveWindows: function(windows) { + let currentPreviews = this._box.get_children(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + + for (let i = 0, l = windows.length; i < l; ++i) { + let currentIndex = Utils.findIndex(currentPreviews, c => c.window == windows[i]); + + if (currentIndex < 0) { + this._addNewPreview(windows[i]); + } else { + currentPreviews[currentIndex].assignWindow(windows[i]); + currentPreviews.splice(currentIndex, 1); + + if (this._peekedWindow && this._peekedWindow == windows[i]) { + this.requestPeek(windows[i]); + } + } + } + + currentPreviews.forEach(c => c.animateOut()); + }, + + _addNewPreview: function(window) { + let preview = new Preview(this); + + this._box.add_child(preview); + preview.adjustOnStage(); + preview.assignWindow(window, this.opened); + }, + + _addCloseTimeout: function() { + this._timeoutsHandler.add([T2, Me.settings.get_int('leave-timeout'), () => this.close()]); + }, + + _onHoverChanged: function() { + this._endOpenCloseTimeouts(); + + if (this.currentAppIcon && !this.menu.hover) { + this._addCloseTimeout(); + this._endPeek(); + } + }, + + _onScrollEvent: function(actor, event) { + if (!event.is_pointer_emulated()) { + let vOrh = this.isVertical ? 'v' : 'h'; + let adjustment = this._scrollView['get_' + vOrh + 'scroll_bar']().get_adjustment(); + let increment = adjustment.step_increment; + let delta = increment; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + delta = -increment; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + delta = dy * increment; + delta += dx * increment; + break; + } + + adjustment.set_value(adjustment.get_value() + delta); + this._updateScrollFade(); + } + + return Clutter.EVENT_STOP; + }, + + _endOpenCloseTimeouts: function() { + this._timeoutsHandler.remove(T1); + this._timeoutsHandler.remove(T2); + this._timeoutsHandler.remove(T4); + }, + + _refreshGlobals: function() { + isLeftButtons = Meta.prefs_get_button_layout().left_buttons.indexOf(Meta.ButtonFunction.CLOSE) >= 0; + isTopHeader = Me.settings.get_string('window-preview-title-position') == 'TOP'; + isManualStyling = Me.settings.get_boolean('window-preview-manual-styling'); + scaleFactor = Utils.getScaleFactor(); + headerHeight = Me.settings.get_boolean('window-preview-show-title') ? HEADER_HEIGHT * scaleFactor : 0; + animationTime = Me.settings.get_int('window-preview-animation-time') * .001; + aspectRatio.x = { + size: Me.settings.get_int('window-preview-aspect-ratio-x'), + fixed: Me.settings.get_boolean('window-preview-fixed-x') + }; + aspectRatio.y = { + size: Me.settings.get_int('window-preview-aspect-ratio-y'), + fixed: Me.settings.get_boolean('window-preview-fixed-y') + }; + + alphaBg = Me.settings.get_boolean('preview-use-custom-opacity') ? + Me.settings.get_int('preview-custom-opacity') * .01 : + this.panel.dynamicTransparency.alpha; + }, + + _updateClip: function() { + let x, y, w; + let geom = this.panel.getGeometry(); + let panelBoxTheme = this.panel.panelBox.get_theme_node(); + let previewSize = (Me.settings.get_int('window-preview-size') + + Me.settings.get_int('window-preview-padding') * 2) * scaleFactor; + + if (this.isVertical) { + w = previewSize; + this.clipHeight = this.panel.monitor.height; + y = this.panel.monitor.y; + } else { + w = this.panel.monitor.width; + this.clipHeight = (previewSize + headerHeight); + x = this.panel.monitor.x; + } + + if (geom.position == St.Side.LEFT) { + x = this.panel.monitor.x + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.LEFT); + } else if (geom.position == St.Side.RIGHT) { + x = this.panel.monitor.x + this.panel.monitor.width - (this.panel.dtpSize + previewSize) - panelBoxTheme.get_padding(St.Side.RIGHT); + } else if (geom.position == St.Side.TOP) { + y = this.panel.monitor.y + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.TOP); + } else { //St.Side.BOTTOM + y = this.panel.monitor.y + this.panel.monitor.height - (this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.BOTTOM) + previewSize + headerHeight); + } + + Utils.setClip(this, x, y, w, this.clipHeight); + }, + + _updatePosition: function() { + let sourceNode = this.currentAppIcon.actor.get_theme_node(); + let sourceContentBox = sourceNode.get_content_box(this.currentAppIcon.actor.get_allocation_box()); + let sourceAllocation = Utils.getTransformedAllocation(this.currentAppIcon.actor); + let [previewsWidth, previewsHeight] = this._getPreviewsSize(); + let appIconMargin = Me.settings.get_int('appicon-margin') / scaleFactor; + let x = 0, y = 0; + + previewsWidth = Math.min(previewsWidth, this.panel.monitor.width); + previewsHeight = Math.min(previewsHeight, this.panel.monitor.height); + this._updateScrollFade(previewsWidth < this.panel.monitor.width && previewsHeight < this.panel.monitor.height); + + if (this.isVertical) { + y = sourceAllocation.y1 + appIconMargin - this.panel.monitor.y + (sourceContentBox.y2 - sourceContentBox.y1 - previewsHeight) * .5; + y = Math.max(y, 0); + y = Math.min(y, this.panel.monitor.height - previewsHeight); + } else { + x = sourceAllocation.x1 + appIconMargin - this.panel.monitor.x + (sourceContentBox.x2 - sourceContentBox.x1 - previewsWidth) * .5; + x = Math.max(x, 0); + x = Math.min(x, this.panel.monitor.width - previewsWidth); + } + + if (!this.opened) { + this.menu.set_position(x, y); + this.menu.set_size(previewsWidth, previewsHeight); + } else { + Utils.animate(this.menu, getTweenOpts({ x: x, y: y, width: previewsWidth, height: previewsHeight })); + } + }, + + _updateScrollFade: function(remove) { + let [value, upper, pageSize] = this._getScrollAdjustmentValues(); + let needsFade = Math.round(upper) > Math.round(pageSize); + let fadeWidgets = this.menu.get_children().filter(c => c != this._scrollView); + + if (!remove && needsFade) { + if (!fadeWidgets.length) { + fadeWidgets.push(this._getFadeWidget()); + fadeWidgets.push(this._getFadeWidget(true)); + + this.menu.add_child(fadeWidgets[0]); + this.menu.add_child(fadeWidgets[1]); + } + + fadeWidgets[0].visible = value > 0; + fadeWidgets[1].visible = value + pageSize < upper; + } else if (remove || (!needsFade && fadeWidgets.length)) { + fadeWidgets.forEach(fw => fw.destroy()); + } + }, + + _getScrollAdjustmentValues: function() { + let [value , , upper, , , pageSize] = this._scrollView[(this.isVertical ? 'v' : 'h') + 'scroll'].adjustment.get_values(); + + return [value, upper, pageSize]; + }, + + _getFadeWidget: function(end) { + let x = 0, y = 0; + let startBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, Math.min(alphaBg + .1, 1)); + let endBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, 0) + let fadeStyle = 'background-gradient-start:' + startBg + + 'background-gradient-end:' + endBg + + 'background-gradient-direction:' + this.panel.getOrientation(); + + if (this.isVertical) { + y = end ? this.panel.monitor.height - FADE_SIZE : 0; + } else { + x = end ? this.panel.monitor.width - FADE_SIZE : 0; + } + + let fadeWidget = new St.Widget({ + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: end ? 180 : 0, + style: fadeStyle, + x: x, y: y, + width: this.isVertical ? this.width : FADE_SIZE, + height: this.isVertical ? FADE_SIZE : this.height + }); + + return fadeWidget; + }, + + _getPreviewsSize: function() { + let previewsWidth = 0; + let previewsHeight = 0; + + this._box.get_children().forEach(c => { + if (!c.animatingOut) { + let [width, height] = c.getSize(); + + if (this.isVertical) { + previewsWidth = Math.max(width, previewsWidth); + previewsHeight += height; + } else { + previewsWidth += width; + previewsHeight = Math.max(height, previewsHeight); + } + } + }); + + return [previewsWidth, previewsHeight]; + }, + + _animateOpenOrClose: function(show, onComplete) { + let isTranslationAnimation = this.menu[this._translationProp] != 0; + let tweenOpts = { + opacity: show ? 255 : 0, + transition: show ? 'easeInOutQuad' : 'easeInCubic', + onComplete: () => { + if (isTranslationAnimation) { + Main.layoutManager._queueUpdateRegions(); + } + + (onComplete || (() => {}))(); + } + }; + + tweenOpts[this._translationProp] = show ? this._translationDirection : this._translationOffset; + + Utils.animate(this.menu, getTweenOpts(tweenOpts)); + }, + + _peek: function(window) { + let currentWorkspace = Utils.getCurrentWorkspace(); + let windowWorkspace = window.get_workspace(); + let focusWindow = () => this._focusMetaWindow(Me.settings.get_int('peek-mode-opacity'), window); + + this._restorePeekedWindowStack(); + this._peekedWindow = window; + + if (currentWorkspace != windowWorkspace) { + this._switchToWorkspaceImmediate(windowWorkspace.index()); + this._timeoutsHandler.add([T3, 100, focusWindow]); + } else { + focusWindow(); + } + + if (this.peekInitialWorkspaceIndex < 0) { + this.peekInitialWorkspaceIndex = currentWorkspace.index(); + } + }, + + _endPeek: function(stayHere) { + this._timeoutsHandler.remove(T3); + + if (this._peekedWindow) { + let immediate = !stayHere && this.peekInitialWorkspaceIndex != Utils.getCurrentWorkspace().index(); + + this._restorePeekedWindowStack(); + this._focusMetaWindow(255, this._peekedWindow, immediate, true); + this._peekedWindow = null; + + if (!stayHere) { + this._switchToWorkspaceImmediate(this.peekInitialWorkspaceIndex); + } + + this.peekInitialWorkspaceIndex = -1; + } + }, + + _switchToWorkspaceImmediate: function(workspaceIndex) { + let workspace = Utils.getWorkspaceByIndex(workspaceIndex); + let shouldAnimate = Main.wm._shouldAnimate; + + if (!workspace || (!workspace.list_windows().length && + workspaceIndex < Utils.getWorkspaceCount() - 1)) { + workspace = Utils.getCurrentWorkspace(); + } + + Main.wm._shouldAnimate = () => false; + workspace.activate(global.display.get_current_time_roundtrip()); + Main.wm._shouldAnimate = shouldAnimate; + }, + + _focusMetaWindow: function(dimOpacity, window, immediate, ignoreFocus) { + window.get_workspace().list_windows().forEach(mw => { + let wa = mw.get_compositor_private(); + let isFocused = !ignoreFocus && mw == window; + + if (wa) { + if (isFocused) { + mw[PEEK_INDEX_PROP] = wa.get_parent().get_children().indexOf(wa); + wa.get_parent().set_child_above_sibling(wa, null); + } + + if (isFocused && mw.minimized) { + wa.show(); + } + + if (!mw.minimized) { + let tweenOpts = getTweenOpts({ opacity: isFocused ? 255 : dimOpacity }); + + if (immediate && !mw.is_on_all_workspaces()) { + tweenOpts.time = 0; + } + + Utils.animateWindowOpacity(wa, tweenOpts); + } + } + }); + }, + + _restorePeekedWindowStack: function() { + let windowActor = this._peekedWindow ? this._peekedWindow.get_compositor_private() : null; + + if (windowActor) { + if (this._peekedWindow.hasOwnProperty(PEEK_INDEX_PROP)) { + windowActor.get_parent().set_child_at_index(windowActor, this._peekedWindow[PEEK_INDEX_PROP]); + delete this._peekedWindow[PEEK_INDEX_PROP]; + } + + if (this._peekedWindow.minimized) { + windowActor.hide(); + } + } + }, +}); + +var Preview = Utils.defineClass({ + Name: 'DashToPanel-Preview', + Extends: St.Widget, + + _init: function(previewMenu) { + this.callParent('_init', { + style_class: 'preview-container', + reactive: true, + track_hover: true, + layout_manager: new Clutter.BinLayout() + }); + + this.window = null; + this._waitWindowId = 0; + this._needsCloseButton = true; + this.cloneWidth = this.cloneHeight = 0; + this._previewMenu = previewMenu; + this._padding = Me.settings.get_int('window-preview-padding') * scaleFactor; + this._previewDimensions = this._getPreviewDimensions(); + this.animatingOut = false; + + let box = new St.Widget({ layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL }), y_expand: true }); + let [previewBinWidth, previewBinHeight] = this._getBinSize(); + let closeButton = new St.Button({ style_class: 'window-close', accessible_name: 'Close window' }); + + if (Config.PACKAGE_VERSION >= '3.31.9') { + closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); + } + + this._closeButtonBin = new St.Widget({ + style_class: 'preview-close-btn-container', + layout_manager: new Clutter.BinLayout(), + opacity: 0, + x_expand: true, y_expand: true, + x_align: Clutter.ActorAlign[isLeftButtons ? 'START' : 'END'], + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + + this._closeButtonBin.add_child(closeButton); + + this._previewBin = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + style: 'padding: ' + this._padding / scaleFactor + 'px;' + }); + + this._previewBin.set_size(previewBinWidth, previewBinHeight); + + box.add_child(this._previewBin); + + if (headerHeight) { + let headerBox = new St.Widget({ + style_class: 'preview-header-box', + layout_manager: new Clutter.BoxLayout(), + x_expand: true, + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + + setStyle(headerBox, this._getBackgroundColor(HEADER_COLOR_OFFSET, 1)); + this._workspaceIndicator = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); + this._windowTitle = new St.Label({ y_align: Clutter.ActorAlign.CENTER, x_expand: true }); + + this._iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._iconBin.set_size(headerHeight, headerHeight); + + headerBox.add_child(this._iconBin); + headerBox.insert_child_at_index(this._workspaceIndicator, isLeftButtons ? 0 : 1); + headerBox.insert_child_at_index(this._windowTitle, isLeftButtons ? 1 : 2); + + box.insert_child_at_index(headerBox, isTopHeader ? 0 : 1); + } + + this.add_child(box); + this.add_child(this._closeButtonBin); + + closeButton.connect('clicked', () => this._onCloseBtnClick()); + this.connect('notify::hover', () => this._onHoverChanged()); + this.connect('button-release-event', (actor, e) => this._onButtonReleaseEvent(e)); + this.connect('destroy', () => this._onDestroy()); + }, + + adjustOnStage: function() { + let closeButton = this._closeButtonBin.get_first_child(); + let closeButtonHeight = closeButton.height; + let maxCloseButtonSize = MAX_CLOSE_BUTTON_SIZE * scaleFactor; + let closeButtonBorderRadius = ''; + + if (closeButtonHeight > maxCloseButtonSize) { + closeButtonHeight = maxCloseButtonSize; + closeButton.set_size(closeButtonHeight, closeButtonHeight); + } + + if (!headerHeight) { + closeButtonBorderRadius = 'border-radius: '; + + if (isTopHeader) { + closeButtonBorderRadius += (isLeftButtons ? '0 0 4px 0;' : '0 0 0 4px;'); + } else { + closeButtonBorderRadius += (isLeftButtons ? '0 4px 0 0;' : '4px 0 0 0;'); + } + } + + setStyle( + this._closeButtonBin, + 'padding: ' + (headerHeight ? Math.round((headerHeight - closeButtonHeight) * .5 / scaleFactor) : 4) + 'px;' + + this._getBackgroundColor(HEADER_COLOR_OFFSET, headerHeight ? 1 : .6) + + closeButtonBorderRadius + ); + }, + + assignWindow: function(window, animateSize) { + if (this.window != window) { + let _assignWindowClone = () => { + if (window.get_compositor_private()) { + let cloneBin = this._getWindowCloneBin(window); + + this._resizeClone(cloneBin, window); + this._addClone(cloneBin, animateSize); + this._previewMenu.updatePosition(); + } else if (!this._waitWindowId) { + this._waitWindowId = Mainloop.idle_add(() => { + this._waitWindowId = 0; + + if (this._previewMenu.opened) { + _assignWindowClone(); + } + }); + } + }; + + _assignWindowClone(); + } + + this._cancelAnimateOut(); + this._removeWindowSignals(); + this.window = window; + this._needsCloseButton = window.can_close() && !Utils.checkIfWindowHasTransient(window); + this._updateHeader(); + }, + + animateOut: function() { + if (!this.animatingOut) { + let tweenOpts = getTweenOpts({ opacity: 0, width: 0, height: 0, onComplete: () => this.destroy() }); + + this.animatingOut = true; + + Utils.stopAnimations(this); + Utils.animate(this, tweenOpts); + } + }, + + getSize: function() { + let [binWidth, binHeight] = this._getBinSize(); + + binWidth = Math.max(binWidth, this.cloneWidth + this._padding * 2); + binHeight = Math.max(binHeight, this.cloneHeight + this._padding * 2) + headerHeight; + + return [binWidth, binHeight]; + }, + + setFocus: function(focused) { + this._hideOrShowCloseButton(!focused); + setStyle(this, this._getBackgroundColor(FOCUSED_COLOR_OFFSET, focused ? '-' : 0)); + + if (focused) { + this._previewMenu.ensureVisible(this); + this._previewMenu.requestPeek(this.window); + } + }, + + activate: function() { + this._previewMenu.endPeekHere(); + this._previewMenu.close(); + Main.activateWindow(this.window); + }, + + _onDestroy: function() { + if (this._waitWindowId) { + GLib.source_remove(this._waitWindowId); + this._waitWindowId = 0; + } + + this._removeWindowSignals(); + }, + + _onHoverChanged: function() { + this.setFocus(this.hover); + }, + + _onCloseBtnClick: function() { + this._hideOrShowCloseButton(true); + this.reactive = false; + + if (!Me.settings.get_boolean('group-apps')) { + this._previewMenu.close(); + } else { + this._previewMenu.endPeekHere(); + } + + this.window.delete(global.get_current_time()); + }, + + _onButtonReleaseEvent: function(e) { + switch (e.get_button()) { + case 1: // Left click + this.activate(); + break; + case 2: // Middle click + if (Me.settings.get_boolean('preview-middle-click-close')) { + this._onCloseBtnClick(); + } + break; + case 3: // Right click + this._showContextMenu(e); + break; + } + + return Clutter.EVENT_STOP; + }, + + _cancelAnimateOut: function() { + if (this.animatingOut) { + this.animatingOut = false; + + Utils.stopAnimations(this); + Utils.animate(this, getTweenOpts({ opacity: 255, width: this.cloneWidth, height: this.cloneHeight })); + } + }, + + _showContextMenu: function(e) { + let coords = e.get_coords(); + let currentWorkspace = this._previewMenu.peekInitialWorkspaceIndex < 0 ? + Utils.getCurrentWorkspace() : + Utils.getWorkspaceByIndex(this._previewMenu.peekInitialWorkspaceIndex); + + Main.wm._showWindowMenu(null, this.window, Meta.WindowMenuType.WM, { + x: coords[0], + y: coords[1], + width: 0, + height: 0 + }); + + let ctxMenuData = Main.wm._windowMenuManager._manager._menus[0]; + + ctxMenuData.menu.connect('open-state-changed', () => this._previewMenu.menu.sync_hover()); + + if (this.window.get_workspace() != currentWorkspace) { + let menuItem = new PopupMenu.PopupMenuItem(_('Move to current Workspace') + ' [' + (currentWorkspace.index() + 1) + ']'); + let menuItems = ctxMenuData.menu.box.get_children(); + let insertIndex = Utils.findIndex(menuItems, c => c._delegate instanceof PopupMenu.PopupSeparatorMenuItem); + + insertIndex = insertIndex >= 0 ? insertIndex : menuItems.length - 1; + ctxMenuData.menu.addMenuItem(menuItem, insertIndex); + menuItem.connect('activate', () => this.window.change_workspace(currentWorkspace)); + } + }, + + _removeWindowSignals: function() { + if (this._titleWindowChangeId) { + this.window.disconnect(this._titleWindowChangeId); + this._titleWindowChangeId = 0; + } + }, + + _updateHeader: function() { + if (headerHeight) { + let iconTextureSize = Me.settings.get_boolean('window-preview-use-custom-icon-size') ? + Me.settings.get_int('window-preview-custom-icon-size') : + headerHeight / scaleFactor * .6; + let icon = this._previewMenu.getCurrentAppIcon().app.create_icon_texture(iconTextureSize); + let workspaceIndex = ''; + let workspaceStyle = null; + let fontScale = Me.desktopSettings.get_double('text-scaling-factor'); + let commonTitleStyles = 'color: ' + Me.settings.get_string('window-preview-title-font-color') + ';' + + 'font-size: ' + Me.settings.get_int('window-preview-title-font-size') * fontScale + 'px;' + + 'font-weight: ' + Me.settings.get_string('window-preview-title-font-weight') + ';'; + + this._iconBin.destroy_all_children(); + this._iconBin.add_child(icon); + + if (!Me.settings.get_boolean('isolate-workspaces')) { + workspaceIndex = (this.window.get_workspace().index() + 1).toString(); + workspaceStyle = 'margin: 0 4px 0 ' + (isLeftButtons ? Math.round((headerHeight - icon.width) * .5) + 'px' : '0') + '; padding: 0 4px;' + + 'border: 2px solid ' + this._getRgbaColor(FOCUSED_COLOR_OFFSET, .8) + 'border-radius: 2px;' + commonTitleStyles; + } + + this._workspaceIndicator.text = workspaceIndex; + setStyle(this._workspaceIndicator, workspaceStyle); + + this._titleWindowChangeId = this.window.connect('notify::title', () => this._updateWindowTitle()); + setStyle(this._windowTitle, 'max-width: 0px; padding-right: 4px;' + commonTitleStyles); + this._updateWindowTitle(); + } + }, + + _updateWindowTitle: function() { + this._windowTitle.text = this.window.title; + }, + + _hideOrShowCloseButton: function(hide) { + if (this._needsCloseButton) { + Utils.animate(this._closeButtonBin, getTweenOpts({ opacity: hide ? 0 : 255 })); + } + }, + + _getBackgroundColor: function(offset, alpha) { + return 'background-color: ' + this._getRgbaColor(offset, alpha) + + 'transition-duration:' + this._previewMenu.panel.dynamicTransparency.animationDuration; + }, + + _getRgbaColor: function(offset, alpha) { + alpha = Math.abs(alpha); + + if (isNaN(alpha)) { + alpha = alphaBg; + } + + return Utils.getrgbaColor(this._previewMenu.panel.dynamicTransparency.backgroundColorRgb, alpha, offset); + }, + + _addClone: function(newCloneBin, animateSize) { + let currentClones = this._previewBin.get_children(); + let newCloneOpts = getTweenOpts({ opacity: 255 }); + + this._previewBin.add_child(newCloneBin); + + if (currentClones.length) { + let currentCloneBin = currentClones.pop(); + let currentCloneOpts = getTweenOpts({ opacity: 0, onComplete: () => currentCloneBin.destroy() }); + + if (newCloneBin.width > currentCloneBin.width) { + newCloneOpts.width = newCloneBin.width; + newCloneBin.width = currentCloneBin.width; + } else { + currentCloneOpts.width = newCloneBin.width; + } + + if (newCloneBin.height > currentCloneBin.height) { + newCloneOpts.height = newCloneBin.height; + newCloneBin.height = currentCloneBin.height; + } else { + currentCloneOpts.height = newCloneBin.height; + } + + currentClones.forEach(c => c.destroy()); + Utils.animate(currentCloneBin, currentCloneOpts); + } else if (animateSize) { + newCloneBin.width = 0; + newCloneBin.height = 0; + newCloneOpts.width = this.cloneWidth; + newCloneOpts.height = this.cloneHeight; + } + + Utils.animate(newCloneBin, newCloneOpts); + }, + + _getWindowCloneBin: function(window) { + let frameRect = window.get_frame_rect(); + let bufferRect = window.get_buffer_rect(); + let clone = new Clutter.Clone({ source: window.get_compositor_private() }); + let cloneBin = new St.Widget({ + opacity: 0, + layout_manager: frameRect.width != bufferRect.width || + frameRect.height != bufferRect.height ? + new WindowCloneLayout(frameRect, bufferRect) : + new Clutter.BinLayout() + }); + + cloneBin.add_child(clone); + + return cloneBin; + }, + + _getBinSize: function() { + let [fixedWidth, fixedHeight] = this._previewDimensions; + + return [ + aspectRatio.x.fixed ? fixedWidth + this._padding * 2 : -1, + aspectRatio.y.fixed ? fixedHeight + this._padding * 2 : -1 + ]; + }, + + _resizeClone: function(cloneBin, window) { + let frameRect = cloneBin.layout_manager.frameRect || window.get_frame_rect(); + let [fixedWidth, fixedHeight] = this._previewDimensions; + let ratio = Math.min(fixedWidth / frameRect.width, fixedHeight / frameRect.height, 1); + let cloneWidth = frameRect.width * ratio; + let cloneHeight = frameRect.height * ratio; + + let clonePaddingTB = cloneHeight < MIN_DIMENSION ? MIN_DIMENSION - cloneHeight : 0; + let clonePaddingLR = cloneWidth < MIN_DIMENSION ? MIN_DIMENSION - cloneWidth : 0; + let clonePaddingTop = clonePaddingTB * .5; + let clonePaddingLeft = clonePaddingLR * .5; + + this.cloneWidth = cloneWidth + clonePaddingLR * scaleFactor; + this.cloneHeight = cloneHeight + clonePaddingTB * scaleFactor; + + cloneBin.set_style('padding: ' + clonePaddingTop + 'px ' + clonePaddingLeft + 'px;'); + cloneBin.layout_manager.ratio = ratio; + cloneBin.layout_manager.padding = [clonePaddingLeft * scaleFactor, clonePaddingTop * scaleFactor]; + + cloneBin.get_first_child().set_size(cloneWidth, cloneHeight); + }, + + _getPreviewDimensions: function() { + let size = Me.settings.get_int('window-preview-size') * scaleFactor; + let w, h; + + if (this._previewMenu.isVertical) { + w = size; + h = w * aspectRatio.y.size / aspectRatio.x.size; + } else { + h = size; + w = h * aspectRatio.x.size / aspectRatio.y.size; + } + + return [w, h]; + } +}); + +var WindowCloneLayout = Utils.defineClass({ + Name: 'DashToPanel-WindowCloneLayout', + Extends: Clutter.BinLayout, + + _init: function(frameRect, bufferRect) { + this.callParent('_init'); + + //the buffer_rect contains the transparent padding that must be removed + this.frameRect = frameRect; + this.bufferRect = bufferRect; + }, + + vfunc_allocate: function(actor, box, flags) { + let [width, height] = box.get_size(); + + box.set_origin( + (this.bufferRect.x - this.frameRect.x) * this.ratio + this.padding[0], + (this.bufferRect.y - this.frameRect.y) * this.ratio + this.padding[1] + ); + + box.set_size( + width + (this.bufferRect.width - this.frameRect.width) * this.ratio, + height + (this.bufferRect.height - this.frameRect.height) * this.ratio + ); + + Utils.allocate(actor.get_first_child(), box, flags); + } +}); + +function setStyle(actor, style) { + if (!isManualStyling) { + actor.set_style(style); + } +} + +function getTweenOpts(opts) { + let defaults = { + time: animationTime, + transition: 'easeInOutQuad' + }; + + return Utils.mergeObjects(opts || {}, defaults); +} diff --git a/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js new file mode 100644 index 0000000..904c7de --- /dev/null +++ b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/extension.js @@ -0,0 +1,52 @@ +/* exported init */ + +const Self = imports.misc.extensionUtils.getCurrentExtension() +const extensionUtils = imports.misc.extensionUtils + +class Extension { + constructor() { + this.available_mods = Self.imports.src.modsList.get() + } + + _refresh_mod(name) { + if (!this.available_mods[name]) return + + if (this.settings.get_boolean(name)) { // enable + if (this.mods[name]) return + + const mod = new this.available_mods[name]() + mod.enable() + this.mods[name] = mod + } else if (this.mods[name]) { //disable + this.mods[name].disable() + delete this.mods[name] + } + } + + enable() { + this.mods = {} + + this.settings = extensionUtils.getSettings() + + Object.keys(this.available_mods).forEach(name => { + this.settings.connect('changed::' + name, () => { + this._refresh_mod(name) + }); + this._refresh_mod(name) + }) + } + + disable() { + for (const key in this.mods) { + if (!this.mods.hasOwnProperty(key)) continue; + this.mods[key].disable() + } + + delete this.mods + delete this.settings + } +} + +function init() { + return new Extension(); +} diff --git a/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ar/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..a042c9cd295117a7e68c37bb593807fd28372dae GIT binary patch literal 873 zcmZ`$O=}ZD7#_7+SUnXH5ry&QWnzn$lHy6*60jH~iWd))-AOWcI-hE~l(|YiQXPP6c zV9$ioG77WQ%RgpML_<1{J>*6p^oVQ23W|ri%F!W-gylLf3sw+(`;4EZTzOl$t@TsE zmCUmDAPS8Lp|M+oo)J6dZmr5?xJLa7SD5Vn)4~Q@J*{)SN7S)`hJCtjlyoI*;5O{olXM+8xYCQ;c95!1 ms6B!Vh8&}=g?Z<%@K<9Vm_G}yLgxdNCMb89Kb)It1o1!3ZEUOn literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/en/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..5791425ab7644103241c6b4235ed81d625a36eae GIT binary patch literal 519 zcmZvYK}rKL6o#W#H|~m97Yf0J1u=&xxUk@&*b}5Pug;@sGUTP5R=kEQFW@cQ3f{q$ zd)My#ryXep17E&`N%HYn*A$$0^Y$9_ylL*8?-@ZN2wls z3D@@>d=4+*EBG0{fZyN_`~}yeu3L{iu)kU1v_hP0Y z7vorx8ltqWLYzoxGm@^}#LzS+ud4!6Dkzd>(ZRbVCfZz4HwdeT>#+SMtj1gh5MCgFbaW8{3L0@r~QxCFcfqI?9d0H1(( z{{^@Pd<8B8KY#@wIm6gIcoDn+bbuGoU!9%VKY#`F&)~=4pWwUT-Z{puf)BxXGOYu| z=70ezK4MDemZYOU?82!x#7slB zQM4yYWvMj#Vywo@lJmy?<($d<_0XE23+BjsrH4+`rf{NC&a;6vJCu9TE5viMP8r?i z$>6Ejrbb0gJd~br^+Y-^QY*EqBr>%5ebPI!R+{%Wwz^v>UoEJ)SCf|7i|oYKD(yO6 z>S2&W5-G`g8fm7td1;e=ufK7cc)7KdJTTf5Vx$LSx}xTwBz9oiE?$BrnAy(qw0C z4Ga~^^E<7j)^fs96Lw6nj?1!C`G_p9$ni!EH71Eu0b~LHC+y$k_2jrFz8j=2xT?7R ze)#@?OI+X(GO^m$)m?30%UjYRLsQH~-1 Vr-VKRkNHTCg>igroKpzy*e}k37>@t| literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/ja/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..0c2d2593dd146241df5a7d9cdba5902a61550203 GIT binary patch literal 918 zcma))QA<=o6vwBsg4>%|^iXggdzsCp7u(ecN<&auWQ$(Mz2okzcW0KFS#^7xdn1Ar zC5=cjOg9vzRdIuiK13fNdKtF0haP+H+`Ed21ReO@|2b#o%sB_{_s))&2<$v?1;_#y zfN3DIPrxN$4~X(#fy=-*pbPj7Tm_s{2z7#91MLFRz!1cl(+FJzT>`xcx(n)o{sQd< z9XW&0InY^9D2e9)K^;Jpj|`4tgOb?JMqlDjlB&Y0ASSUcR7#_qFkhhp^C(u7$Xo$2 zo|BX)`qw#D>@h`Rg31X-C-E4QbWBX)GAkoVl@{{Y#zLg>ARh zSa5qqm6V7_iWPoaRJ1R|c%oRo1!X*6A$f|kl$7FU+HuM)5@&dDxc{hYGSTha5nNLa zjjCm6s_B%zUiJy&X*X9O62|X)kR8B1NB5$E#;C;oJSRL@E#>x%GVNsiiX=WB5VE9F zE-%NS>Px2Gw%ga8b{^q-lvCN>CL^fFw0k4bok%*!hFdoLVuLLk?AdTJ_V=urPFhp5 z=9M+it=X{VNprc;oO@=?nhgRQe6-=R4QFgnv*D%`byInf~z9S`QUH zSfnR+L7~(t6^2@|1^X9x@edIHfSKvhyKi=dS|5Don>YC;FE9BuJhVzMP9hhO2675{ ziIlN}oJDq#^8XLy9P$%6gZxG=BF+&)hEXq}o=2*sVm@`0kkhD-QOo=(YU%6!%~RBJ zpYN!+q<;<+GK8Ec2N=f&LeSEWq}vwYq#(^j+0wv)IixrhvDivXAbuKhL<($~NZ z{4>vtcmhPtfSwUB%UVK1OU<#4=nxIYDt*Y@y==z3t-d>V9vN zUJp3LNp$VX%`nDZD!z(upkIaw4}mp+$Nlw#+@;gXnXFHaAJiVLj5xQHv>>sgj zmYx^s9xawPvfTx8*tEEr?WD9=?`7!%nHW3|_39qY(r&i>pF2;}Y-^9^pT87uUXkM2 T8r~$$KW^l&yC@&>cRlh4E6w&^ literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/nl/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..f6570305c7504e2462b202bfd727cd44f7cfac07 GIT binary patch literal 827 zcmY+By>1gh5XTn?Aeo8?AtXTBKtU)r5JC~z81a!9ED>RW2?&W|d^h$jzS}+R?Ab}4 zftHFVNI?&EDmoqj@fNg*|Ji|r(f#hfAG13%J3ki}J}TH*a0T?iIq(70_61x7UqQY8 z9b5uGzypHV3iZHFcx++`Qn4t!HL~B4gscRX`=)k9G78BSJYGwB(#*QS`z7!M@Ye!xP$ydh2;S zp|M7@1{_B0)HXYb9FARwJv0aljf~IL?ccMAsvhDu fyTPS@vzo2wqY&y5OOn~~fC6hGSCRYCbQ;>%Nwf%^flffLq1J3&Yh9oxIT58U!qddM@%8dWZ^yVM z=NH{Dx4FJt@O0i#PG^;Clow=jqzjoqc}D&4yGHLS^0!p5rB%^g(Scg=x7`iBL4h)% zAN&el_A+a$fxlVEl2Ku(3#-Om_p`>$YZDS*NQvwGz>gd`{K_%6IO2v>xW=o z%RXXS+?F#rvDf%(!-eaJs~qF9DMyZ!;EA~nYQ(qPl6|Rs=ZFzfLJs((EN4kD-lLwB ziSJMjIT2%1*|JIQ20z>4fA?_ye-AfFL)9eLQ#wz&u5shc&(1rx0e-Qw*X+5<4UB_n wiGRLrq)jCem?Vk*V=r9)zo$zSz@ns##lB$Abq7Pn*nd+FxoOug$IvEy0VugsQvd(} literal 0 HcmV?d00001 diff --git a/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo b/src/gnome-ui/gnome-extensions/gnome-ui-tune@itstime.tech/locale/sv/LC_MESSAGES/gnome-ui-tune@itstime.tech.mo new file mode 100644 index 0000000000000000000000000000000000000000..74449f3cd24bb26e692580033a32f720c358e6d9 GIT binary patch literal 867 zcmZ{i&2AGh6om~Gkiv?pLP&t*?%IV5Et@K75QzRziHZn?iVcf9GoFbXj~)3s(}q1e zw(tZIj}VphyZ{e?Snv+)Ig?UK7hLI^W8blJjwk-HxbR7!Zi4%u4{m{vps7=E2Ydxh z{~NdqzJn$33p@a=D?%(nSD?$F172YM?y3;Cp>saKU0S~u<@=fTfJB6wXRGvQ`;0ZS}%#C>IZUc31Qmu zz=wjIeCDEe%-+eZa^6{^^Ul+v#KG56Up~QhSB$C9s;{ZU&mHU^>|7YGuRUr#_bzG& zkI4vrQJ=(zBTL40WICXLLw4Wvch%;_x+Y7mgW7Sa&+q}-ax*dUuTxuc)q1P;wA0}% zanI|_MEMwI;?OWj3W<(9!Eqe1ER8c1Cm}I5(?QnLN;~Q5X^@$YGNC{+H_ov{`+O&f z?RsX9B-gWHUQcb*QPiJ@BzZ{IA(W&F<6x@9hm0>

      )O1h?IVemr}`cp)T9 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